久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3486|回復: 0
收起左側

單片機+H橋控制直流電機調速程序+Proteus仿真電路

[復制鏈接]
ID:568482 發表于 2020-5-20 15:35 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
Snipaste_2020-05-20_15-31-22.png

單片機源程序如下:
  1. #include <reg51.h>
  2. #include "lcd1602.h"

  3. #define THC0 0xf9
  4. #define TLC0 0x0f        //

  5. /***********端口定義**************/
  6. //按鍵
  7. sbit StopAndStart        =P0^0;
  8. sbit KeyTurnForward =P0^1;
  9. sbit KeyTurnBackward=P0^2;
  10. sbit KeyAddSpeed        =P0^3;
  11. sbit KeySubSpeed        =P0^4;

  12. //電機
  13. sbit CONT1=P2^3;
  14. sbit CONT2=P2^4;
  15. sbit EN   =P2^5;

  16. //
  17. sbit LED1 = P2^0;
  18. sbit LED2 = P2^1;
  19. sbit LED3 = P2^2;




  20. /*^^^^^^^^轉態變量^^^^^^^^^^*/
  21. unsigned char motoEn;
  22. unsigned char motoDirection;


  23. /***********變量定義**************/
  24. unsigned int SpeedSet = 100;        //速度設置
  25. unsigned int Impluse = 0;                //脈沖計數
  26. unsigned int num = 0;                        //速度顯示
  27. unsigned int cnt = 0;
  28. unsigned int PWMTime=500;                //脈沖寬度


  29. int e,e1,e2;
  30. float uk,uk1,duk;        //PID輸出值
  31. float Kp=15,Ki=12,Kd=1.6;
  32. int out=0;


  33. /*^^^^^^^^延時函數^^^^^^^^^^*/
  34. void delay_xms(unsigned char ms)
  35. {
  36.         unsigned int i,j;
  37.         for(i=0;i<ms;i++)
  38.         {
  39.                 for(j=0;j<333;j++);        
  40.         }
  41. }


  42. /*########系統初始化########*/
  43. void SystemInit()
  44. {

  45.         //外部中斷0        
  46.         IT0 = 1;  //下降沿觸發
  47.         EX0 = 1;  //開外部中斷
  48.         EA  = 1;          //開總中斷

  49.         //定時器0 1
  50.         ET0=1;          //開定時器中斷
  51.         TMOD=0X21;//T0方式2 T1方式2        
  52.         TH0 = THC0;
  53.         TL0 = TLC0;
  54.         TR0 = 1;  //啟動定時器0

  55.         TH1=0x10;
  56.         TL1=0x10;
  57.         ET1=1;
  58.         TR1=1;

  59.         e  = 0;
  60.         e1 = 0;
  61.         e2 = 0;

  62.         motoEn=0;
  63.         motoDirection=1;
  64.         //LCD
  65.         LCD1602_Init();
  66.         
  67. }

  68. /*########按鍵掃描##########*/
  69. void key_scan()
  70. {        
  71.         //啟/停
  72.         if(StopAndStart == 0)                  //判斷按下
  73.         {
  74.                 delay_xms(10);
  75.                 if(StopAndStart == 0)
  76.                 {
  77.                         
  78.                         while(StopAndStart == 0 ); //判斷松手
  79.                         //執行按鍵功能
  80.                         motoEn=~motoEn;

  81.                         //EN=1;
  82.                 }
  83.         }
  84.         
  85.         //正轉
  86.         if(KeyTurnForward == 0)                  //判斷按下
  87.         {
  88.                 delay_xms(10);
  89.                 if(KeyTurnForward == 0)
  90.                 {
  91.                         
  92.                         while(KeyTurnForward == 0 ); //判斷松手
  93.                         //執行按鍵功能
  94.                         motoDirection=1;
  95.                         //CONT1 = 1;
  96.                         //CONT2 = 0;
  97.                 }
  98.         }

  99.         //反轉
  100.         if(KeyTurnBackward == 0)                  //判斷按下
  101.         {
  102.                 delay_xms(10);
  103.                 if(KeyTurnBackward == 0)
  104.                 {
  105.                         while(KeyTurnForward == 0 ); //判斷松手
  106.                         //執行按鍵功能
  107.                         motoDirection=0;
  108.                         //CONT1 = 0;
  109.                         //CONT2 = 1;                                
  110.                 }
  111.         }
  112.         
  113.         //加速
  114.         if(KeyAddSpeed == 0)
  115.         {
  116.                 delay_xms(10);
  117.                 if(KeyAddSpeed == 0)        //判斷按下
  118.                 {
  119.                         unsigned char i=0;
  120.                         while(KeyAddSpeed == 0 && i<255){delay_xms(1);i++;}        //判斷松手
  121.                         //執行按鍵功能
  122.                         SpeedSet += 5;
  123.                         if(SpeedSet>300)
  124.                         {
  125.                                 SpeedSet = 300;
  126.                         }               
  127.                 }
  128.         }

  129.         //減速
  130.         if(KeySubSpeed == 0)                  //判斷按下
  131.         {
  132.                 delay_xms(10);
  133.                 if(KeySubSpeed == 0)
  134.                 {
  135.                         unsigned char i=0;
  136.                         while(KeySubSpeed == 0 && i<255){delay_xms(1);i++;} //判斷松手
  137.                         //執行按鍵功能
  138.                         SpeedSet -= 5;
  139.                         if(SpeedSet<0)
  140.                         {
  141.                                 SpeedSet = 0;
  142.                         }               
  143.                 }
  144.         }


  145. }

  146. /*##########電機狀態動作###########*/
  147. void MotoControl()
  148. {
  149.         if(motoEn == 0)
  150.         {
  151.                 EN=0;
  152.                 CONT1=0;
  153.                 CONT2=0;
  154.                 LED1 = 1;
  155.         }
  156.         else
  157.         {
  158.                 EN=1;
  159.                 LED1 = 0;
  160.                 if(motoDirection == 1)
  161.                 {
  162.                         CONT1=1;
  163.                         CONT2=0;
  164.                         LED2 = 0;
  165.                         LED3 = 1;
  166.                 }
  167.                 else                                   
  168.                 {
  169.                         CONT1=0;
  170.                         CONT2=1;
  171.                         LED2 = 1;
  172.                         LED3 = 0;
  173.                 }
  174.         }
  175. }
  176. /*########LCD顯示###########*/
  177. void LCDDis()
  178. {
  179.         LCD1602_4num(0,8,num);
  180.         LCD1602_4num(1,8,SpeedSet);        
  181. }


  182. /*^^^^^^^^PWM 輸出^^^^^^^^^*/
  183. void PWMOUT()
  184. {
  185.         if(motoDirection == 1)
  186.         {
  187.                 if(cnt<PWMTime)
  188.                 {
  189.                         CONT1=1;
  190.                 }
  191.                 else
  192.                 {
  193.                         CONT1=0;
  194.                 }
  195.         }
  196.         else
  197.         {
  198.                 if(cnt<PWMTime)
  199.                 {
  200.                         CONT2=1;
  201.                 }
  202.                 else
  203.                 {
  204.                         CONT2=0;
  205.                 }               
  206.         }
  207.         if(cnt>1000) cnt = 0;
  208. }
  209. /*########PID調速############*/

  210. void PIDControl()        //pid偏差計算
  211. {
  212.         e=SpeedSet-num;
  213.         duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2))/50;
  214.         uk=uk1+duk;
  215.         out=(int)uk;
  216.         if(out>1000)
  217.         {
  218.                 out=1000;
  219.         }
  220.         else
  221.         if(out<0)
  222.         {
  223.                 out=0;
  224.         }
  225.         uk1=uk;          //變量值偏移位
  226.         e2=e1;
  227.         e1=e;
  228.         PWMTime=out;


  229. }
  230. /********************/
  231. void main()
  232. {
  233.         SystemInit();
  234.         while(1)
  235.         {
  236.                 key_scan();//按鍵掃描
  237.                 LCDDis();//LCD顯示
  238.                 MotoControl();//根據按鍵掃描出的結果做出響應
  239.                 PWMOUT();
  240.         
  241.         }
  242. }

  243. /*@@@@@@@@@@外部中斷0@@@@@@@@@@@@@@*/
  244. void inter0() interrupt 0
  245. {
  246.         Impluse++;        //采集外部脈沖數據
  247. }
  248. /*@@@@@@@@@@定時器中斷0@@@@@@@@@@@@@@*/
  249. void inter1() interrupt 1
  250. {
  251.         static unsigned int time=0;
  252.         TH0=THC0;
  253.         TL0=TLC0;

  254.         time++;        //轉速測量周期

  255.         if(time>100)
  256.         {
  257.                 time=0;
  258.                 num=Impluse*5;
  259.                 Impluse=0;
  260.                 PIDControl();
  261.         }
  262. }

  263. void inter3() interrupt 3
  264. {
  265.         cnt++;
  266.         if(motoDirection == 1)
  267.         {
  268.                 if(cnt<PWMTime)
  269.                 {
  270.                         CONT1=1;
  271.                 }
  272.                 else
  273.                 {
  274.                         CONT1=0;
  275.                 }
  276.         }
  277.         else
  278.         {
  279.                 if(cnt<PWMTime)
  280.                 {
  281.                         CONT2=1;
  282.                 }
  283.                 else
  284.                 {
  285.                         CONT2=0;
  286.                 }               
  287.         }
  288.         if(cnt>1000) cnt = 0;
  289. }
復制代碼

全部資料51hei下載地址:
直流調速.zip (94.76 KB, 下載次數: 149)
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天综合网永久 | 羞羞的视频免费看 | 亚洲三区视频 | 激情欧美一区二区三区中文字幕 | 亚洲成av人片在线观看 | 91黄色片免费看 | 久久久久久久久久久久91 | 亚洲视频在线观看一区二区三区 | 久久亚洲国产精品日日av夜夜 | 九九亚洲精品 | 看一级黄色毛片 | 国产精品欧美一区二区三区不卡 | 久久一及片 | 午夜男人的天堂 | 国产午夜高清 | 一级黄色淫片 | 精品网 | 国产一极毛片 | 日韩精品一区二区三区在线观看 | 精品久久久久久 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 久久久久久久久毛片 | 色香婷婷 | 亚洲毛片网站 | 99国产精品视频免费观看一公开 | 五月槐花香| 亚洲一一在线 | 亚洲电影专区 | 韩日免费视频 | 亚洲国产日韩欧美 | 伊人精品国产 | 精品成人免费一区二区在线播放 | 国产精品一卡 | 国产男女猛烈无遮掩视频免费网站 | 亚洲人成人一区二区在线观看 | 欧美一区二区三区视频在线观看 | 国产精品美女久久久久久久网站 | 91精品久久久久久久久99蜜臂 | 亚洲人久久 | 免费毛片网站 | 欧州一区二区 |