🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人方向学习者
❄️个人专栏:《工科必装软件安装教程》《嵌入式的开端 ---- 51单片机》
✨永远相信美好的事情即将发生
文章目录
- 前言
- 一、什么是PWM
- 二、PWM的频率与占空比
- 2.1 PWM的频率
- 2.2 占空比
- 三、呼吸灯控制
- 四、直流电机控制
- 4.1 简单正反转驱动
- 4.2 PWM速度控制
- 总结与每日励志
前言
PWM(脉冲宽度调制)是51单片机嵌入式开发中核心控制技术之一,广泛应用于LED调光、电机控速、开关电源等场景。本文从PWM基础概念入手,通俗解析频率与占空比两大核心参数,结合实操案例,先通过IO口模拟实现LED呼吸灯效果,再讲解定时器精准生成PWM、控制直流电机正反转与转速,层层递进,帮助初学者吃透PWM原理,掌握其实际应用技巧,夯实嵌入式控制基础。
一、什么是PWM
PWM是脉冲宽度调制的缩写,它是一种通过调整脉冲信号的高电平和低电平时间比例来控制电路输出的技术。简单来说,PWM是一种控制电子设备输出电压或电流的方法,它可以通过调整脉冲信号的宽度来控制输出信号的平均电压或电流,常应用于电机控速,开关电源等领域。
二、PWM的频率与占空比
在PWM波形中有两个重要的参数,分别是:频率、占空比;
2.1 PWM的频率
是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);
如果频率为1000Hz ,也就是说1秒内来回了1000次,那每次的时间就是1ms,那此信号一个周期就是1ms
2.2 占空比
是一个脉冲周期内,高电平的时间与整个周期时间的比例
注:调节占空比最终会反映到输出的电流、电压上,或者可以理解为输出的总能量变化,100%占空比时输出100%能量,50%占空比时,只会输出一半的能量,例如50%占空比控制LED会比较暗,控制电机力气会比较小。
三、呼吸灯控制
下面使用IO模拟的方式,实时修改占空比,控制LED的呼吸灯效果
#include <reg52.h>sbitled=P2^7;voidDelayus(intt)//@11.0592MHz{while(t--){unsignedchari;i=2;while(--i);}}voidmain(){inttime=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);}}}除了使用IO模拟的方式,我们也可以通过定时器功能,产生更加精确的PWM波形;设置定时器的溢出时间可以改变PWM的周期频率;设置比较值大小可以调节PWM的占空比;
四、直流电机控制
直流电机是指能将直流电能转换成机械能转动的设备。
直流电机的结构是由定子和转子组成。直流电机运动时,不动的部分称为定子,定子的主要作用是产生磁场。运行时转动的部分称为转子,其主要作用是产生电磁转矩和感应电动势。
直流电机没有正负之分,在两端加上直流电就能工作。交换电极可以改变电机旋转的方向;
51单片机作为一个开发板,起到的主要作用是控制,而直流电机作为一个较大功率的器件,当然不能通过51单片机的IO引脚进行驱动,需要使用一些驱动电路或者芯片进行驱动,板卡上用的是TC118S。
4.1 简单正反转驱动
#include <reg52.h>sbitdc_an2=P2^3;sbitdc_an1=P2^4;//带参延时函数voiddelay_ms(unsignedintxms)//@12MHz{unsignedinti,j;for(i=xms;i>0;i--){for(j=124;j>0;j--){}}}voidmain(){while(1){//正转2sdc_an2=0;dc_an1=1;delay_ms(2000);//停止2sdc_an2=0;dc_an1=0;delay_ms(2000);//反转2sdc_an2=1;dc_an1=0;delay_ms(2000);//停止2sdc_an2=0;dc_an1=0;delay_ms(2000);}}4.2 PWM速度控制
#include <reg52.h>//约1ms溢出#defineTIMS(65536-922)sbitdc_an2=P2^3;sbitdc_an1=P2^4;unsignedcharspeed,compare;//延时ms函数,参数用来改变延时的具体时间voiddelay_ms(unsignedintxms)//@12MHz{unsignedinti,j;for(i=xms;i>0;i--){for(j=124;j>0;j--){}}}voidmain(){TMOD=0x01;//配置定时器0为16位定时器,TH0、TL0全用TH0=TIMS>>8;//设置定时初值高8位TL0=TIMS;//设置定时初值低8位ET0=1;//开启定时器0中断EA=1;//开启全局中断TR0=1;//定时器0开始计数//初始化电机,停止运行dc_an1=0;dc_an2=0;while(1){compare=10;delay_ms(5000);compare=30;delay_ms(5000);compare=60;delay_ms(5000);compare=90;delay_ms(5000);}}//1ms触发执行一次voidTimer0()interrupt1{//每次产生中断后重新设置下次定时器初值 - 1毫秒产生1次中断TH0=TIMS>>8;TL0=TIMS;//当compare为10时,输出10ms高电平,90ms低电平//当compare为60时,输出60ms高电平,40ms低电平//当compare为90时,输出90ms高电平,10ms低电平speed++;//定时计数器的计数值,1ms加1speed%=100;//限制speed在0-100内if(speed<compare)//计数值与比较值进行比较{dc_an2=1;}else{dc_an2=0;}}总结与每日励志
✨本文完整覆盖PWM技术的核心知识点与实操应用,从概念解析到参数解读,再到呼吸灯、直流电机正反转及转速控制的代码实现,清晰呈现了PWM从理论到实践的全过程。嵌入式学习重在理解原理、勤练实操,每一次参数调试、每一次代码优化,都是成长的积累。✨ 不必急于求成,深耕每一个技术细节,循序渐进突破,你终将解锁更多嵌入式控制技能,在技术之路上稳步前行,不负每一份坚持与热爱!