欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1674|回復: 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. }
復制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表