点击这里找小助理0元领取:扫码进群领资料
一、PWM
PWM即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效的得到所须要的仿照参量。
说白了便是通过掌握高低电平的韶光,来对输出的波形进行掌握。

个中有几个主要的参数
频率:频率即是周期频率除以1占空比:高电平在全体周期内所占的韶光,即高电平和周期韶光的比值精度:占空比变革的步距二、产生PWM的方法
下方为江科大ppt教程ppt里的图,便是通过定时器定时自增,设置一个比较值,然后通过判断计数器和比较值的大小,输出对应的高低电平。
波形详解,就比如第一个周期内,小于比较值60的部分输出的是低电平,大于比较值60的部分输出高电平。两图的波形等效,PWM波形就这样产生了,掌握不同的高低电平存在的韶光,然后输出。
利用定时器产生一个恒定的周期
这里没有限定利用什么定时器,当利用多个定时器的时候,一定要把稳不同定时器中断和外部中断的优先级,由于如果不同定时器的中断优先级不相同,就有可能一个优先级较高的定时器中断冲破了当前定时器产生的中断。使当前中断失落效。下方为中断优先级以及利用C措辞编程利用到的中断号。
例程序定时器0产生恒定周期:
#include <REGX52.H>/ @brief 定时器0初始化 @param @retval /void Timer0Init() //100us 10ms 11.0592MHZ{TMOD&=0xF0; //高四位不变TMOD|=0x01; //设置定时器模式1 以及设置为定时办法 0TL0 = 0xA4;//设置定时初值TH0 = 0xFF;//设置定时初值TF0=0; //定时器0溢出标志位TR0=1; //定时器0运行掌握位TF0=1;//设置外部中断ET0=1;EA=1;PT0=0;}//中断函数/void Timer0_Rourine() interrupt 1{static unsigned int T0count;TL0 = 0xA4;//设置定时初值TH0 = 0xFF;//设置定时初值T0count++;if(T0count>=1000){T0count=0;P2_0=~P2_0;}}/
和比较值比较较大小,可以自己设置究竟是大于比较值,输出高电平还是低电平,同时小于比较值也同理。
void Timer0_Rourine() interrupt 1 //每隔100us进来一次{TL0 = 0xA4;//设置定时初值TH0 = 0xFF;//设置定时初值Counter++;if(Counter>=100){Counter=0;}if(Counter<Compare) //小于比较值 输出高电平{out1=1; //out代表输出高电平对应的管脚}else{out=0;}
三、实验利用PWM对直流电机调速
通过按键掌握直流电机的速率,使速率在数码管上显示,通过PWM调速主程序定时器0程序,和上方定时器0,程序相同
#include <REGX52.H>#include "Delay.h"#include "Key.h"#include "Timer0.h"#include "NixieTube.h"sbit motor=P1^0; //电机端口unsigned char Counter,Compare; //counter 0-100 指的是频率 comapre 指的是占空比 高电平时间 Compare 最大值为100usunsigned char KeyNum,Speed;void main(){Timer0Init();Compare=5;while(1){KeyNum=Key();if(KeyNum==1){Speed++;if(Speed>3){Speed=0;}if(Speed==0){Compare=0;} //compare 指的便是占空比 if(Speed==1){Compare=50;} //5%的占空比if(Speed==2){Compare=75;}if(Speed==3){Compare=100;}}NixieTube(8,Speed);}}void Timer0_Rourine() interrupt 1 //每隔100us进来一次{TL0 = 0xA4;//设置定时初值TH0 = 0xFF;//设置定时初值Counter++;if(Counter>=100){Counter=0;}if(Counter<Compare){motor=1;}else{motor=0;}}
直接上源程序啦在做智能小车的时候肯定大概率会用到,如果你利用PID算法算我没说。留个小坑,过段韶光会把做智能小车碰着问题如何办理的文章分享给大家。集成了红外循迹、红外避障、红外遥控功能这个模块可以直策应用
/小车PWM输出// @brief 小车PWM输出 装载PWM输出,如果设置全局变量pwm_left,pwm_right分别配置旁边输出高电平时间 @param 无 @retval 无 /void LoadPWM(void){ if(pwm_left > PWM_HIGH_MAX)pwm_left = PWM_HIGH_MAX;//如果左输出写入大于最大占空比数据,则逼迫为最大占空比。 if(pwm_left < PWM_HIGH_MIN)pwm_left = PWM_HIGH_MIN;//如果左输出写入小于最小占空比数据,则逼迫为最小占空比。 if(pwm_right > PWM_HIGH_MAX)pwm_right = PWM_HIGH_MAX;//如果右输出写入大于最大占空比数据,则逼迫为最大占空比。 if(pwm_right < PWM_HIGH_MIN)pwm_right = PWM_HIGH_MIN;//如果右输出写入小于最小占空比数据,则逼迫为最小占空比。 if(pwm_val_left<=pwm_left)Left_moto_pwm = 1; //装载左PWM输出高电平时间 else Left_moto_pwm = 0; //装载左PWM输出低电平时间 if(pwm_val_left>=PWM_DUTY)pwm_val_left = 0;//如果左比拟值大于即是最大占空比数据,则为零 if(pwm_val_right<=pwm_right)Right_moto_pwm = 1; //装载右PWM输出高电平时间 else Right_moto_pwm = 0; //装载右PWM输出低电平时间 if(pwm_val_right>=PWM_DUTY)pwm_val_right = 0;//如果右比拟值大于即是最大占空比数据,则为零}void Timer1_Routine() interrupt 3{ pwm_val_left++; pwm_val_right++; LoadPWM();//装载PWM输出}
总结
说白了,PWM便是设置一个恒定的周期内,通过设置计时数和设置的比较值的大小,是在计时数比比较值小置高低电平,则要依据自己的需求来进行设置。
这个PWM起初还不知道是啥,看了江科大第一遍视频没懂,第二遍懂了一点点,后面查看了好几个资料,摸着摸着不知道怎么就明白了个大概。
初始打仗是应为江科大的视频里,一步一步跟下来
再打仗是自己制作的智能小车的速率一贯慢不下来,以是利用PWM对小车的速率进行掌握
完全资料可进群免费领取!
!
!
嵌入式物联网的学习之路非常漫长,不少人由于学习路线不对或者学习内容不足专业而错失落高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击下方链接,0元领取学习资源,让你的学习之路更加顺畅!
记得点赞、关注、收藏、转发哦!