| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 平衡小车制作STM32+cubeMX(直立环+速度环+转向换)串级PID学习,快速上手 -> 正文阅读 |
|
[嵌入式]平衡小车制作STM32+cubeMX(直立环+速度环+转向换)串级PID学习,快速上手 |
硬件使用: 1.大鱼电子的平衡小车系统板 2.大鱼电子平衡小车电机和底盘 3.航模3s电池 硬件占用的GPIO的框架: 编码器1——PA0/PA1---TIM2 编码器2——PB6/PB7---TIM4 电机1——PB12/PB13 电机2——PB14/PB15 PWM1——PA8 PWM2——PA11 MPU6050中断引脚——PB5 MPU6050所用IIC——PB3/PB4 14151312 Encoder.c GPIO初始化 定时器初始化 设置编码器模式 清除标志位 中断配置 清零计数 开定时器 PWM.c GPIO初始化 定时器初始化 输出比较模式初始化 MOE主输出使能 通道预装载使能 使定时器在ARR寄存器上的预装载寄存器 Moto.c GPIO初始化 Mpu6050中断引脚 Exit.c GPIO初始化 EXTI外部中断初始化 NVIC PWM赋值函数 PWM限幅 绝对值函数 小车异常关闭函数 PID函数(位置式PID) 直立环(V) 速度环(V) 转向环(X) 平衡小车的控制理论和控制过程的编程。 PID调参 TIM_EncoderInterfaceConfig (TIM2,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising); TIM2:定时器2 TIM_EncoderMode_TI12:T1和T2的每个跳变沿均计数。 TIM_ICPolarity_Rising:不反相。 TIM_ICPolarity_Rising:不反相。 根据两个输入信号(TI1&TI2)的跳变顺序,产生了计数脉冲和方向信号。 依据两个输入信号的跳变顺序,计数器向上或向下计数,同时硬件对TIMx_CR1寄存器的DIR位进行相应的设置。 不管计数器是依靠TI1计数、依靠TI2计数或者同时依靠TI1和TI2计数。 在任一输入端(TI1或者TI2)的跳变都会重新计算DIR位。 【正反】 正转:T1超前T2相位90度。 反转:T1滞后T2相位90度。 【模式】 TI1模式:在T1的所有边沿 计数。 TI2模式:在T2的所有边沿 计数。 TI12模式:在T1和T2的所有边沿 计数。 PID控制 PID控制,就是对偏差进行比例、积分和微分的控制。 PID由3个单元组成,分别是比例(P)单元、积分(I)单元、微分(D)单位。 工程中P必然存在,在P的基础上又有如PD控制器、PI控制器、PID控制器等。 比例项:提高响应速度,减小静差。 积分项:消除稳态误差。只要有偏差,我就积分,有一丁点偏差,我也会积分。积积,就会非常大。直到你偏差变为0. 微分项:减小震荡以及超调。 Pwm=Kp*e(k)+Ki*∑e(k)+Kd*[e(k)-e(k-1)] Kp*e(k) Ki*∑e(k) Kd*[e(k)-e(k-1)] Ki=Kp*(1/Ti) *Ti Kd=Kp*(1/T)*Td 位置PID 1.理论分析 位置闭环控制就是根据编码器的脉冲累加测量电机的位置信息,并与目标值进行比较,得到控制偏差, 然后通过对偏差的比例、积分、微分进行控制,使偏差趋向于零的过程。 2.公式 Pwm=Kp*e(k)+Ki*∑e(k)+Kd*[e(k)-e(k-1)] e(k):本次偏差 e(k-1):上一次的偏差 ? ∑e(k):e(k)以及之前的偏差的累积和;其中k为1,2,,k; Pwm代表输出 3.结构框图 4.C语言实现 int Position_PID (int Encoder??,??int Target) ??{ ???static float Bias,? Pwm,? Integral_bias,? Last_Bias; ???Bias=Encoder-Target; //计算偏差 ???Integral_bias+=Bias; //求出偏差的积分 ????? ???Pwm=Position_KP*Bias+Position_KI*Integral_bias+Position_KD*(Bias-Last_Bias); ??//位置式PID控制器 ??? ???Last_Bias=Bias; ??????//保存上一次偏差 ???return Pwm; ??????????//输出 ??} 直立环 1.理论 小车往那边倒,车轮就往哪边开,既可以保持车子的平衡。 2.公式 a=b1*θ+b2*θ'; ——> 比例微分控制【PDout=Kp*Angle+Kd*( Angle-Angle_last)】 3.结构框图 直立环:让小车角度趋近0; 速度环:让电机速度趋近0; 速度环、串级PID 速度环输入:1.给定速度。2.速度反馈。 输出:角度值(直立环的期望速度输入) 直立环输入:1.给定角度(速度环输出)。2.角度反馈 输出:PWM(直接控制小车) Vertical_out=Kp1*( real_Angle- expect_Angle)+Kd*D( real_Angle- expect_Angle) ?//直立PD控制器 Velocity_out =Kp2*(Encoder_ real- Encoder_ expect)+Ki*S(Encoder_ real- Encoder_ expect) ?//速度PI控制器 (NOTE:(1)Velocity_out?=?expect_Angle.(2)Kp1:Vertical_Kp.(3)Kp2:Velocity_Kp.) 【中文】 直立环输出=Kp1*(真实角度-期望角度+机械中值)+Kd*角度偏差的微分 ????//角度偏差=真实角度-期望角度 速度环输出=Kp2*(反馈编码器值-期望编码器值)+Ki*编码器偏差的积分 //编码器偏差=反馈编码器值-期望编码器值 (NOTE:(1)速度环输出=直立环的期望角度。(2)Kp1:直立环Kp。(3)Kp2:速度环Kp。) 合并推导: 直立环输出Vertical_out=Kp1*(θ_r-θ_e)+Kd*?(θ_r-θ_e)' 速度环输出Velocity_out=Kp2*(E_r- E_e)+Ki*Σ(E_r- E_e) 因为:θ_e = Velocity_out 所以直立环输出Vertical_out = =?Kp1*{?θ_r-[ Kp2*(E_r- E_e)+Ki*Σ(E_r- E_e)?]}+Kd*(θ_r-θ_e)' =?Kp1*?θ_r-?Kp1* Kp2*(E_r- E_e)- Kp1*Ki?*Σ(E_r- E_e)?+Kd*(θ_r-θ_e)' =?Kp1*?θ_r+?Kd*(θ_r-θ_e)'- Kp1* [Kp2*(E_r- E_e)+?Ki?*Σ(E_r- E_e)] 【中文】 =Kp1*真实角度+?Kd*角度偏差的微分-Kp1* [Kp2*编码器偏差- Ki?*编码器偏差的积分] 即: 串级输出OUT= Kp1*?real_Angle?+Kd* D( real_Angle- expect_Angle) — Kp1*[Kp2*(Encoder_ real- Encoder_ expect)+Ki*?S(Encoder_ real- Encoder_ expect)] 纯比例控制 单摆的加速度和单摆的倾角成正比 只存在大小与角度偏差成正比的回复力 a=b1*θ; ——> 比例控制【Pout=Kp*Angle】 比例微分控制器 大小与角度成正比、方向与角速度成正比的回复力 大小与角速度成正比、方向与回复力成反比的阻尼力 a=b1*θ+b2*θ';?——>比例微分控制【PDout=Kp*Angle+Kd*( Angle-Angle_last)】
控制函数写在外部中断服务函数里面。 10ms控制周期由MPU6050的INT引脚给定。 保证数据的采集和处理的同步性。 3.1: 《修正control.c的遗漏处》、 《速度环的反馈系统》、 《平衡小车硬件结构与组装》 3.2: 《PID调参》? 3.2:调参步骤:
机械中值:把平衡小车放在地面上,从前向后以及从后向前绕电机轴旋转平衡小车,两次的向另一边倒下的角度的中值,就是机械中值。 直立环 Kp极性: 极性错误:小车往哪边倒,车轮就往反方向开,会使得小车加速倒下。 极性正确:小车往哪边倒,车轮就往哪边开,以保证小车有直立的趋势。 Kp大小: Kp一直增加,直到出现大幅低频震荡。 Kd极性: 极性错误:拿起小车绕电机轴旋转,车轮反向转动,无跟随。 极性正确:拿起小车绕电机轴旋转,车轮同向转动,有跟随。 Kd大小: Kd一直增加,直到出现高频震荡。 直立环调试完毕后,对所有确立的参数乘以0.6作为最终参数。 原因:之前得到的参数都是Kp、Kd最大值,根据工程经验平衡小车的理想参数为最大参数乘以0.6求得。 结果:乘以0.6后,小车的抖动消失,但同时直立效果也变差。待下面加入速度环就能得到更好的性能。 速度环 速度环参数调节前注意: 一、 在调试【速度环参数极性】时:需要去掉(注释掉)【直立环运算】 在调试【速度环参数大小】时:再次引入(取消注释)【直立环运算】 二、 【转向环运算】始终是去掉(注释)的一个状态。若转向环已提前将参数调试好,则未注释也影响不大。 Kp&Ki: 线性关系、Ki=(1/200)*Kp、仅调Kp即可。 Kp&Ki极性: 极性错误:手动转动其中一个车轮,另一车轮会以同样速度反向旋转——典型负反馈。 极性正确:手动转动其中一个车轮,两个车伦会同向加速,直至电机最大速度——典型正反馈。 Kp&Ki大小: 增加Kp&Ki,直至:小车保持平衡的同时,速度接近于零。且回位效果较好。 转向环 Kp极性: 极性错误:拿起小车,并将小车绕Z轴旋转,两车轮旋转的趋势与小车旋转趋势一致——典型正反馈。 极性正确:拿起小车,并将小车绕Z轴旋转,两车轮旋转的趋势与小车旋转趋势相反——典型负反馈。 Kp大小: 加大Kp,直至走直线效果较好,且无剧烈抖动。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:34:18- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |