找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1102|回复: 2
收起左侧

请教stc系列单片机的pwm产生问题

[复制链接]
ID:608920 发表于 2019-11-18 19:26 | 显示全部楼层 |阅读模式
我想做一个pwm按键控制电机速度,然后程序中又有两个中断计算电机的转速,转速已经完成,但是控制电机的pwm一直没有波形,我想请各位帮我看看,是哪方面的问题,谢谢

  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uch unsigned char
  4. #define uin unsigned int

  5. uch code table[]="Duty Ratio:";
  6. uch code able[]="Rev:";
  7. uin count,countt,rad,f,t,g,s,q,w,m,b;
  8. //uin b;
  9. //uin PWM_T = 0;   //占空比控制变

  10. sbit rs=P1^2;
  11. sbit rw=P1^1;
  12. sbit en=P1^0;

  13. sbit down = P1^5;
  14. sbit up = P1^6;
  15. sbit fan=P1^4;

  16. void delay(uin time)
  17. {
  18.         uin i,j;
  19.         for(i=time;i>0;i--)
  20.                 for(j=110;j>0;j--);
  21. }

  22. void time0()
  23. {

  24.         TMOD=0x11;

  25.         TH0=0xdc;
  26.         TL0=0x00;
  27.         ET0=1;
  28.         TR0=1;

  29.         IT1=1;
  30.         EX1=1;
  31. //        EA=1;

  32.         TH1=(65536-100)/256;     //写入预置初值(取值1-255,数越大PWM频率越高)
  33.         TL1=(65536-100)%256;     //写入预置值 (取值1-255,数越大PWM频率越高)
  34.         ET1=1;                 //允许定时器0中断
  35.         TR1=1;       //启动定时器

  36.         EA=1;        //允许总中断

  37. }

  38. uch lcd_readbusy()
  39. {
  40.         uch temp;
  41.         rs=0;
  42.         rw=1;
  43.         _nop_();
  44.         P2=0xff;
  45.         _nop_();
  46.         en=1;
  47.         _nop_();
  48.         temp=P2;
  49.         _nop_();
  50.         en=0;
  51.         return(temp&0x80);
  52. }
  53. void write_com(uch com)
  54. {
  55.         while(lcd_readbusy());
  56.         rs=0;
  57.         rw=0;
  58.         P2=com;
  59.         delay(5);
  60.         en=1;
  61.         delay(10);
  62.         en=0;
  63. }
  64. void write_data(uch dat)
  65. {
  66.         while(lcd_readbusy());
  67.         rs=1;
  68.         rw=0;
  69.         P2=dat;
  70.         delay(5);
  71.         en=1;
  72.         delay(5);
  73.         en=0;
  74. }
  75. void display1()        {

  76.         countt=rad/3;
  77.         f=rad*10%10;
  78.         g=countt%10;
  79.         s=(countt/10)%10;
  80. //        b=(countt/100)%10;
  81. //        q=(countt/1000)%10;
  82. //        w=countt/10000;

  83. //        write_com(0xc0+5);
  84. //        write_data(w+0x30);  //万位
  85. //        write_com(0xc0+6);
  86. //        write_data(q+0x30); //千位
  87. //        write_com(0xc0+7);
  88. //        write_data(b+0x30);   //百位
  89.         write_com(0xc0+8);
  90.         write_data(s+0x30); //十位
  91.         write_com(0xc0+9);
  92.         write_data(g+0x30); //个位
  93.         write_com(0xc0+11);
  94.         write_data(f+0x30); //浮点位
  95. }
  96. void init()
  97. {        uin i=0;

  98.         write_com(0x38);
  99.         write_com(0x0c);
  100.         write_com(0x01);

  101.         write_com(0x80);
  102.                 for(i=0;i<11;i++)
  103.         {
  104.                 write_data(table[i]);
  105.         }
  106.         write_com(0x80+15);
  107.         write_data('%');
  108.        
  109.         write_com(0xc0);
  110.         for(i=0;i<4;i++)
  111.         {
  112.                 write_data(able[i]);
  113.         }

  114.         write_com(0xc0+10);
  115.         write_data('.');
  116.         write_com(0xc0+13);
  117.         write_data('R');
  118.         write_data('P');
  119.         write_data('S');        // 转每秒

  120. }
  121. void button()
  122. {
  123.          if(!up)
  124.                          {
  125.                                 if(m<=100)
  126.                                         {        m++;
  127. //                                          PWM_T++;
  128.                                         }
  129. //                               
  130. //                                delay(10);
  131.                         }
  132.                  if(!down)
  133.                          {
  134.                                 if(m>=1)
  135.                                         {          m-- ;
  136. //                                          PWM_T--;
  137.                                         }
  138. //                               
  139. //                                delay(10);
  140.                         }       
  141. }
  142. void main()
  143. {

  144.         count=0;
  145.         t=0;
  146.         b=0;
  147.         m=50;
  148.         init();
  149.         time0();
  150.         while(1)
  151.         {        display1();
  152.                 button();

  153. }
  154.   }
  155. writerdown_time1() interrupt 2
  156. {
  157.         count++;
  158. }
  159. taker_time2() interrupt 1
  160. {
  161.         t++;
  162.         TH0=0xdc;
  163.         TL0=0x00;
  164.         if(t==200)
  165.         {        rad=count/3;
  166. //                display1();
  167.                 count=0;
  168.                 t=0;
  169.         }
  170. }
  171. time3() interrupt 3
  172. {        TR1=0;
  173.         TH1=(65536-100)/256;
  174.         TL1=(65536-100)%256;
  175.                  b++;    //每次定时器溢出加1
  176.          if(b<m)   //PWM周期 100个单位
  177.                  {

  178.                           fan=1;  //输出端口
  179.                  }
  180.        
  181.                   else

  182.                  {  
  183.                          fan=0;        //  
  184.                  }
  185.                  if(b>100)b=1;
  186. }
复制代码




回复

使用道具 举报

ID:25310 发表于 2019-11-19 08:36 | 显示全部楼层
你这是用定时器做的PWM,比较耗资源,实时性强的程序都运行不了的。直接用硬件PWM不会消耗CPU资源的。
回复

使用道具 举报

ID:282850 发表于 2019-11-19 15:03 | 显示全部楼层
程序看上去没有问题,定时器是不耗资源的,当然直接用硬件PWM更爽。试试上电时:
fan=1;   
延时 500;
fan=0;
延时 500;
fan=1;  
延时 500;
fan=0;
用万用表测fan是否有高低电平。估计你要经过三极管、NMOS再输出PWM,会不会后级有问题。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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