ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【嵌入式成长12】STC89C51 PWM脉冲宽度调制|IO模拟呼吸灯、TC118S直流电机调速、两相四线步进电机实战

【嵌入式成长12】STC89C51 PWM脉冲宽度调制|IO模拟呼吸灯、TC118S直流电机调速、两相四线步进电机实战 一、什么是PWMPWM全称脉冲宽度调制Pulse‑Width Modulation。单片机只能输出数字电平0或者1无法直接输出模拟电压。PWM通过快速切换高低电平改变高低电平的时间占比等效输出平均电压以此控制负载功率。典型应用场景LED亮度调节、直流电机调速、开关电源、舵机驱动。PWM两个核心参数PWM频率一秒钟完整脉冲循环次数。一个周期1/频率。例1000Hz周期就是1ms1秒重复1000次。占空比一个周期内高电平时间占整个周期总时间的百分比。0%占空比持续低电平输出功率025%占空比四分之一时间高电平50%占空比一半时间高电平75%占空比四分之三时间高电平100%占空比持续高电平满功率输出占空比越大等效平均电压越高LED越亮电机转速越快。二、实战1IO软件模拟PWM实现呼吸灯STC89C51没有硬件PWM外设可以用循环微秒延时模拟PWM不断修改一个周期内高低电平时间实现LED由暗到亮、由亮到暗的呼吸效果。硬件LED接P2.7低电平点亮。#include reg52.h sbit led P2^7; //微秒延时 11.0592MHz void Delayus(int t) { while(t--){ unsigned char i; i 2; while (--i); } } void main(void) { int time 0; led 0; while(1) { //由暗逐渐变亮 for(time 0;time 300;time ){ led 0; Delayus(time); led 1; Delayus(300 - time); } //由亮逐渐变暗 for(time 0;time 300;time ){ led 1; Delayus(time); led 0; Delayus(300 - time); } } }⚠️软件模拟PWM缺点全程占用CPU程序不能做别的任务。实际项目推荐定时器中断模拟PWM后台输出波形主循环可以处理其他业务。三、实战2直流电机控制TC118S驱动芯片单片机IO口输出电流很小绝对不能直接驱动直流电机电机启动、堵转电流很大会直接烧毁单片机IO。本开发板使用TC118S双H桥电机驱动芯片兼容L293D逻辑。硬件说明DC_AN1 → P2.4DC_AN2 → P2.3TC118S输入逻辑| DC_AN1(P2.4) | DC_AN2(P2.3) | 电机状态 || — | — | — || 1 | 0 | 正转 || 0 | 1 | 反转 || 0 | 0 | 停止 || 1 | 1 | 刹车制动 |示例1简单正反转循环#include reg52.h sbit dc_an2 P2^3; sbit dc_an1 P2^4; //毫秒延时函数 12MHz void delay_ms(unsigned int xms) { unsigned int i, j; for(ixms;i0;i--) { for(j124;j0;j--); } } void main(void) { while(1) { dc_an2 0; dc_an1 1; delay_ms(2000); //正转2s dc_an2 0; dc_an1 0; delay_ms(2000); //停止2s dc_an2 1; dc_an1 0; delay_ms(2000); //反转2s dc_an2 0; dc_an1 0; delay_ms(2000); //停止2s } }示例2定时器中断模拟PWM调速思路定时器0每1ms中断一次用变量speed做周期计数器compare作为比较阈值通过修改compare值改变占空比实现调速。晶振11.0592MHz1ms定时。#include reg52.h //1ms定时初值 #define TIMS (65536 - 922) sbit dc_an2 P2^3; sbit dc_an1 P2^4; unsigned char speed,compare; void delay_ms(unsigned int xms) { unsigned int i, j; for(ixms;i0;i--) { for(j124;j0;j--); } } void main(void) { TMOD 0x01; //T0模式116位定时器 TH0 TIMS 8; TL0 TIMS; ET0 1; //开启T0中断 EA 1; //全局总中断 TR0 1; //启动定时器0 dc_an1 0; dc_an2 0; while(1){ compare10; delay_ms(5000); //低速5秒 compare30; delay_ms(5000); //中速5秒 compare60; delay_ms(5000); //较快5秒 compare90; delay_ms(5000); //高速5秒 } } //1ms进入一次中断 void Timer0() interrupt 1 { TH0 TIMS 8; TL0 TIMS; speed; speed%100; //0~99循环PWM周期100ms if(speedcompare) { dc_an21; } else { dc_an20; } }说明本示例只演示单方向PWM调速需要正反转调速需要先控制方向引脚再输出PWM调速信号。四、拓展实战两相四线步进电机驱动步进电机给绕组依次通电电机就一步一步旋转可以精准控制旋转角度。下面为两相四线步进电机完整示例代码。#include reg52.h #include intrins.h //STC89C52扩展P4口寄存器标准reg52.h没有 sfr P4 0xE8; //引脚定义根据开发板原理图 sbit AN1_Pin P0^0; // AIN1 sbit AN2_Pin P4^2; // AIN2 sbit BN1_Pin P1^1; // BIN2 sbit BN2_Pin P1^0; // BIN1 /** * brief 步进电机运行函数 * param direction 0正转1反转 * param step 当前步数 */ void motor_run(int direction, int step) { if (direction 0) { //正转通电时序 switch(step % 4) { case 0: AN1_Pin1; AN2_Pin0; BN1_Pin1; BN2_Pin0; break; case 1: AN1_Pin0; AN2_Pin1; BN1_Pin0; BN2_Pin1; break; case 2: AN1_Pin0; AN2_Pin1; BN1_Pin1; BN2_Pin0; break; case 3: AN1_Pin1; AN2_Pin0; BN1_Pin0; BN2_Pin1; break; } } else { //反转通电时序 switch(step % 4) { case 0: AN1_Pin1; AN2_Pin0; BN1_Pin0; BN2_Pin1; break; case 1: AN1_Pin0; AN2_Pin1; BN1_Pin1; BN2_Pin0; break; case 2: AN1_Pin0; AN2_Pin1; BN1_Pin0; BN2_Pin1; break; case 3: AN1_Pin1; AN2_Pin0; BN1_Pin1; BN2_Pin0; break; } } } //10ms延时 void Delay10ms(void) { unsigned char i, j; i 18; j 235; do { while (--j); } while (--i); } //5秒延时 void Delay5000ms(void) { unsigned char i, j, k; _nop_(); i 36; j 5; k 211; do { do { while (--k); } while (--j); } while (--i); } //全部绕组断电电机停止 void motor_stop(void) { AN1_Pin 0; AN2_Pin 0; BN1_Pin 0; BN2_Pin 0; } void main(void) { int direction 0; //0正转1反转 int steps 500; //转动总步数 int i; while (1) { for (i 0; i steps; i) { motor_run(direction, i); Delay10ms(); } motor_stop(); Delay5000ms(); //停顿5秒 } }注意如果电机只抖动不旋转说明通电时序不对调换case内部的电平顺序即可适配你的硬件。五、开发踩坑总结STC89C51没有硬件PWM模块全部依靠软件或者定时器中断模拟PWM。单片机IO不能直接驱动直流电机必须H桥驱动芯片TC118S/L293D否则烧毁IO。软件延时模拟PWM会霸占CPU无法处理其他业务工程尽量使用定时器中断方式模拟PWM。PWM频率不能太低频率过低LED会肉眼看到闪烁电机出现抖动异响。步进电机只抖动不转优先检查时序顺序、供电电流是否足够。六、本章小结PWM脉冲宽度调制通过调节占空比等效模拟输出电压两大参数频率、占空比。IO软件模拟PWM实现呼吸灯简单但是占用CPU定时器中断模拟PWM是工程推荐写法。TC118S H桥芯片控制直流电机IO控制方向PWM调节转速。两相四线步进电机依次给绕组通电实现精准角度旋转注意通电时序适配硬件。
返回列表