找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9917|回复: 2
打印 上一主题 下一主题
收起左侧

51单片机两种定时器方式输出pwm原理分析与代码实现

[复制链接]
跳转到指定楼层
楼主
51单片机除了一部分型号可以自带pwm波输出,其他型号只有用软件模拟输出。而其中一般用定时器中断的方式来设置。
第一种方式是用两个相同周期的定时器来产生。
先产生两个高低数字信号


两个定时器输出的信号值不一样,但其初相相同。若先产生高电平,则后面的输出全为低电平,同理相反。





如果这样的话只有两种输出结果,要么恒为1要么恒为0没有什么意义,而我们要实现占空比的话,只有控制其初相。




代码实现
  1. #include<reg52.h>
  2. sbit abc=P1^3;
  3. void ab(int);
  4. void yanchi(int);
  5. int ac=0;
  6. void main(){
  7. int a=0;
  8. abc=1;
  9. TMOD=0X22;//设置两个定时器的工作方式16位
  10. EA=1;
  11. while(1){
  12. yanchi(5);
  13. ab(a);
  14. a++;
  15. if(a==100)
  16. a=0;
  17. }

  18. }
  19. void ab(int a){//a为占空比,也就是上面两个定时器输出信号的时间差

  20. ET0=0;
  21. TR0=0;
  22. ET1=0;
  23. TR1=0;
  24. abc=1;
  25. TH0=(65536-1100)/256;
  26. TL0=(65536-1100)%256;
  27. TH1=(65536-a*11)/256;
  28. TL1=(65536-a*11)%256;
  29. ET0=1;
  30. TR0=1;
  31. ET1=1;
  32. TR1=1;
  33. }
  34. void T0TIME()interrupt 1
  35. {
  36. abc=1;
  37. TH0=(65536-1100)/256;
  38. TL0=(65536-1100)%256;
  39. }
  40. void T1TIME()interrupt 3
  41. {
  42. abc=0;
  43. TH1=(65536-1100)/256;
  44. TL1=(65536-1100)%256;
  45. }
  46. void yanchi(int a){
  47. int b,c;
  48. for(b=0;b<=a;b++)
  49. for(c=0;c<=110;c++);
  50. }
复制代码

第二种实现方法只用一个定时器来实现
用一个定时器产生一个确定周期的数字信号,在其中断程序中进行操作,下面以产生两路pwm信号来说明。
程序如下
  1. #include<reg52.h>
  2. sbit ja=P1^3;
  3. sbit ja1=P1^4;
  4. void pwmkz(int);
  5. void pwmkz1(int);
  6. void yanchi(int);
  7. int a=0,b=0;
  8. int c=0;
  9. void main(){
  10. int f=0;
  11. TMOD=0x22;
  12. TH0=(65536-11)/256;
  13. TL0=(65536-11)%256;
  14. EA=1;
  15. ET0=1;
  16. TR0=1;
  17. while(1){
  18. f+=5;
  19. if(f==100)
  20. f=0;
  21. pwmkz(f);
  22. yanchi(15);
  23. //pwmkz1(100);

  24. }

  25. }
  26. void pwmkz(int d){
  27. a=d;
  28. }
  29. void pwmkz1(int e){
  30. b=e;
  31. }
  32. void pwmdin()interrupt 1
  33. {
  34.   c++;
  35. TH0=(65536-11)/256;//初值控制中断周期
  36. TL0=(65536-11)%256;//
  37. if(c==100)//100为控制输出信号的周期的常量 输出周期=中断周期*100(可以改变)
  38. c=0;
  39. if(c<a)//a为第一路的占空比
  40. ja=1;//控制电平
  41. else
  42. ja=0;
  43. if(c<b)//b为第二路占空比
  44. ja1=1;
  45. else
  46. ja1=0;
  47. }
  48. void yanchi(int a){
  49. int b,c;
  50. for(b=0;b<=a;b++)
  51. for(c=0;c<=110;c++);
  52. }
复制代码

捕获3.PNG (22.02 KB, 下载次数: 51)

捕获3.PNG

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:483579 发表于 2019-5-12 14:17 来自手机 | 只看该作者
谢谢分享。用两个定时器怎么输出占空比和频率可调的pwm波呢?加下q27568737747可以吗?
回复

使用道具 举报

板凳
ID:527981 发表于 2019-5-24 22:48 | 只看该作者
宁小小 发表于 2019-5-12 14:17
谢谢分享。用两个定时器怎么输出占空比和频率可调的pwm波呢?加下q27568737747可以吗?

上面的第二种方式就是两个同周期定时器,通过控制两定时器启动时间差来调节占空比,虽然说理论是这样,但是上面的代码总是不能输出正确的pwm波,这个问题我也是很疑惑,你想产生pwm波的话,还是建议采用一个定时器来输出。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表