直流电机PWM调速系统的设计及仿真.docx | 您所在的位置:网站首页 › 优化设计数学选修1-1电子版答案 › 直流电机PWM调速系统的设计及仿真.docx |
直流电机PWM调速系统的设计及仿真.docx 《直流电机PWM调速系统的设计及仿真.docx》由会员分享,可在线阅读,更多相关《直流电机PWM调速系统的设计及仿真.docx(18页珍藏版)》请在冰豆网上搜索。 直流电机PWM调速系统的设计及仿真
直流电机PWM调速系统的设计与仿真 一、引言 1本课题设计的目的和要求 1.直流电机PWM调速系统的目的: 〔1〕熟悉直流电机PWM调速系统的整体运行过程和总体布局 〔2〕掌握该硬件电路的设计方法 〔3〕掌握电机PWM调速系统程序的设计和调试 2.直流电机PWM调速系统的要求 〔1〕可输入0~1X围的占空比,占空比可用电位器输入、拨码开关输入或键盘输入。 〔2〕设计电机驱动电路,根据输入的占空比控制电机转速。 〔3〕检测电机转速,并用LED或LCD显示。 〔4〕在PROTUES下仿真。
二、系统总体框图与原理说明 2.1总体方案原理及设计框图 本设计是基于AT89c51为核心的直流调速器,由单片机控制和产生适合要求的PWM信号,该PWM信号通过驱动芯片电路进展直流调速,使输出电压平均值和功率可以按照PWM信号的占空比而变化,从而到达对直流电机调速的目的。 拨码开关输入0~1X围的占空比,用LCD1602作为主液晶显示器,显示输入的占空比控制电机转速,能够实现较好的人机交互。 总体方案设计框图
三、硬件电路图
3.1PWM产生方式 〔1〕PWM〔脉冲宽度调制〕是通过控制固定电压的直流电源开关频率,改变负载两端的电压,从而到达控制要求的一种电压调整方法。 PWM可以应用在很多方面,比方: 电机调速、温度控制、压力控制等等。 在PWM驱动控制的调整系统中,按一个固定的频率来接通和断开的电源,并且根据需要改变一个周期内“接通〞和“断开〞时间的长短。 通过改变直流电机电枢上电压的“占空比〞来到达改变平均电压大小的目的,从而来控制电动机的转速。 正因为如此,PWM又被称为“开关驱动装置〞。 PWM波形如下图: PWM波形图 设电机始终接通电路时,电机转速最大为 ,设占空比为: 那么电机的平均转速为 其中 指的是电机的平均速度, 是指电机在全通电时最大速度,D指的是占空比。 由上面的公式可见,当改变占空比D时,就可以得到不同电机平均速度 从而到达调速的目的。 〔2〕单片机片内软件生成PWM信号 PWM信号采用单片机定时中断的方式软件模拟产生,这样实现比拟容易,可以节约硬件本钱。 //===================定时器0初始化设置=================== //===================定时器0初始化设置=================== voidTime0_Init()//定时器0初始化函数 { TMOD=0x01;//定时器0为工作方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%256;//初始化为定时时间为50ms ET0=1;//开定时器0中断 TR0=1;//开定时器 EA=1;//开总开关 } //==================定时器0中断效劳程序=============== voidtimer0_server(void)interrupt3 { if(PWM_flag) { TH0=(65536-PWM_data*200)/256; TL0=(65536-PWM_data*200)%256; PWM=1; PWM_flag=~PWM_flag; } else { TH1=(45536+PWM_data*200)/256; TL1=(45536+PWM_data*200)%256;//初始化为定时时间为20ms PWM=0; PWM_flag=~PWM_flag; } 3.2拨码开关模块的设计 本设计输入用8位的拨码开关,能产生256数值,每一种数值对应于一个占空比的值,当输入为256时,最大的占空比为99%,能调节到最大的电机转速。
3.3显示模块的设计 本设计用LCD1602作为显示模块,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块,可以显示两行,提供各种控制命令,如: 清屏、字符闪烁、光标闪烁、显示移位等多种功能。
3.4直流电机驱动模块 本设计采用光电隔离器,光耦合器以光为媒介传输电信号。 它对输入、输出电信号有良好的隔离作用,然后把信号通过晶体管IRF640进展放大,驱动直流电机的驱动和调速。
3.3模拟直流电机测速模块 555定时器,构成简单的振荡电路,利用电阻和电容充放电原理,是输出端产生方波信号,即可模拟简单的脉冲,代替电机的测速,电机测速一般都是利用霍尔元件测出电机转了多少圈,电机转一圈,霍尔元件检测电机触发的脉冲,那么会输出响应的信号。 光电隔离主要用来处理控制局部和强电局部的信号,减少控制局部受强电的干扰。 起隔离作用。 四、程序流程图 五、仿真说明 〔1〕初始界面时,拨码开关没有设置PWM,直流电机处于停顿状态,LCD1602显示PWM为000% 在LCD上显示Motor_Speed为256,这就是在一定时间内低电平的数目。 由于INT0是属于低电平输入中断类型的,根据这个原理再通过计数器T1来记录INT0的中断次数即是转速。 〔2〕通过调节拨码开关的值,使占空比增大,从而使直流电机的转速变大。 六、心得体会 本设计通过仿真根本能实现对直流电机的调速和测速。 课程设计重点在于对单片机的应用与理解,引入了555芯片的使用与了解其作用,对掌握驱动直流电机的方法有一定得要求,通过这几天网上的一些相关资料的查阅,顺利的完成了这个课程设计,但在仿真过程中的一些细节问题上还有着纰漏,在电机的测速的模块的编程不够完美。 通过本次课程设计,加深了之前的单片机知识和相应仿真软件的使用。 拓宽了本人的知识面,拓展了视野和思维。 设计一个直流电机调速系统,无论从学习还是实践的角度上来说,对电气专业的大学生都会产生积极的作用,有利于提高学习热情。
参考文献: 1.单片机技术及系统设计周美娟清华大学 2.微型计算机控制技术实用教程潘新民王燕芳电子工业
附录 #include #include #include #include #include //========================== #defineucharunsignedchar #defineuintunsignedint //========================== #defineData_BusP1 sbitPWM=P3^0; bitPWM_flag=0; unsignedcharTime_flag=0; unsignedcharDSW_data=0x00; unsignedcharPWM_data=0; unsignedintSpeed_data=0; unsignedcharPWM_Precent[5]={0x30,0x30,'%'}; unsignedcharMotorSpeed[5]={0x30,0x30,0x30}; //-------------------------- //-------函数声明-------- voiddelay(uint); voiddelay_ms(unsignedintii);//1ms延时函数 voidget_PWM(void); voidget_Speed(void);
//====================延时子函数========================= voiddelay(uintz) { uintx,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }
voiddelay_ms(unsignedintii)//1ms延时函数 { unsignedinti,x; for(x=0;x { for(i=0;i } } //===================外部中断0初始化程序=============== voidInit_int0(void) { EX0=1;//开外部中断0 IT0=1;//触发 EA=1; } //==================外部中断0效劳程序=================== voidInt0_server(void)interrupt0 { EA=0; Speed_data++; EA=1; } //===================定时器0初始化设置=================== voidTime0_Init()//定时器0初始化函数 { TMOD=0x01;//定时器0为工作方式1 TH0=(65536-50000)/256; TL0=(65536-50000)%256;//初始化为定时时间为50ms ET0=1;//开定时器0中断 TR0=1;//开定时器 EA=1;//开总开关 } //==================定时器0中断效劳程序=============== voidTime0_Int()interrupt1//定时器0中断子函数 { TH0=(65536-50000)/256; TL0=(65536-50000)%256;//初始化为定时时间为50ms Time_flag++; if(Time_flag==20) { Time_flag=0; get_Speed(); } } //====================定时器1初始化设置===============计算方波数 voidinit_timer1(void) { TMOD|=0x10;//定时器1为工作方式116bit TH1=0xFF; TL1=0xFE; ET1=1;//开定时器1中断 TR1=1;//开定时器 EA=1;//开总开关 } //==================定时器1中断效劳程序=============== voidtimer1_server(void)interrupt3 { if(PWM_flag) { TH1=(65536-PWM_data*200)/256; TL1=(65536-PWM_data*200)%256; PWM=1; PWM_flag=~PWM_flag; } else { TH1=(45536+PWM_data*200)/256; TL1=(45536+PWM_data*200)%256;//初始化为定时时间为20ms PWM=0; PWM_flag=~PWM_flag; } } //==================get_PWM============================ voidget_PWM(void) { DSW_data=Data_Bus; if(DSW_data==0x00) { TR1=0; PWM=0; PWM_Precent[0]=0x30; PWM_Precent[1]=0x30; } else { PWM_data=DSW_data*100/256; PWM_Precent[0]=PWM_data/10+0x30; PWM_Precent[1]=PWM_data%10+0x30; TR1=1; } } //==================get_Speed============================ voidget_Speed(void) { MotorSpeed[0]=Speed_data/100+0x30; MotorSpeed[1]=Speed_data/10%10+0x30; MotorSpeed[2]=Speed_data%10+0x30; Speed_data=0; } //------主函数----------- voidmain() { PWM=0; get_PWM(); Init_int0(); Time0_Init(); init_timer1(); LCD_init();//LCD1602初始化 LCD_write_mand(0x01);//LCD清屏 delay_ms(10); DisplayChar(0,1,"PWM_Precent: "); DisplayChar(13,1,PWM_Precent); DisplayChar(0,0,"Motor_Speed: "); DisplayChar(13,0,MotorSpeed);
while (1) { get_PWM(); DisplayChar(13,1,PWM_Precent); DisplayChar(13,0,MotorSpeed); } } |
CopyRight 2018-2019 实验室设备网 版权所有 |