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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6473|回復(fù): 15
收起左側(cè)

基于51單片機(jī)PID算法控制直流電機(jī)轉(zhuǎn)速且數(shù)碼管顯示實(shí)際轉(zhuǎn)速與設(shè)定速度的項(xiàng)目工程

  [復(fù)制鏈接]
ID:171036 發(fā)表于 2020-5-3 15:29 | 顯示全部樓層 |閱讀模式
本帖最后由 51黑電子會(huì)員 于 2020-5-5 10:00 編輯
  1. #include<reg52.h>
  2. #include<stdio.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar code Duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共陰極數(shù)碼管0-9段碼表,高電平導(dǎo)通數(shù)碼管段顯示,低電平導(dǎo)通數(shù)碼管位顯示。
  6. uchar Data_Buffer[8]={0,0,0,0,0,0,0,0};//聲明數(shù)據(jù)緩存變量
  7. sbit PWM_FC=P1^0;//位定義脈沖寬度輸入端口
  8. sbit AddSpeed=P1^1;//位定義加速按鍵端口
  9. sbit SubSpeed=P1^2;//位定義減速按鍵端口
  10. sbit qiting=P1^3;//位定義啟停按鍵端口
  11. sbit led0=P1^4;//位定義啟停led指示燈
  12. sbit IN1=P3^4;//L298輸入端1
  13. sbit IN2=P3^5;//L298輸入端2
  14. uchar qitingnum;//聲明啟停次數(shù)變量
  15. int e ,e1 ,e2 ;//聲明當(dāng)前偏差值變量、之后偏差值變量、再后偏差值變量
  16. int out=0;//PID調(diào)節(jié)后輸出偏差值變量
  17. uint SetSpeed=0;//聲明設(shè)定速度變量
  18. uint ActualSpeed=0;//聲明實(shí)際速度變量
  19. uint cnt=0;//定時(shí)器1中斷次數(shù)變量
  20. uint Inpluse=0;//聲明脈沖計(jì)數(shù)變量、
  21. uint PWMTime=100;//聲明脈沖寬度時(shí)間變量
  22. float uk ,uk1 ,duk ;//聲明目前總偏差值變量、之后偏差值總變量、偏差值總變量
  23. float Kp=0.36,Ki=0.05,Kd=0.016;//聲明比例系數(shù)、積分系數(shù)、微分系數(shù)
  24. void PIDControl();//PID控制函數(shù)
  25. void SystemInit();//系統(tǒng)初始化函數(shù)
  26. void delay(uchar x);//延時(shí)函數(shù)
  27. void PWMOUT();//脈沖寬度輸出函數(shù)
  28. void SpeedSet();//設(shè)定速度函數(shù)
  29. void SegRefre();//數(shù)碼管顯示刷新函數(shù)
  30. /**************主函數(shù)************/
  31.   void main()
  32. {
  33.    SystemInit();//系統(tǒng)初始化函數(shù)
  34.    while(1)
  35. {
  36.     SpeedSet();//設(shè)定速度函數(shù)
  37.     SegRefre();//數(shù)碼管顯示刷新函數(shù)
  38.     PWMOUT();//脈沖寬度輸出函數(shù)
  39.    }
  40. }
  41.   void delay(uchar x)//延時(shí)函數(shù)
  42. {
  43.    uint i,j;
  44.    for(i=x;i>0;i--)
  45.     for(j=50;j>0;j--);
  46.   }
  47.   void PIDControl()//PID控制函數(shù)
  48. {
  49.    e=SetSpeed-ActualSpeed;//計(jì)算當(dāng)前偏差值變量
  50.    duk=(Kp*(e-e1)+Ki*e+Kd*(e-2*e1+e2));//PID連續(xù)系統(tǒng)離散化增量型PID算法,算出總偏差值變量。
  51.    uk=duk+uk1;//計(jì)算偏差值總變量加上之后偏差值總變量之和賦給目前總偏差值變量
  52.    out=(int)uk;//強(qiáng)制類型轉(zhuǎn)化為整數(shù)型的目前總偏差值變量賦給PID調(diào)節(jié)后輸出偏差值變量
  53.    if(out>100)//判斷PID調(diào)節(jié)后輸出偏差值變量是否大于100
  54. {
  55.     out=100;//PID調(diào)節(jié)后輸出偏差值變量為100
  56.    }
  57.    else if(out<0)//判斷PID調(diào)節(jié)后輸出偏差值變量是否小于0
  58. {
  59.     out=0;//PID調(diào)節(jié)后輸出偏差值變量為0
  60.   }
  61.    uk1=uk;//目前總偏差值變量賦給之后偏差值總變量
  62.    e2=e1;//之前偏差值變量賦給之后偏差值變量
  63.    e1=e;//當(dāng)前偏差值變量賦給之前偏差值變量
  64.    PWMTime=out;//PID調(diào)節(jié)后輸出偏差值變量賦給脈沖寬度時(shí)間變量
  65.   }
  66.   void PWMOUT()//脈沖寬度輸出函數(shù)
  67. {
  68.    if(cnt<PWMTime)//判斷定時(shí)器1中斷次數(shù)變量是否小于脈沖寬度時(shí)間變量
  69. {
  70.     PWM_FC=1;//脈沖寬度輸入端口輸出高電平
  71.    }
  72.    else
  73. {
  74.     PWM_FC=0;//脈沖寬度輸入端口輸出低電平
  75.    }
  76.    if(cnt>100)//判斷定時(shí)器1中斷次數(shù)變量是否大于100
  77.    cnt=0;//定時(shí)器1中斷次數(shù)變量歸0
  78. }
  79.   void SystemInit()//系統(tǒng)初始化函數(shù)
  80. {
  81.    TMOD=0X21;//定時(shí)器0方式1,定時(shí)器1方式2。  
  82.    TH0=0xf8;//初裝定時(shí)器0高八位寄存器定時(shí)數(shù)值
  83.    TL0=0x50 ;//初裝定時(shí)器0低八位寄存器定時(shí)數(shù)值,即2毫秒。
  84.    TH1=0xC0;//初裝定時(shí)器1高八位寄存器定時(shí)數(shù)值
  85.    TL1=0XC0;//初裝定時(shí)器1低八位寄存器定時(shí)數(shù)值,即16毫秒。
  86.    EA=1;//開(kāi)總中斷
  87.    EX0=1;//開(kāi)外部中斷0
  88.    IT0=1;//外部中斷0下降沿觸發(fā)
  89.    ET0=1;//開(kāi)定時(shí)器0中斷允許
  90.    ET1=1;//開(kāi)定時(shí)器1中斷允許
  91.    TR0=1;//開(kāi)定時(shí)器0中斷
  92.    TR1=1;//開(kāi)定時(shí)器1中斷
  93.    e =0;//偏差值變量為0
  94.    e1=0;//之后偏差值變量為0
  95.    e2=0;//再后偏差值變量為0
  96.    IN1=1;
  97.    IN2=1;
  98.   }
  99.   void SpeedSet()//設(shè)定速度函數(shù)
  100. {
  101.    if(qiting==0)
  102. {
  103.     delay(200);
  104.     if(qiting==0)
  105.   {
  106.      IN1=0;
  107.      IN2=1;
  108.      qitingnum++;
  109.      while(qiting==1);
  110.     }
  111.    }
  112.    if(qitingnum==1)
  113. {
  114.     led0=0;
  115.     if(AddSpeed==0)//判斷加速鍵是否按下
  116.   {
  117.      delay(200);//延時(shí)
  118.      if(AddSpeed==0)//再次判斷加速鍵是否按下
  119.    {
  120.       SetSpeed+=10;//設(shè)定速度變量每次加10
  121.       if(SetSpeed>3500)//判斷設(shè)定速度變量是否大于3500
  122.     {
  123.        SetSpeed=3500;//設(shè)定速度變量歸為3500
  124.       }
  125.      }
  126.     }
  127.     if(SubSpeed==0)//判斷減速鍵是否按下
  128.   {
  129.      delay(200);//延時(shí)
  130.      if(SubSpeed==0)//再次判斷減速鍵是否按下
  131.    {
  132.       SetSpeed-=10;//設(shè)定速度變量每次減10
  133.       if(SetSpeed<0)//判斷設(shè)定速度變量是否小于0
  134.       SetSpeed=0;//設(shè)定速度變量歸0
  135.      }
  136.     }
  137.    }
  138.    if(qitingnum==2)
  139. {
  140.     qitingnum=0;
  141.     IN1=1;
  142.     IN2=1;
  143.     led0=1;
  144.    }
  145.   }
  146.   void SegRefre()//數(shù)碼管顯示刷新函數(shù)
  147. {
  148.    Data_Buffer[0]=SetSpeed/1000;//設(shè)定速度變量千位數(shù)
  149.    Data_Buffer[1]=SetSpeed%1000/100;//設(shè)定速度變量百位數(shù)
  150.    Data_Buffer[2]=SetSpeed%100/10;//設(shè)定速度變量十位數(shù)
  151.    Data_Buffer[3]=SetSpeed%10;//設(shè)定速度變量個(gè)位數(shù)
  152.    Data_Buffer[4]=ActualSpeed/1000;//實(shí)際速度變量千位數(shù)
  153.    Data_Buffer[5]=ActualSpeed%1000/100;//實(shí)際速度變量百位數(shù)
  154.    Data_Buffer[6]=ActualSpeed%100/10;//實(shí)際速度變量十位數(shù)
  155.    Data_Buffer[7]=ActualSpeed%10;//實(shí)際速度變量個(gè)位數(shù)
  156.   }
  157.   void int0() interrupt 0//外部中斷0函數(shù)
  158. {
  159.    Inpluse++;//脈沖計(jì)數(shù)變量加加
  160. }
  161.   void Time0() interrupt 1//定時(shí)器0中斷服務(wù)函數(shù)
  162. {
  163.    static uchar Bit=0;//數(shù)碼管位碼靜態(tài)變量,退出程序,其數(shù)值保留。
  164.    static uint time=0;//轉(zhuǎn)速測(cè)量周期變量
  165.    TH0=0xf8;//重裝定時(shí)器0高八位寄存器計(jì)數(shù)值
  166.    TL0=0x50 ;//重裝定時(shí)器0低八位寄存器計(jì)數(shù)值,即2毫秒。
  167.    time++;//轉(zhuǎn)速測(cè)量周期變量加加
  168.    if(time>500)//判斷轉(zhuǎn)速測(cè)量周期變量是否大于500,等于500就是500x2毫秒=1000毫秒,也就是1s。
  169. {
  170.     time=0;//轉(zhuǎn)速測(cè)量周期變量歸0
  171.     ActualSpeed=Inpluse;//脈沖計(jì)數(shù)變量表示實(shí)際速度變量
  172.     Inpluse=0;//脈沖計(jì)數(shù)變量歸0
  173.     PIDControl();//PID控制函數(shù)
  174.    }
  175.    PWMOUT();//脈沖寬度輸出函數(shù)
  176.    Bit++;//數(shù)碼管位碼選擇位變量
  177.    if(Bit>8)//判斷數(shù)碼管位碼選擇位變量是否大于8
  178.    Bit=0;//數(shù)碼管位碼選擇位變量歸0
  179.    P0=0xff;//數(shù)碼管位碼顯示關(guān)閉
  180.    P2=Duan[Data_Buffer[Bit]];//數(shù)碼管段碼顯示
  181.    switch(Bit)//數(shù)碼管位碼變量選擇位
  182. {
  183.     case 0:
  184.            P0=0X7F;//實(shí)際速度變量千位
  185.            break;
  186.     case 1:
  187.            P0=0XBF;//實(shí)際速度變量百位
  188.            break;
  189.     case 2:
  190.            P0=0XDF;//實(shí)際速度變量十位
  191.            break;
  192.     case 3:
  193.            P0=0XEF;//實(shí)際速度變量個(gè)位
  194.            break;
  195.     case 4:
  196.            P0=0XF7;//設(shè)定速度變量千位
  197.            break;
  198.     case 5:
  199.            P0=0XFB;//設(shè)定速度變量百位
  200.            break;
  201.     case 6:
  202.            P0=0XFD;//設(shè)定速度變量十位
  203.            break;
  204.     case 7:
  205.            P0=0XFE;//設(shè)定速度變量個(gè)位
  206.            break;
  207.    }
  208. }
  209.   void Timer1() interrupt 3//定時(shí)器1中斷服務(wù)函數(shù)
  210. {
  211.    cnt++;//定時(shí)器1中斷次數(shù)變量
  212.   }
復(fù)制代碼
圖片110.png 圖片111.png
圖片112.png





評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:237239 發(fā)表于 2020-5-3 16:33 | 顯示全部樓層
哇~很強(qiáng),要是有設(shè)計(jì)說(shuō)明和完整工程文件就更好了
回復(fù)

使用道具 舉報(bào)

ID:573477 發(fā)表于 2020-5-7 17:14 | 顯示全部樓層
值得學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:703927 發(fā)表于 2020-5-10 08:47 | 顯示全部樓層
值得學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:744356 發(fā)表于 2020-5-10 10:07 | 顯示全部樓層
感覺(jué)很好用
回復(fù)

使用道具 舉報(bào)

ID:703927 發(fā)表于 2020-5-13 09:41 | 顯示全部樓層
感覺(jué)很好用
回復(fù)

使用道具 舉報(bào)

ID:703927 發(fā)表于 2020-5-14 08:17 | 顯示全部樓層

值得學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:703927 發(fā)表于 2020-5-15 09:11 | 顯示全部樓層
值得學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:618434 發(fā)表于 2020-5-17 22:22 | 顯示全部樓層
值得學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:762850 發(fā)表于 2020-5-30 14:46 | 顯示全部樓層
能把仿真和程序都?jí)嚎s發(fā)出來(lái)嗎,謝謝了
回復(fù)

使用道具 舉報(bào)

ID:302325 發(fā)表于 2020-6-1 01:48 | 顯示全部樓層
值得學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:835142 發(fā)表于 2021-2-13 01:20 來(lái)自觸屏版 | 顯示全部樓層
值得初學(xué)者pid學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:684871 發(fā)表于 2021-3-7 20:38 來(lái)自觸屏版 | 顯示全部樓層
1.電機(jī)轉(zhuǎn)速的傳遞函數(shù)怎么寫(xiě)?
回復(fù)

使用道具 舉報(bào)

ID:684871 發(fā)表于 2021-3-7 20:38 來(lái)自觸屏版 | 顯示全部樓層
2.為什么用脈沖數(shù)代表實(shí)際轉(zhuǎn)速,這樣不準(zhǔn)確吧?
回復(fù)

使用道具 舉報(bào)

ID:684871 發(fā)表于 2021-3-7 20:42 來(lái)自觸屏版 | 顯示全部樓層
傳遞函數(shù)怎么寫(xiě)?
回復(fù)

使用道具 舉報(bào)

ID:814885 發(fā)表于 2021-3-20 10:36 | 顯示全部樓層
PID 的各個(gè)參數(shù) 怎么設(shè)定的?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品欧美一区二区三区久久久小说 | 久草在线 | 久久国产精品72免费观看 | 亚洲国产高清在线观看 | 亚洲人在线播放 | 久久久久国产一区二区三区 | 亚洲精品视频播放 | 亚洲一区二区在线播放 | 久久久精品在线 | 免费一级淫片aaa片毛片a级 | 午夜精品久久久 | 九色.com | 久草网址| 999久久久| 狠狠操网站 | 超碰婷婷 | 免费黄色录像片 | 国产视频久久久 | 在线看日韩av | 伊人中文字幕 | 欧产日产国产精品99 | 91免费观看 | 91精品国产一二三 | 欧美一区二区三区在线观看 | 毛片av免费在线观看 | 精品久久香蕉国产线看观看亚洲 | 亚洲精品美女视频 | 精品国产一级 | 久久99久久99久久 | www.亚洲视频.com | 毛片大全| 亚洲精品久久久久国产 | 国产成人精品一区二区三区 | www.亚洲一区 | 午夜久久久 | 精品国产乱码久久久久久果冻传媒 | 狠狠av| 中国黄色毛片视频 | 欧美黄色免费网站 | 成人在线一区二区三区 | 久久婷婷国产麻豆91 |