IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 调试基于stm32平衡小车的困惑与心得(一) -> 正文阅读

[嵌入式]调试基于stm32平衡小车的困惑与心得(一)

前言

最初的接触是在2020跨入2021的寒假之中,偶然间发现;大生兴趣,但最终因种种原因(懒)没有深入尝试,近期因参与竞赛的相关需要,被平衡小车折磨了将近一个月左右,现写下一些困惑与心得,希望能与更多大佬交流解决问题。

一、调试过程

1.初步尝试

最开始拿到手时首先参考的是网上盛行的平衡之家的开源代码,可以说是平衡车控制调试里经典中的经典,现将其摘录如下

/**
  * @name   balance
  * @brief  直立环
  * @param
  *         Angle:陀螺仪当前角度值      Gyro:陀螺仪角速度值
  * @retval none
  * @attention 
  * 			1.机械中值为具体数值可能与当前所用平衡车不匹配需要根据情况进行修改;
  * 			2.Balance_Kp与Balance_Kd的数值同1。
*/
float Movement;
float Balance_Kp=120,Balance_Kd=2;
int last_bias=0;
int balance(float Angle,float Gyro)
{  
    float Bias;
	int balance;

	Bias=Angle-1.8f+Movement;	//Angle:陀螺仪当前角度;1,8f:机械中值;Movement:中值变量(改变中值使平衡车移动)
	balance=Balance_Kp*Bias-Gyro*Balance_Kd;	//Gyro:陀螺仪角速度
	last_bias=Bias;

	return balance;
}
/**
  * @name   velocity
  * @brief  速度环
  * @param none
  * @retval none
  * @attention 
  * 			1.不同平衡车的Left.m_real_v与Right.m_real_v(编码器返回左右轮速度值)的正负符号可能不同,需要根据具体情况测定修改
  * 			2.Velocity_Kp与Velocity_Ki值同1;
  * 			3.Velocity_Ki=Velocity_Kp/200.0f未必适用,需要多做尝试,由实际效果定夺。
*/
float Velocity_Kp=0.5f,Velocity_Ki=0.01;//PID参数
int velocity(void)
{  
	
	static float Velocity,Encoder_Least,Encoder;
	static float Encoder_Integral;
	Velocity_Ki=Velocity_Kp/200.0f;

	Encoder_Least =(Left.m_real_v+Right.m_real_v)-0;	//左右轮速度和,平衡时期望速度为零
	Encoder *= 0.8f;                                
	Encoder += Encoder_Least*0.2f;		//一阶低通滤波                      
	Encoder_Integral +=Encoder;		//积分
	Encoder_Integral=Encoder_Integral-Movement;		//附加控制输入   
	if(Encoder_Integral>100000)  	Encoder_Integral=100000;
	if(Encoder_Integral<-100000)	Encoder_Integral=-100000;	//积分限幅
	Velocity=Encoder*Velocity_Kp+Encoder_Integral*Velocity_Ki;	//PI输出
	return Velocity;
}

(1).存在的问题

1.因使用的陀螺仪存在一定零漂,且机械并未使其较好自平衡,导致单直立环的情况下无法稳定直立;
2.因使用的电机存在死区电流和空程,速度累加时,死区电流的影响使得在速度环输出过大时对整车稳定雪上加霜,过小时又十分鸡肋, 多次调试终未能取得较好效果.

(2).解决思路

将直立环改为位置式PID,加入积分对其误差进行一定补偿,使其稳定直立

2.初步改进

将陀螺仪当前数据和中值差算作误差输入位置式PID计算,相关代码如下

float Balance_cal(float expect_angle)
{
    err=expect_angle-midangle;  //midangle:机械中值
	integral+=err;  //积分累加
    result=(kp*err+  \
              ki*integral+  \
              kd*(err-last_Err));  //PID输出
    last_Err=err;
	return result;
}

(1).存在问题

1.位置式PID的积分在很大程度上阻碍了平衡车移动状态的变化,既使其在静止时更加稳定,同时也因积分饱和的存在使得其在受扰移动后难以再次稳定直立;
2.单独对积分进行的各种处理在使其响应更灵敏时,也降低了其稳定性,目前笔者暂未发现较好的方式解决其移动问题,陷入无积分难直立,有积分难运动的尴尬境地。

二、困惑与改进思路

1.存在困惑

开源算法中速度环的作用是累加速度获得路程,还是修正陀螺仪漂移数值,又或二者兼得,其输出极性的确定亦然存在问题,且一旦积分饱和,亦会使平衡车的直立陷入困境

2.改进思路

(1).位置式

1.尝试更改平衡小车控制输入模式,使得对直立环的积分影响减小;
2.对积分和整体输出作相关处理,使其积分效果不减的同时更难达到积分饱和

(2)开源式

1.多作速度环极性的尝试,对其积分作相关处理,防止其迅速饱和后影响整车直立
2.对每个电机单独作速度累加,使其反馈更加平滑

总结

以上便是本人目前主要思路和心得,有不当之处欢迎各位大佬指正。目前笔者调试陷入困境,若有好思路与想法,恭迎交流与指点,感激不尽!

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-29 11:48:50  更:2021-07-29 11:50:39 
 
开发: 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年12日历 -2024/12/27 9:56:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计