
我的PID项目
简介
该项目旨在通过简易 PID 入门套件,实现对带编码器的电机的精确控制。利用 PID 控制算法,实现电机的定速功能和定距功能,并通过屏幕实时显示 PID 参数以及当前值与目标值的曲线变化,从而帮助用户深
简介:该项目旨在通过简易 PID 入门套件,实现对带编码器的电机的精确控制。利用 PID 控制算法,实现电机的定速功能和定距功能,并通过屏幕实时显示 PID 参数以及当前值与目标值的曲线变化,从而帮助用户深开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
一、项目背景与目标
该项目旨在通过简易 PID 入门套件,实现对带编码器的电机的精确控制。利用 PID 控制算法,实现电机的定速功能和定距功能,并通过屏幕实时显示 PID 参数以及当前值与目标值的曲线变化,从而帮助用户深入理解和应用 PID 控制原理。
二、硬件设计
1.供电电路

直接使用一个 TYPE-C 接口输入 5V 电源,通过开关进行控制。其中有两个电源信号:MOTOR_VCC 和 +5V。
MOTOR_VCC 是直接将TYPE-C的电源接入电机正负极。
+5V 是由 MOTOR_VCC 经过一个防倒灌二极管 U12 后的电源,该电源接入到开发板的5V上,为开发板供电。
- 按键部分

直接让开发板的 GPIO 通过按键接到 GND。当引脚检测到是低电平时,说明按键被按下。
- 开发板部分

开发板输入电源为 +5V,其自带 5V 转 3.3V 功能,3V3 输出接编码器电源。电机控制信号 BI、FI 接支持 PWM 的 GPIOA26、GPIOA27,分别通过 TIMG7 - C0、TMG7 - C1 输出 PWM。编码器 AB 相信号接 GPIOB0、GPIOB1,软件用外部中断采集脉冲。按键信号接 GPIOA8、9、28、31,软件配置开启上拉电阻使引脚默认高电平。
- 电机驱动模块

选用 BDR6126D 作为电机驱动芯片,负责驱动带编码器的电机。电机接口适配市场上大多数编码器电机接口,方便用户连接和使用。
三、软件设计
- PID 控制算法:
PID 控制是一种常见的闭环控制策略,结合了比例(P)、积分(I)和微分(D)三个控制元素。
在本项目中,PID 控制算法用于根据编码器的反馈信号,调整电机的 PWM 信号,以实现定速和定距功能。
PID 的无脑应用公式为:PID_OUT = (Kp × 误差) + (Ki × 累计误差) + (Kd × 误差间的差值)。通过调整 Kp、Ki、Kd 参数,可以优化控制效果。
- 定速功能:
获取当前电机速度,根据设定的目标速度,通过 PID 控制算法使电机当前实时速度以最快的速度接近设定的目标速度。
在屏幕上实时显示当前速度、目标速度以及 PID 参数等信息。
代码实现如下:
typedef struct
{
float kp, ki, kd; // 三个静态系数
float change_p, change_i, change_d; // 三个动态参数
float error, last_error; // 误差、之前误差
float max_change_i; // 积分限幅
float output, max_output; // 输出、输出限幅
int target; // 目标
}PID;
功能:PID计算
参数:pid = pid的参数输入
target = 目标值
current = 当前值
返回:PID计算后的结果
float pid_calc(PID *pid, float target, float current)
{
//用上一次的误差值更新 之前误差last_error
pid->last_error = pid->error;
//获取新的误差 = 目标值 - 当前值
pid->error = target - current;
//计算比例P = 目标值与实际值之间的误差e
float pout = pid->error;
//计算积分I = 误差e的累加
pid->change_i += pid->error;
//计算微分D = 当前误差e - 之前的误差last_e
float dout = pid->error - pid->last_error;
//积分I 限制不能超过正负最大值
if(pid->change_i > pid->max_change_i)
{
pid->change_i = pid->max_change_i;
}
else if(pid->change_i < -pid->max_change_i)
{
pid->change_i = -pid->max_change_i;
}
//计算输出PID_OUT = (Kp x P)+ (Ki x I)+(Kd x D)
pid->output = (pid->kp * pout) + (pid->ki * pid->change_i) + (pid->kd * dout);
//输出 限制不能超过正负最大值
if(pid->output > pid->max_output) pid->output = pid->max_output;
else if(pid->output < -pid->max_output) pid->output = -pid->max_output;
//返回PID计算的结果
return pid->output;
}
- 定距功能:
根据电机旋转一圈的编码器脉冲数,确定电机旋转一圈为多少个脉冲。
通过当前脉冲数和目标脉冲数,通过 PID 控制算法使电机当前实时脉冲以最快的速度接近设定的目标脉冲,达到定距移动的效果。
在屏幕上实时显示当前脉冲数、目标脉冲数以及 PID 参数等信息。
代码实现如下:
//编码器数据更新
//请间隔一定时间更新
void encoder_update(void)
{
motor_encoder.count = motor_encoder.temp_count;
//确定方向
motor_encoder.dir = ( motor_encoder.count >= 0 ) ? FORWARD : REVERSAL;
motor_encoder.temp_count = 0;//编码器计数值清零
}
...
//电机编码器脉冲计数
void TIMER_TICK_INST_IRQHandler(void)
{
//20ms归零中断触发
if( DL_TimerA_getPendingInterrupt(TIMER_TICK_INST) == DL_TIMER_IIDX_ZERO )
{
//编码器更新
encoder_update();
if( get_task_status() == TASK_ENABLE )
{
//按键扫描+事件管理
flex_button_scan();
}
}
}
- 用户界面:
设计直观易用的用户界面,通过屏幕显示二级菜单,用户可以通过按键选择功能、查看 PID 参数和曲线变化等。
提供按键长短按控制和调参功能,方便用户根据实际需求调整 PID 参数。
四、项目实施步骤
- 硬件搭建:按照电路图连接各模块,确保连接正确无误。
- 软件编写:在开发环境中编写 PID 控制算法、定速功能、定距功能以及用户界面等代码。
- 调试与测试:对硬件和软件进行联合调试,确保系统正常工作。通过实际测试验证 PID 控制算法的效果。
- 优化与改进:根据测试结果对 PID 参数进行调整和优化,提高系统的控制精度和稳定性。
五.实物展示
五、项目总结与展望
通过本项目的设计与实施,用户能够深入理解和应用 PID 控制原理,掌握带编码器电机的精确控制方法。同时,该项目也为进一步开展更复杂的机器人控制系统设计提供了有益的参考和借鉴。未来可以考虑增加更多传感器和功能模块,扩展系统的应用场景和功能。
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。









