找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17702|回复: 22
收起左侧

STM32控制无刷直流电机BLDC速度环PID源码

  [复制链接]
ID:287661 发表于 2018-3-13 08:55 | 显示全部楼层 |阅读模式
用的是timer1高级定时器控制无刷直流电机
此程序只有转速PID 速度通过程序Set_Point调节 调节范围在100到12000之间
KEY2控制无刷电机启动
KEY3控制无刷电机停止

电路原理图如下:
Capture.PNG

单片机源程序如下:
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. }
复制代码
0.png

所有资料51hei提供下载:
速度环PID.rar (390.88 KB, 下载次数: 560)
回复

使用道具 举报

ID:316065 发表于 2018-5-25 13:43 | 显示全部楼层
代码能不能用
回复

使用道具 举报

ID:228452 发表于 2018-5-26 04:45 | 显示全部楼层
Thank you for code list
回复

使用道具 举报

ID:382987 发表于 2018-8-4 22:19 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:229981 发表于 2018-8-7 14:07 | 显示全部楼层
嗯,看一看,硬件电路OK。留个记号,有时间仔细看看
回复

使用道具 举报

ID:407899 发表于 2018-10-13 14:41 | 显示全部楼层
先MARK一下,以备使用,谢谢楼主
回复

使用道具 举报

ID:340228 发表于 2018-11-5 09:37 | 显示全部楼层
看起来好像不错,下载下来看看
回复

使用道具 举报

ID:427504 发表于 2018-11-17 10:27 | 显示全部楼层
楼主硬件上是怎么搭建的,可以传授些经验吗?
回复

使用道具 举报

ID:317479 发表于 2019-4-18 12:01 | 显示全部楼层
MARK看看
回复

使用道具 举报

ID:423385 发表于 2019-4-20 22:10 | 显示全部楼层
很好,很强大。
回复

使用道具 举报

ID:518540 发表于 2019-4-22 14:30 | 显示全部楼层
MARK,驱动电路学习了!
回复

使用道具 举报

ID:99570 发表于 2019-9-10 23:23 | 显示全部楼层
很好,学习一下看看怎么闭环。
回复

使用道具 举报

ID:324611 发表于 2019-9-18 14:31 | 显示全部楼层
学习高手。
回复

使用道具 举报

ID:99570 发表于 2019-9-21 17:29 | 显示全部楼层
不错哦,学习中。
回复

使用道具 举报

ID:669414 发表于 2019-12-21 08:32 | 显示全部楼层
看起来好像不错,下载下来看看
回复

使用道具 举报

ID:285946 发表于 2020-6-20 14:39 | 显示全部楼层
学习前辈的经验
回复

使用道具 举报

ID:135281 发表于 2020-8-25 17:22 | 显示全部楼层
电路保护是怎么处理的,采样看不出来
回复

使用道具 举报

ID:323651 发表于 2020-9-28 09:28 | 显示全部楼层
不错的代码,学到了,谢谢
回复

使用道具 举报

ID:95059 发表于 2020-11-11 16:45 | 显示全部楼层
代码能用,想知道τ 宝能买到实体吗? 给个链接
回复

使用道具 举报

ID:884849 发表于 2021-3-17 23:37 | 显示全部楼层
非常好的教程
回复

使用道具 举报

ID:319585 发表于 2021-7-16 20:36 | 显示全部楼层
看了一下应该是单电阻采样,如果能三电阻采样就好了。
回复

使用道具 举报

ID:555044 发表于 2022-7-1 18:00 | 显示全部楼层
学习一下,对P、I、D三个参数的校定有好的方法不
回复

使用道具 举报

ID:137171 发表于 2022-7-26 10:52 | 显示全部楼层
这个应该是有霍尔传感器的控制代码吧,如果没有霍尔的话,有没有控制code
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表