标题: 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://www.51hei.com/bbs/) Powered by Discuz! X3.1