logo资料库

pwm调试加减速.doc

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
用单片机控制直流电机的速度 直流调速器就是调节直流电动机速度的设备,上端和交流电源连接,下端和直流 电动机连接,直流调速器将交流电转化成两路输出直流电源,一路输入给直流电 机砺磁(定子),一路输入给直流电机电枢(转子),直流调速器通过控制电枢 直流电压来调节直流电动机转速。同时直流电动机给调速器一个反馈电流,调速 器根据反馈电流来判断直流电机的转速情况,必要时修正电枢电压输出,以此来 再次调节电机的转速。 直流电机的调速方案一般有下列 3 种方式:  1、改变电枢电压;  2、改变激磁绕组电压;  3、改变电枢回路电阻。 使用单片机来控制直流电机的变速,一般采用调节电枢电压的方式,通过单片机 控制 PWM1,PWM2,产生可变的脉冲,这样电机上的电压也为宽度可变的脉冲电压。 根据公式 U=aVCC 其中:U 为电枢电压;a 为脉冲的占空比(0
电动机的电枢电压受单片机输出脉冲控制,实现了利用脉冲宽度调制技术(PWM) 进行直流电机的变速。 因为在 H 桥电路中,只有 PWM1 与 PWM2 电平互为相反时电机才能驱动,也就是 PWM1 与 PWM2 同为高电平或同为低电平时,都不能工作,所以上图中的实际脉冲宽度为 B, 我们把 PWM 波的周期定为 1ms,占空比分 100 级可调(每级级差为 10%),这样 定时器 T0 每 0.01ms 产生一次定时中断,每 100 次后进入下一个 PWM 波的周期。 上图中,占空比是 60%,即输出脉冲的为 0.6ms,断开脉冲为 0.4ms,这样电枢 电压为 5*60%=3V。 我们讨论的是可以正转反转的,如果只按一个方向转,我们就只要把 PWM1 置为 高电平或低电平,只改变另一个 PWM2 电平的脉冲变化即可,,如下图(Q4 导通, Q3 闭合,电机只能顺时针调整转动速度)
C 语言代码: #include #define uchar unsigned char #define uint unsigned int sbit K5=P1^4; sbit K6=P1^5; sbit PWM1=P1^0; sbit PWM2=P1^1; sbit FMQ=P3^6; uchar ZKB1,ZKB2; void delaynms(uint aa) { uchar bb; while(aa--) { for(bb=0;bb<115;bb++) //1ms 基准延时程序
{ } ; } } void delay500us(void) { int j; for(j=0;j<57;j++) { ; } } void beep(void) { uchar t; for(t=0;t<100;t++) { delay500us(); FMQ=!FMQ; //产生脉冲 } FMQ=1; delaynms(300); //关闭蜂鸣器 } void main(void) { TR0=0; TMOD=0x01; TH0=(65526-100)/256; TL0=(65526-100)%256; EA=1; ET0=1; TR0=1; ZKB1=50; ZKB2=50; while(1) { if(!K5) { //关闭定时器 0 //定时器 0,工作方式 1 //开总中断 //开定时器 0 中断 //启动定时器 T0 //占空比初值设定 //占空比初值设定 //100us 即 0.01ms 中断一次
delaynms(15); if(!K5) { beep(); ZKB1++; //消抖 //确定按键按下 //增加 ZKB1 ZKB2=100-ZKB1; //相应的 ZKB2 就减少 } } if(!K6) { delaynms(15); if(!K6) { beep(); ZKB1--; //消抖 //确定按键按下 //减少 ZKB1 ZKB2=100-ZKB1; //相应的 ZKB2 增加 } } if(ZKB1>99) ZKB1=1; if(ZKB1<1) ZKB1=99; } } void time0(void) interrupt 1 { static uchar N=0; TH0=(65526-100)/256; TL0=(65526-100)%256; N++; if(N>100) N=0; if(N<=ZKB1) PWM1=0; else PWM1=1; if(N<=ZKB2) PWM2=0; else PWM2=1;
} //显现:电机转速到最高后,也就是 N 为 1 或 99 时,再按一下,就变到 99 或 1, //电机反方向旋转以最高速度 程序 / PWM 控制 DC 电机转速 // 晶振为 12M // 利用定时器控制产生占空比可变的 PWM 波 // 按 K1,PWM 值增加,则占空比增加,电机转快 // 按 K2,PWM 值减小,则占空比减小,电机转慢。 // 当 PWM 值增加到最大值(255)或减小到最小值(1)时,蜂鸣器将报警。 #include < reg52.h > sbit K1 =P1^0 ; //增加键 sbit K2 =P1^1 ; //减少键 sbit K3 =P1^2 ; //转向选择键 sbit PWMUOT =P3^0 ; //PWM 波输出 sbit turn_around =P3^1 ; //转向控制输出 //sbit BEEP =P3^2 ; //蜂鸣器 unsigned int PWM; void Beep(void); void delay(unsigned int n);
void main(void) { TMOD=0x11;//设置 T0、T1 为方式 1(16 位定时器) TH0=0 ; //65536us 延时常数(t=(65536-TH)/fosc/12) TL0=0; TH1=PWM ; //脉宽调节,高 8 位 TL1=0; EA=1; //开总中断 ET0=1; //开 T0 中断 ET1=1; //开 T1 中断 TR0=1 ; //T0 定时允许 while(1) { keyscan() ; } void timer0() interrupt 1 using 2// 定时器 0 中断服务程序. { TR1=0 ; //T1 禁止 TH0=0 ; //置 T0 定时常数 TL0=0 ; TH1=PWM ; //置 T1 定时常数 TL1=0; TR1=1 ; //T1 允许
PWMUOT=0 ; //PWM 波输出 0 } void timer1() interrupt 3 using 3 // 定时器 1 中断服务程序 { TR1=0 ; //T1 禁止 PWMUOT=1 ; //PWM 波输出 1 } /*void Beep(void) //蜂鸣器子程序 { unsigned char i; for (i=0;i<100;i++) { delay(100); BEEP=!BEEP; //Beep 取反 } BEEP=1; //关闭蜂鸣器*/ delay(100); } void delay(unsigned int n) // 延时子程序 {
分享到:
收藏