本帖最后由 liqijian101 于 2017-7-17 06:42 编辑
普通PID控制程序编写时,每一个PID控制程序就需要定义一个PID参数(Kp1,Kp2,Kp3...),需要编写一段PID程序,看起来非常冗余,特此编写一段非常简单的调用PID的代码。
1.调用函数
- /**
- * @Description: PID计算输出
- * @param Reference - 目标值
- * @param resentFeedback - 目前反馈值(测量值)
- * @return PID计算后的输出值
- */
- float PID_Regulator(float Reference, float PresentFeedback, _pid *PID_Struct)
复制代码
2.PID结构体定义
- /* 控制算法PID */
- typedef struct
- {
- unsigned char flag;
- unsigned int count;
-
- float Kp;
- float Ki;
- float Kd;
-
- signed short Lower_Limit_Output; //Lower Limit for Output limitation
- signed short Upper_Limit_Output; //Upper Limit for Output limitation
- float Lower_Limit_Integral; //Lower Limit for Integral term limitation
- float Upper_Limit_Integral; //Lower Limit for Integral term limitation
- float Integral;
- float PreviousError;
- }_pid;
- _pid PID_Speed,PID_Torque;
复制代码
3.使用案例
- /**
- * @file thread_motor_control.c
- * @brief STM32F407 直流电机控制程序
- * @version 1.0
- * @author
- * @date 2016年11月27日
- */
- #include "stm32f4xx.h"
- #include
- #include "struct_all.h" //包含PID参数定义
- #include "pid_regulator.h"
- /* 信号量控制块 */
- struct rt_semaphore motor_sem;
- void rt_motor_init(void)
- {
- /* 初始化静态信号量,初始值是0 */
- rt_sem_init(&motor_sem, "motor", 0, RT_IPC_FLAG_FIFO);
- /* 初始化电机控制IO */
- left_motor_ctrl_GPIO_init();
- /* 初始化电机PWM */
- left_motor_init(4200, 1); //84M/1=84Mhz的计数频率,所以PWM频率为 84M/4200=20KHz.
- /* L_MOTOR_TIM Counter Clock stopped when the core is halted */
- DBGMCU_APB1PeriphConfig(DBGMCU_TIM12_STOP, ENABLE);
-
- }
- /**
- * @Description: motor线程
- */
- void thread_motor_control(void *parameter)
- {
- rt_motor_init(); //电机PWM输出设置,根据自己的单片机修改
- PID_Parameter_Init(); //PID参数初赋值
-
- while(1)
- {
- rt_sem_take(&motor_sem, 2); //2ms执行一次。使用的rt_thread OS 裸跑的话可使用定时器,
- motor.pwm = PID_Regulator(motor.target_speed, motor.speed, &PID_Speed); //速度环PID
- Set_Pwm(motor.pwm, 0); //赋值给PWM寄存器
-
- // motor.pwm= PID_Regulator(motor.target_torque, motor.current.current, &PID_Torque); //电流环PID
- // Set_Pwm(motor.pwm, 0); //赋值给PWM寄存器
- }
- }
复制代码
详细代码
10
评分
-
查看全部评分
|
|
|
|
非常适用,正好需要,对于串级PID的使用最好有个实例
|
|
|
|
|
学习一下 学习一下 学习一下 学习一下 学习一下 学习一下 学习一下 学习一下
学习一下学习一下学习一下学习一下学习一下
|
|
|
|
|
谢谢楼主 ,希望可以共同进步
|
|
|
|
|