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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32單片機PID調速程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:493513 發表于 2019-3-18 20:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
PID調速

單片機源程序如下:
  1. #include "adc.h"
  2. #include "common.h"
  3. #include "usart.h"
  4. #include "L298N.h"
  5. #include "senser.h"
  6. #include "NVIC.h"
  7. #include "ir1838.h"
  8. #include "DMA.h"

  9. #define kP 11
  10. #define kdI 200 //nI除數 kI=1/kdI
  11. #define kD 120
  12. #define kdPID 28//PID除數
  13. #define D_INTERVAL 1200
  14. #define I_INTERVAL 15

  15. #define ONLINE_MINVAL 25
  16. #define POSVAL_MAX SENSER_MAXVAL*2//位置量值域(-POSVAL_MAX,POSVAL_MAX)

  17. #define SPEED_MIN 1700
  18. #define SPEED_NORMAL 1950
  19. #define SPEED_MAX 2000

  20. #define CHECK_WAIT_TIMEOUT 100000

  21. extern u16 ADC_DataBuffer[ADC_DMA_BUFFER_LENGTH];
  22. extern u32 senVals[3];

  23. u16 mod=0;

  24. int main()
  25. {
  26.         s32 PID;

  27.         s32 nP=0;
  28.         s32 nI=0;
  29.         s32 nD=0;

  30.         s32 nLastP=0;
  31.        
  32.         u32 nDC=D_INTERVAL;
  33.         u32 nIC=I_INTERVAL;
  34.        
  35.         s32 carSpeed=SPEED_NORMAL;
  36.        
  37.         u32 checkWait=0;
  38.         u8 adjustMod=100;

  39.         common_init();
  40.         ADC_init();
  41.         #ifdef USART_ON
  42.                 usart_init();
  43.         #endif
  44.         L298N_init();
  45.         #ifdef IR_CTRL_
  46.                 IR1838_init();
  47.         #else
  48.                 //mod=1;
  49.         #endif
  50.         DMA_init();
  51.         NVIC_init();
  52.        
  53.         delayms(120);//等待DMA將 adc_buffer 填滿,避免senser校準值出錯(如果有0會導致minvs不正確)
  54.        
  55.         while (1)
  56.         {
  57.                 #ifdef IR_CTRL_
  58.                         Ircordpro();
  59.                 #endif

  60.                 switch (mod)
  61.                 {
  62.                 case 0:
  63.                         //等待車被放上跑道
  64.                         senVals[0]=ADC_DMA_getVal(0);
  65.                         senVals[1]=ADC_DMA_getVal(1);
  66.                         senVals[2]=ADC_DMA_getVal(2);
  67.                         #ifdef USART_ON
  68.                                 #define LSHIFTBIT        9
  69.                                 #define        SENVALGATE        9
  70.                         //printDebug("senVals[0]=",senVals[0]);
  71.                         //printDebug("senVals[1]=",senVals[1]);
  72.                         //printDebug("senVals[2]=",senVals[2]);
  73.                         //printDebug("-------------\n",0);
  74.                         if(senVals[2]>SENVALGATE)
  75.                         {
  76.                                 senVals[2]-=SENVALGATE;
  77.                         }
  78.                         else
  79.                         {
  80.                                 senVals[2]=0;
  81.                         }
  82.                         senVals[2]<<=LSHIFTBIT;
  83.                        
  84.                         L298N_setLS(senVals[2]);
  85.                         L298N_setRS(senVals[2]);
  86.                         //delayms(3000);
  87.                         continue;
  88.                         #endif
  89.                         if (senVals[0]>SENSER_ORIGIN_MIN&&senVals[0]>SENSER_ORIGIN_MIN&&senVals[0]>SENSER_ORIGIN_MIN)//車被提起
  90.                         {
  91.                                 checkWait=CHECK_WAIT_TIMEOUT;
  92.                                 adjustMod=100;
  93.                                 L298N_setLS(0);
  94.                                 L298N_setRS(0);
  95.                         }
  96.                         else
  97.                         {
  98.                                 if(adjustMod==100)
  99.                                 {
  100.                                         adjustMod=0;
  101.                                         Senser_reset();
  102.                                 }
  103.                         }
  104.                        
  105.                         switch (adjustMod)
  106.                         {
  107.                         case 0:
  108.                                 if (checkWait)
  109.                                 {
  110.                                         checkWait--;
  111.                                 }
  112.                                 else
  113.                                 {
  114.                                         adjustMod=1;
  115.                                         beep(900,300);
  116.                                 }
  117.                                 break;
  118.                         case 1:
  119.                                 //將左傳感器移動到線上
  120.                                 L298N_setLS(1400);
  121.                                 L298N_setRS(0);
  122.                                 if(senVals[0]>SENSER_ORIGIN_MIN)
  123.                                 {
  124.                                         adjustMod=2;
  125.                                 }
  126.                                 break;
  127.                         case 2:
  128.                                 //將左傳感器移動到線右邊
  129.                                 if(senVals[0]<SENSER_ORIGIN_MIN)
  130.                                 {
  131.                                         L298N_setLS(0);
  132.                                         L298N_setRS(0);
  133.                                         adjustMod=3;
  134.                                         beep(900,300);
  135.                                 }
  136.                                 break;
  137.                         case 3:
  138.                                 //左轉開始掃描,直到右傳感在線上
  139.                                 L298N_setLS(0);
  140.                                 L298N_setRS(1400);
  141.                                 if(senVals[2]>SENSER_ORIGIN_MIN)
  142.                                 {
  143.                                         adjustMod=4;
  144.                                 }
  145.                                 break;
  146.                         case 4:
  147.                                 //直到右傳感器移動到線左邊
  148.                                 if(senVals[2]<SENSER_ORIGIN_MIN)
  149.                                 {
  150.                                         adjustMod=5;
  151.                                         beep(900,300);
  152.                                 }
  153.                                 break;
  154.                         case 5:
  155.                                 //右轉直到中間傳感器在線上
  156.                                 L298N_setLS(1400);
  157.                                 L298N_setLS(0);
  158.                                 if(senVals[1]>SENSER_ORIGIN_MIN)
  159.                                 {
  160.                                         beep(800,300);
  161.                                         delayms(10);
  162.                                         beep(600,300);
  163.                                         delayms(10);
  164.                                         beep(600,300);
  165.                                         delayms(10);
  166.                                         beep(600,300);
  167.                                         mod=1;
  168.                                 }
  169.                         }
  170.                        
  171.                         if(adjustMod==3||adjustMod==4)
  172.                         {
  173.                                 //校正
  174.                                 Senser_getsv(0);
  175.                                 Senser_getsv(1);
  176.                                 Senser_getsv(2);
  177.                         }
  178.                 case 1:
  179.                         Senser_getsv(0);
  180.                         Senser_getsv(1);
  181.                         Senser_getsv(2);
  182.                        
  183.                         /* ------------P------------ */
  184.                         /* 計算位置 */
  185.                         if (senVals[1]>ONLINE_MINVAL)
  186.                         {
  187.                                 //線在中間傳感器下
  188.                                 if (carSpeed<SPEED_MAX)
  189.                                 {
  190.                                         //加速
  191.                                         carSpeed++;
  192.                                 }

  193.                                 if (senVals[0]>ONLINE_MINVAL)
  194.                                 {
  195.                                         //中間偏左
  196.                                         nP=POSVAL_MAX/2-senVals[1];
  197.                                 }
  198.                                 else
  199.                                 {
  200.                                         //中間偏右
  201.                                         nP=senVals[1]-POSVAL_MAX/2;
  202.                                 }
  203.                         }
  204.                         else if (senVals[0]>ONLINE_MINVAL)
  205.                         {
  206.                                 //線在左邊傳感器偏左
  207.                                 nP=POSVAL_MAX-senVals[0];
  208.                         }
  209.                         else if (senVals[2]>ONLINE_MINVAL)
  210.                         {
  211.                                 //線在右邊傳感器偏右
  212.                                 nP=senVals[2]-POSVAL_MAX;
  213.                         }
  214.                         else
  215.                         {
  216.                                 //線離開傳感器檢測范圍
  217.                                 if (carSpeed>SPEED_MIN)
  218.                                 {
  219.                                         //減速
  220.                                         carSpeed--;
  221.                                 }
  222.                                 if (nP<0)
  223.                                 {
  224.                                         nP=-POSVAL_MAX;
  225.                                 }
  226.                                 else
  227.                                 {
  228.                                         nP=POSVAL_MAX;
  229.                                 }
  230.                         }
  231.                         //nP/=4;
  232.                        
  233.                         /* ------------I------------ */
  234.                         if(nIC)
  235.                         {
  236.                                 nIC--;
  237.                         }
  238.                         else
  239.                         {
  240.                                 nIC=I_INTERVAL;
  241.                                
  242.                                 if(nP>ONLINE_MINVAL||nP<-ONLINE_MINVAL)
  243.                                 {
  244.                                         nI+=nP/20;//nI=9*nI/10;
  245.                                 }
  246.                                 else
  247.                                 {
  248.                                         nI=0;
  249.                                 }
  250.                         }
  251.                        
  252.                         /* ------------D------------ */
  253.                         if(nDC)
  254.                         {
  255.                                 nDC--;
  256.                         }
  257.                         else
  258.                         {
  259.                                 nDC=D_INTERVAL;
  260.                                
  261.                                 nD=nP-nLastP;
  262.                                 nLastP=nP;
  263.                         }
  264.                        
  265.                         /* PID */
  266.                         PID=nP*kP + nI/kdI + nD*kD;
  267.                         PID/=kdPID;
  268.                        
  269.                         L298N_setSpeed(carSpeed,PID);
  270.                        
  271.                         /*
  272.                         printDebug("nP=",nP*kP);
  273.                         printDebug("nI=",nI/kdI);
  274.                         printDebug("nD=",nD*kD);
  275.                         printDebug("PID=",PID);
  276.                         printChar('\n',USART2);
  277.                        
  278.                         printDebug("LS=",TIM4->CCR3);
  279.                         printDebug("RS=",TIM4->CCR4);
  280.                         printChar('\n',USART2);
  281.                        
  282.                         printDebug("senVals[0]=",senVals[0]);
  283.                         printDebug("senVals[1]=",senVals[1]);
  284.                         printDebug("senVals[2]=",senVals[2]);
  285.                         printChar('\n',USART2);
  286.                         //delayms(1000);
  287.                         // */

  288.                         break;
  289.                 case 3:
  290.                         L298N_setLS(0);
  291.                         L298N_setRS(0);
  292.                         break;
  293.                 }
  294. #ifdef DEBUG
  295.                 /*
  296.                                 printDebug("lsen=",senVals[0]);
  297.                                 printDebug("rsen=",senVals[1]);
  298.                                 printDebug("pid=",PID);
  299.                                 printChar('\n',USART2);
  300.                                 delayms(1000);
  301.                 */

  302.                 /*
  303.                                 L298N_setLS(800);
  304.                                 L298N_setRS(800);
  305.                                 ledp=!ledp;
  306.                                 delayms(2000);
  307.                 */
  308. #endif
  309.         }

  310.         //return 0;
  311. }
復制代碼

所有資料51hei提供下載:
PID調速.rar (116.53 KB, 下載次數: 36)



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

使用道具 舉報

沙發
ID:1 發表于 2019-3-19 18:26 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品video | 日本a在线| 成人av电影免费在线观看 | 91 久久| 国产资源一区二区三区 | 精品免费国产视频 | 黄色一级免费观看 | 日韩色视频 | 欧美视频二区 | 国产精久久久久久久 | 精品国产乱码久久久久久a丨 | 免费成人高清 | 成人在线h| 色站综合 | 国产成人精品一区二 | 亚洲一区二区三区在线播放 | 久久久久久综合 | 日本天天操 | 亚洲综合二区 | 欧美一级在线免费 | 一级黄色片在线看 | 欧美黑人国产人伦爽爽爽 | 亚洲精品日日夜夜 | 欧美jizzhd精品欧美巨大免费 | 久久久久久999 | 999在线精品| 国产精品美女久久久久久免费 | 高清亚洲| 9999国产精品欧美久久久久久 | 一级片毛片| 亚洲午夜视频 | 国产成人精品一区二区三区四区 | 我爱操 | 欧美性久久久 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 羞羞的视频在线观看 | 欧美日韩亚洲国产综合 | 午夜男人天堂 | 国产成年人小视频 | 免费一级片| 国产精品黄色 |