发 帖  
张飞软硬开源基于STM32 BLDC直流无刷电机驱动器开发视频套件, 👉戳此立抢👈
[资料] 【共享资料二】超简洁的PID程序,适合多个或者串级PID
2017-7-14 11:26:44  7438 PID
分享
本帖最后由 liqijian101 于 2017-7-17 06:42 编辑

普通PID控制程序编写时,每一个PID控制程序就需要定义一个PID参数(Kp1,Kp2,Kp3...),需要编写一段PID程序,看起来非常冗余,特此编写一段非常简单的调用PID的代码。
1.调用函数
  1. /**
  2. * @Description: PID计算输出
  3. * @param Reference - 目标值
  4. * @param resentFeedback - 目前反馈值(测量值)
  5. * @return PID计算后的输出值
  6. */
  7. float PID_Regulator(float Reference, float PresentFeedback, _pid *PID_Struct)
复制代码
2.PID结构体定义
  1. /* 控制算法PID */
  2. typedef struct
  3. {
  4.         unsigned char flag;
  5.         unsigned int  count;
  6.         
  7.         float Kp;
  8.         float Ki;
  9.         float Kd;

  10.           signed short Lower_Limit_Output;     //Lower Limit for Output limitation
  11.           signed short Upper_Limit_Output;     //Upper Limit for Output limitation
  12.          float Lower_Limit_Integral;   //Lower Limit for Integral term limitation
  13.           float Upper_Limit_Integral;   //Lower Limit for Integral term limitation
  14.           float Integral;
  15.           float PreviousError;
  16. }_pid;
  17. _pid PID_Speed,PID_Torque;
复制代码

3.使用案例
  1. /**
  2. *  @file           thread_motor_control.c
  3. *  @brief          STM32F407 直流电机控制程序
  4. *  @version 1.0
  5. *  @author         
  6. *  @date           2016年11月27日
  7. */

  8. #include "stm32f4xx.h"
  9. #include <rtthread.h>
  10. #include "struct_all.h" //包含PID参数定义

  11. #include "pid_regulator.h"   

  12. /* 信号量控制块 */
  13. struct rt_semaphore motor_sem;

  14. void rt_motor_init(void)
  15. {
  16.     /* 初始化静态信号量,初始值是0 */
  17.     rt_sem_init(&motor_sem, "motor", 0, RT_IPC_FLAG_FIFO);
  18.     /* 初始化电机控制IO */
  19.     left_motor_ctrl_GPIO_init();
  20.     /* 初始化电机PWM */
  21.     left_motor_init(4200, 1); //84M/1=84Mhz的计数频率,所以PWM频率为 84M/4200=20KHz.
  22.         /* L_MOTOR_TIM Counter Clock stopped when the core is halted */
  23.     DBGMCU_APB1PeriphConfig(DBGMCU_TIM12_STOP, ENABLE);
  24.         

  25. }
  26. /**
  27. * @Description: motor线程
  28. */
  29. void thread_motor_control(void *parameter)
  30. {
  31.     rt_motor_init();       //电机PWM输出设置,根据自己的单片机修改
  32.     PID_Parameter_Init();  //PID参数初赋值
  33.    
  34.     while(1)
  35.     {
  36.         rt_sem_take(&motor_sem, 2);                         //2ms执行一次。使用的rt_thread OS 裸跑的话可使用定时器,

  37.         motor.pwm = PID_Regulator(motor.target_speed, motor.speed, &PID_Speed); //速度环PID
  38.         Set_Pwm(motor.pwm, 0);                      //赋值给PWM寄存器
  39.                
  40. //             motor.pwm= PID_Regulator(motor.target_torque, motor.current.current, &PID_Torque); //电流环PID
  41. //      Set_Pwm(motor.pwm, 0);                      //赋值给PWM寄存器        
  42.     }
  43. }

复制代码
详细代码
游客,如果您要查看本帖隐藏内容请回复



10

评分

参与人数 2积分 +8 收起 理由
无敌金刚 + 5 太有用了 感谢
尼米兹V5 + 3 您的帖子很精彩,期待您分享的下一个帖子!.

查看全部评分

本帖被以下淘专辑推荐:

分享淘帖1 显示全部楼层
最近下载过的用户(74)
· 2017-7-14 22:04:12
这个资料不错 感谢楼主分享            
· 2017-7-17 17:41:19
谢谢分享!!!!!!!
· 2017-7-18 09:20:30
学习学习............
· 2017-7-20 09:04:02
谢谢分享                              
· 2017-7-20 10:02:16
谢谢分享               
· 2017-7-20 18:03:16
多谢 让俺来看看
· 2017-7-22 17:20:46
支持
· 2017-7-23 10:45:57
参考下,谢谢分享
· 2017-7-25 08:42:58
· 2017-7-27 08:01:58
谢谢楼主分享
· 2017-7-29 16:45:06
不错 哦哦  
· 2017-7-30 15:24:12
6666666666666666666
· 2017-8-1 15:50:18
似乎不错
· 2017-8-5 10:24:24
支持支持
· 2017-8-8 10:56:34
好东西,学习了,谢谢分享!顶一个。
· 2017-8-9 12:52:58
学习一下。谢谢
· 2017-8-9 12:57:24
666,楼主厉害,支持楼主
· 2017-8-9 22:37:54
学习了,以前用过PI控制电机
· 2017-8-10 18:24:36
谢谢分享!!!!!

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

发资料
课程
    关闭

    站长推荐 上一条 /8 下一条

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