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

標題: STM32控制無刷直流電機BLDC速度環PID源碼 [打印本頁]

作者: tonyinspira    時間: 2018-3-13 08:55
標題: STM32控制無刷直流電機BLDC速度環PID源碼
用的是timer1高級定時器控制無刷直流電機
此程序只有轉速PID 速度通過程序Set_Point調節 調節范圍在100到12000之間
KEY2控制無刷電機啟動
KEY3控制無刷電機停止

電路原理圖如下:


單片機源程序如下:
pid.c
  1. /*====================================================================================================
  2.                                                 增量式PID
  3. The PID (比例、積分、微分) function is used in mainly
  4. control applications. PIDCalc performs one iteration of the PID
  5. algorithm.
  6. While the PID function works, main is just a dummy program showing
  7. a typical usage.
  8. =====================================================================================================*/
  9. #define Set_Point        1000         //100 10000
  10. #define PWM_Max                1400
  11. #define PWM_Min     50  
  12. typedef struct PID
  13. {
  14.         int Target;     //設定目標 Desired Value
  15.         int Uk;                        //Uk
  16.         int Udk;                //Udk增量
  17.         int Uk_1;                 //Uk-1
  18.         double P;                 //比例常數 Proportional Const
  19.         double I;                 //積分常數 Integral Const
  20.         int    b;
  21.         double D;                 //微分常數 Derivative Const
  22.         int ek_0;                //ek
  23.         int ek_1;                 //ek-1
  24.         int ek_2;                 //ek-2
  25. }PID;
  26. static PID Speed_PID;
  27. static PID *Speed_Point = &Speed_PID;
  28. /*====================================================================================================
  29. Initialize PID Structure PID參數初始化
  30. =====================================================================================================*/
  31. void Speed_PIDInit(void)
  32. {
  33.         Speed_Point->Target = Set_Point;
  34.         Speed_Point->Uk                = 0;
  35.         Speed_Point->Udk    = 0;
  36.         Speed_Point->Uk_1   = PWM_Min;
  37.         Speed_Point->ek_0         = 0;         //ek=0
  38.         Speed_Point->ek_1         = 0;         //ek-1=0
  39.         Speed_Point->ek_2         = 0;          //ek-2=0
  40.         Speed_Point->P                 = 4;  //比例常數 Proportional Const
  41.         Speed_Point->I                 = 0.084;          //積分常數Integral Const
  42.         Speed_Point->b      = 1;
  43.         Speed_Point->D                 = 1.8;          //微分常數 Derivative Const
  44. }
  45. /*====================================================================================================
  46. 增量式PID計算部分
  47. =====================================================================================================*/
  48. int Speed_PIDAdjust(int Next_Point)
  49. {
  50.         Speed_Point->ek_0= Speed_Point->Target - Next_Point;         //增量計算
  51.         /*遇限削弱積分即控制量Uk進入飽和區,便停止進行增大的積分項運算,而只進行使積分減少的運算*/
  52.         if(((Speed_Point->Uk_1>=PWM_Max)&&(Speed_Point->ek_0>=0))||((Speed_Point->Uk_1<=PWM_Min)&&(Speed_Point->ek_0<=0)))
  53.         {
  54.             Speed_Point->b=0;
  55.         }
  56.         else
  57.         {
  58.                 Speed_Point->b=1;
  59.         }
  60.         Speed_Point->Udk=Speed_Point->P*(Speed_Point->ek_0-Speed_Point->ek_1) + Speed_Point->b*Speed_Point->I*Speed_Point->ek_0
  61.                 + Speed_Point->D*(Speed_Point->ek_0-2*Speed_Point->ek_1+Speed_Point->ek_2);
  62.     /* 存儲誤差,用于下次計算 */
  63.         Speed_Point->Uk = Speed_Point->Uk_1 + Speed_Point->Udk;

  64.         Speed_Point->ek_2 =        Speed_Point->ek_1;
  65.         Speed_Point->ek_1 = Speed_Point->ek_0;
  66.         Speed_Point->Uk_1 = Speed_Point->Uk;
  67.     if(Speed_Point->Uk >= PWM_Max)
  68.         {
  69.                 return PWM_Max;
  70.         }
  71.         else if(Speed_Point->Uk <= PWM_Min)
  72.         {
  73.                 return PWM_Min;
  74.         }
  75.         return(Speed_Point->Uk);
  76. }
復制代碼

  1. #include "includes.h"
  2. /********************CoOS變量**********************/
  3. #define TASK_STK_SIZE         128

  4. #define TASK0_PRIO        2
  5. #define TASK1_PRIO  3

  6. OS_STK STK_TASK0[TASK_STK_SIZE];
  7. OS_STK STK_TASK1[TASK_STK_SIZE];


  8. void TASK0(void *param);
  9. void TASK1(void *param);

  10. /*************************************************/

  11. /*********************一般變量********************/
  12. extern uint32_t Speed_count;
  13. uint8_t USART_Flag = 0;

  14. /*************************************************/
  15. int main(void)
  16. {
  17.         /* 片內外設初始化 */        
  18.         Periph_Init();
  19.         
  20.         /* 操作系統初始化 */
  21.     CoInitOS();

  22.         CoCreateTask( TASK0, (void*)0, TASK0_PRIO, &STK_TASK0[TASK_STK_SIZE - 1], TASK_STK_SIZE);
  23.         CoCreateTask( TASK1, (void*)0, TASK1_PRIO, &STK_TASK1[TASK_STK_SIZE - 1], TASK_STK_SIZE);
  24.         CoStartOS();
  25.     while(1);
  26. }

  27. void TASK0(void *param)
  28. {
  29.   uint16_t data;
  30.   KEY_Init();
  31.   Speed_PIDInit();                        
  32.   for(;;)
  33.   {
  34.     if(KEY_Read(KEY1))
  35.         {
  36.                 CoTickDelay(5);
  37.                 if(KEY_Read(KEY1))
  38.                 {
  39.                    BLDC_Start();        
  40.                 }
  41.         }
  42.         if(KEY_Read(KEY2))
  43.         {
  44.                 CoTickDelay(5);
  45.                 if(KEY_Read(KEY2))
  46.                 {
  47.                    BLDC_Stop();
  48.                 }
  49.         }
  50.         if(USART_Flag)
  51.         {
  52.             data = 1000000/(6*Speed_count);
  53.                 USART_SendData( USART2, data);
  54.                 USART_Flag = 0;
  55.         }
  56.         CoTickDelay(5);
  57.   }                        
  58. }
  59. void TASK1(void *param)
  60. {        
  61.   for(;;)
  62.   {
  63.            LED_On();
  64.            CoTickDelay(200);
  65.            LED_Off();
  66.            CoTickDelay(200);
  67.   }
  68. }
復制代碼


所有資料51hei提供下載:
速度環PID.rar (390.88 KB, 下載次數: 575)



作者: 一沙鷗H    時間: 2018-5-25 13:43
代碼能不能用
作者: mick32    時間: 2018-5-26 04:45
Thank you for code list
作者: jsliuhu    時間: 2018-8-4 22:19
學習一下
作者: heron    時間: 2018-8-7 14:07
嗯,看一看,硬件電路OK。留個記號,有時間仔細看看
作者: robe    時間: 2018-10-13 14:41
先MARK一下,以備使用,謝謝樓主
作者: cgr2018    時間: 2018-11-5 09:37
看起來好像不錯,下載下來看看
作者: 會說話的石子    時間: 2018-11-17 10:27
樓主硬件上是怎么搭建的,可以傳授些經驗嗎?
作者: IN_MCY    時間: 2019-4-18 12:01
MARK看看
作者: uccms    時間: 2019-4-20 22:10
很好,很強大。
作者: liul8888    時間: 2019-4-22 14:30
MARK,驅動電路學習了!
作者: waronder    時間: 2019-9-10 23:23
很好,學習一下看看怎么閉環。
作者: mcu_mpu    時間: 2019-9-18 14:31
學習高手。
作者: waronder    時間: 2019-9-21 17:29
不錯哦,學習中。
作者: mxper    時間: 2019-12-21 08:32
看起來好像不錯,下載下來看看
作者: wakss    時間: 2020-6-20 14:39
學習前輩的經驗
作者: waterbaby2011    時間: 2020-8-25 17:22
電路保護是怎么處理的,采樣看不出來
作者: cjp88811283    時間: 2020-9-28 09:28
不錯的代碼,學到了,謝謝
作者: lanxichang    時間: 2020-11-11 16:45
代碼能用,想知道τ 寶能買到實體嗎? 給個鏈接
作者: vow2rich    時間: 2021-3-17 23:37
非常好的教程
作者: liesnake    時間: 2021-7-16 20:36
看了一下應該是單電阻采樣,如果能三電阻采樣就好了。
作者: leech42    時間: 2022-7-1 18:00
學習一下,對P、I、D三個參數的校定有好的方法不
作者: 南山    時間: 2022-7-26 10:52
這個應該是有霍爾傳感器的控制代碼吧,如果沒有霍爾的話,有沒有控制code




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产精品6 | 成人欧美在线 | 91精品国产综合久久久久久 | 久久精品久久精品 | 国产香蕉av | 日本在线| 四虎影视av | 日本在线免费视频 | 欧美69式性猛交 | 亚洲高清视频在线观看 | 久久久久免费 | 亚洲精品一区二区三区在线 | 91久久久精品 | 黄色小视频在线观看 | 久草成人| 一区二区三区在线观看视频 | 中文有码在线 | 日韩精品免费在线观看 | 中文字幕亚洲综合 | 国产日韩欧美一区二区 | 一级片免费网站 | 免费看片网站91 | 97在线观看免费视频 | 国产精品一二三 | 美丽的姑娘观看在线播放 | 日韩久久一区 | 伊人网在线播放 | 国产在线成人 | 国产二区精品 | 欧美a一级| 亚洲午夜精品一区二区三区 | 国产一级特黄aaa大片 | 精品欧美一区二区精品久久 | 特级黄色大片 | 国产精品入口夜色视频大尺度 | 日韩国产中文字幕 | 国产va在线观看 | 午夜影院免费观看 | 黄色aaa | 中文在线视频 | 日韩欧美国产高清91 |