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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3621|回復: 2
打印 上一主題 下一主題
收起左側

51單片機PID三檔控制直流電機程序與Proteus仿真 數碼管顯示

[復制鏈接]
跳轉到指定樓層
樓主
可以三個擋位,輸出不同的轉速,同時采集轉速,進行PID運算
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <reg52.h>
  2. #include <stdio.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define THC0 0xf9
  6. #define TLC0 0x0f   //2ms
  7. //#define THC0 0xec
  8. //#define TLC0 0x78   //5ms
  9. #define SEG_DATA_PORT P0
  10. unsigned char  code Duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};//共陰極數碼管,0-9段碼表
  11. unsigned char  Data_Buffer[8]={1,0,0,0,0,0,0,0};                         //        顯示緩沖
  12. unsigned int displaytime=0,timing=90;

  13. uchar i=0;
  14. sbit LS138_A=P2^2;
  15. sbit LS138_B=P2^3;
  16. sbit LS138_C=P2^4;

  17. sbit AddSpeed=P3^1;  //一檔按鍵端口
  18. sbit SubSpeed=P3^0;  //二擋按鍵端口
  19. sbit TurnForward=P3^3; //三擋按鍵端口
  20. sbit TurnBackward=P3^4; //啟動或關閉按鍵端口
  21. //sbit Stop=P1^5;
  22. sbit buzzer = P1^3;

  23. sbit IN1=P1^1;
  24. sbit IN2=P1^2;
  25. sbit PWM_FC=P1^0;
  26. int e ,e1 ,e2 ;
  27. float uk ,uk1 ,duk ;//pid輸出值
  28. float Kp=15,Ki=12,Kd=1.6;
  29. int out=0;
  30. uint SpeedSet=100;
  31. uint cnt=0;
  32. uint Inpluse=0,num=0;//脈沖計數
  33. uint PWMTime=100;//脈沖寬度
  34. unsigned char  arry[];
  35. void SendString(uint ch);
  36. void PIDControl();
  37. void SystemInit();
  38. void delay(uchar x);
  39. void PWMOUT();
  40. void SetSpeed();
  41. void SegRefre();
  42. /**************主函數************/
  43. void main()
  44. {
  45.         SystemInit();
  46.         while(1)
  47.         {
  48.                 SetSpeed();                //按鍵設定速度
  49.                 SegRefre();                //數碼管顯示刷新
  50.                 PWMOUT();                //輸出PWM

  51.         }
  52. }

  53. void PIDControl()        //pid偏差計算
  54. {
  55.         e=SpeedSet-num;                 
  56.         duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2))/50;      
  57.         uk=uk1+duk;            
  58.         out=(int)uk;   //輸出為占空比
  59.         if(out>1000)
  60.         {
  61.                 out=1000;
  62.         }
  63.         else if(out<0)
  64.         {
  65.                 out=0;
  66.         }
  67.         uk1=uk;                                  //變量值移位
  68.         e2=e1;
  69.         e1=e;                                  
  70.         PWMTime=out;
  71. }

  72. void delay(uchar x)
  73. {
  74.         uint i,j;
  75.         for(i=x;i>0;i--)
  76.                 for(j=50;j>0;j--);
  77. }

  78. void PWMOUT()                  
  79. {
  80.         if(cnt<PWMTime)               
  81.         {
  82.                 PWM_FC=1;
  83.         }
  84.         else
  85.         {
  86.                 PWM_FC=0;
  87.         }
  88.         if(cnt>1000) cnt=0;         
  89. }
  90. void SystemInit()
  91. {
  92.         TMOD=0X21;     
  93.         TH0=THC0;
  94.         TL0=TLC0;
  95.         TH1=0xC0;
  96.         TL1=0XC0;
  97.         ET1=1;
  98.         ET0=1;
  99.         TR0=1;
  100.         TR1=1;
  101.         EX0=1;     
  102.         IT0=1;
  103.         EA=1;
  104.         e =0;               
  105.         e1=0;
  106.         e2=0;
  107.         IN1 = 0;
  108.         IN2 = 0;
  109. }
  110. void SetSpeed()
  111. {
  112.         if(AddSpeed==0&&IN2==1)
  113.         {
  114.                 delay(200);                          //消抖處理
  115.                 if(AddSpeed==0)
  116.                 {
  117.                         Data_Buffer[0]=1;//一檔
  118.                         SpeedSet=100;
  119.                         timing = 90;
  120.                         if(SpeedSet>1500)
  121.                         {
  122.                                 SpeedSet=1500;
  123.                         }
  124.                 }
  125.         }
  126.         if(SubSpeed==0&&IN2==1)
  127.         {
  128.                 delay(200);
  129.                 if(SubSpeed==0)
  130.                 {
  131.                         Data_Buffer[0]=2;//二檔
  132.                         SpeedSet=230;
  133.                         timing = 70;
  134.                         if(SpeedSet<0) SpeedSet=0;
  135.                 }
  136.         }
  137.         if(TurnForward==0&&IN2==1)
  138.         {
  139.                 delay(200);
  140.                 if(TurnForward==0)
  141.                 {
  142.                         Data_Buffer[0]=3;//三檔
  143.                         SpeedSet=380;
  144.                         timing = 50;
  145.                         if(SpeedSet<0) SpeedSet=0;
  146.                 }
  147.         }
  148.         if(TurnBackward==0)
  149.         {
  150.                 delay(200);
  151.                 if(TurnBackward==0)
  152.                 {
  153.                    IN1 = 0;
  154.                    IN2 = ~IN2;
  155.                          Data_Buffer[0]=1;//一檔
  156.                          SpeedSet=100;
  157.                          timing = 90;
  158.                    while(TurnBackward==0);
  159.                 }
  160.         }
  161. /*
  162.         if(Stop==0)
  163.         {
  164.                 delay(200);
  165.                 if(Stop==0)
  166.                 {
  167.                    IN1 = 1;
  168.                    IN2 = 1;
  169.                    while(Stop==0);
  170.                 }
  171.         }
  172. */
  173. }
  174. void SegRefre()                  //顯示刷新
  175. {
  176.          //Data_Buffer[0]=timing/1000;                  //分離設定值各位
  177.          if(IN2==1){
  178.                  Data_Buffer[1]=10;
  179.                  Data_Buffer[2]=timing/10;
  180.                  Data_Buffer[3]=timing%10;
  181.          }
  182.          else{
  183.                  Data_Buffer[0]=0;
  184.                  Data_Buffer[1]=10;
  185.                  Data_Buffer[2]=0;
  186.                  Data_Buffer[3]=0;
  187.          }
  188.          Data_Buffer[4]=num/1000;                         
  189.          Data_Buffer[5]=num%1000/100;
  190.          Data_Buffer[6]=num%100/10;
  191.          Data_Buffer[7]=num%10;
  192. }

  193. void int0() interrupt 0
  194. {
  195.         Inpluse++;                    //采集外部脈沖
  196. }
  197. void t0() interrupt 1
  198. {
  199.         static unsigned char Bit=0;
  200.         static unsigned int time=0;
  201.         TH0=THC0;
  202.         TL0=TLC0;


  203.         Bit++;
  204.         time++;  //轉速測量周期
  205. ……………………

  206. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

仿真代碼51hei附件下載:
直流電機PID控制.rar (102.48 KB, 下載次數: 117)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:342822 發表于 2021-11-19 00:16 來自手機 | 只看該作者
開機電源短路,是不是電機上編碼器接地錯誤
回復

使用道具 舉報

板凳
ID:102963 發表于 2021-11-19 09:39 | 只看該作者
倒計時時間,是什么用途呢?沒看懂!
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 三级成人在线 | 五月天综合网 | 97精品超碰一区二区三区 | 五月综合久久 | 亚洲国产精品一区二区三区 | 亚洲精品欧美一区二区三区 | 永久免费在线观看 | 欧美区日韩区 | 一区二区高清不卡 | 久久综合久久自在自线精品自 | 欧美黄 片免费观看 | 国产www. | 91精品国产日韩91久久久久久 | 日韩成人精品一区 | 中文字幕91| 国产精品一区二区福利视频 | 日本手机在线 | 国产日韩电影 | 北条麻妃一区二区三区在线视频 | 成人一区二区三区在线观看 | 伦理一区二区 | 亚洲福利电影网 | 天天综合日日夜夜 | av中文字幕在线观看 | 亚洲视频www| 久久av一区 | 亚洲精品中文字幕在线观看 | 亚洲九九精品 | 男人天堂网av | 日韩亚洲欧美一区 | 国产色网 | 免费观看一区二区三区毛片 | 新91 | 免费看淫片 | 天天插天天操 | 国产中文字幕在线 | 99tv成人影院| 99精品久久久 | 一区不卡在线观看 | 一级片视频免费 | 91黄在线观看 |