欢迎来到天天文库
浏览记录
ID:21140148
大小:71.50 KB
页数:15页
时间:2018-10-19
《如何利用51单片机输出pwm波》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、如何利用51单片机输出PWM波1、理论知识2、程序及分析1、理论知识PWM这个功能在飞思卡尔、STM32等高档的单片机内部有专用的模块,用此类芯片实现PWM功能时只需要通过设置相应的寄存器就可实现周期和占空比的控制。但是如果要用51单片机的话,也是可以的,但是比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时
2、器T1的初值就可以改变占空比。下面重点介绍用一个定时器的实现PWM的方法。因为市面上的智能小车所采用的电机大多数为TT减速电机,通过复杂的实验此电机最佳的工作频率为1000HZ(太高容易发生哨叫,太低电机容易发生抖动),所以下面以周期为1ms(1000HZ)进行举例,要产生其它频率的PWM波,程序中只需作简单修改即可。用一个定时器时(如定时器T0),首先你要确定PWM的周期T和占空比D,确定了这些以后,你可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n'。因为这里我们是产生周期为1ms(1000
3、HZ)的PWM,所以可设置中断的时间基准为0.01ms,,然后中断100次即为1ms。在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:1、当time>=100时,time清零(此语句保证频率为1000HZ),2、当time>n时(n应该在0-100之间变化开),让单片相应的I/O口输出高电平,当time4、*******//*程序名:单片机输出固定频率的PWM波*//*晶振:11.00592MHzCPU型号:STC89C52*//*功能:P2^0口输出周期为1ms(1000HZ),占空比为%80的PWM波*//*****************************************************************/#include#defineuintunsignedint#defineucharunsignedcharsbitPWM1=P2^0;//接IN1控制正转sbitPWM2=P2^1;//接IN2控制反转uchartime;voidmain(5、){TMOD=0x01;//定时器0工作方式1TH0=0xff;//(65536-10)/256;//赋初值定时TL0=0xf7;//(65536-10)%256;//0.01msEA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0while(1){}}voiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=500;y>0;y--);}voidtim0()interrupt1{TR0=0;//赋初值时,关闭定时器TH0=0xff;//(65536-10)/256;//赋初值定时TL0=0xf7;//(65536-10)%256;6、//0.01msTR0=1;//打开定时器time++;if(time>=100)time=0;//1khzif(time<=20)PWM1=0;//点空比%80elsePWM1=1;PWM2=0;}程序说明:1、关于频率的确定:对于11.0592M晶振,PWM输出频率为1KHZ,此时设定时器0.01ms中断一次,时中断次数100次即为1KHZ(0.01ms*100=1ms,即为1000HZ)此时,定时器计数器赋初值为TH0=FF,TL0=F7。2、关于占空比的确定:此时我们将来time的值从0-100之间进行改变,就可以将占空比从%0-%100之间进行变化,上面程序中time<=20时PWM7、1=0;elsePWM1=1;意思就是%20的时间输出低电平,%80的时间输出高电平,即占空比为%80。如需得到其它占空比,如%60,只需将time的值改为40即可。(程序为if(time<=40)PWM1=0;elsePWM1=1;)当然编写程序时也可以定义一个标志位如flag,根据flag的状态决定输出高平还是低电平,假设定义flag=1的时候输出高电平,用一个变量去记录定时器中断的次数,每次
4、*******//*程序名:单片机输出固定频率的PWM波*//*晶振:11.00592MHzCPU型号:STC89C52*//*功能:P2^0口输出周期为1ms(1000HZ),占空比为%80的PWM波*//*****************************************************************/#include#defineuintunsignedint#defineucharunsignedcharsbitPWM1=P2^0;//接IN1控制正转sbitPWM2=P2^1;//接IN2控制反转uchartime;voidmain(
5、){TMOD=0x01;//定时器0工作方式1TH0=0xff;//(65536-10)/256;//赋初值定时TL0=0xf7;//(65536-10)%256;//0.01msEA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0while(1){}}voiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=500;y>0;y--);}voidtim0()interrupt1{TR0=0;//赋初值时,关闭定时器TH0=0xff;//(65536-10)/256;//赋初值定时TL0=0xf7;//(65536-10)%256;
6、//0.01msTR0=1;//打开定时器time++;if(time>=100)time=0;//1khzif(time<=20)PWM1=0;//点空比%80elsePWM1=1;PWM2=0;}程序说明:1、关于频率的确定:对于11.0592M晶振,PWM输出频率为1KHZ,此时设定时器0.01ms中断一次,时中断次数100次即为1KHZ(0.01ms*100=1ms,即为1000HZ)此时,定时器计数器赋初值为TH0=FF,TL0=F7。2、关于占空比的确定:此时我们将来time的值从0-100之间进行改变,就可以将占空比从%0-%100之间进行变化,上面程序中time<=20时PWM
7、1=0;elsePWM1=1;意思就是%20的时间输出低电平,%80的时间输出高电平,即占空比为%80。如需得到其它占空比,如%60,只需将time的值改为40即可。(程序为if(time<=40)PWM1=0;elsePWM1=1;)当然编写程序时也可以定义一个标志位如flag,根据flag的状态决定输出高平还是低电平,假设定义flag=1的时候输出高电平,用一个变量去记录定时器中断的次数,每次
此文档下载收益归作者所有