双轮载人平衡车设计完整教程之软件篇

本文详细介绍了双轮载人平衡车的软件设计,包括系统初始化、数字滤波器(卡尔曼滤波、一介低通滤波)、数字PID控制器(直立环PD控制、速度环PI控制、转向环PD控制)、编码器M法测速、OLED显示程序、主板温度监测和高亮LED车灯闪烁设计。通过这些设计,实现了稳定、安全的平衡车控制系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统软件设计
5.1 系统初始化
为了防止程序运行过程中跑飞而造成的人身安全的伤害,系统主控制循环程序中添加独立看门狗程序,在程序死锁或跑飞状态下可自动复位,确保行车安全。系统初始化流程图如图5.1所示:
在这里插入图片描述

图5.1 系统初始化

5.2 数字滤波器设计
5.2.1卡尔曼滤波

卡尔曼滤波算法广泛地应用于智能机器人控制,航模传感器数据融合,卫星导航领域以及计算机图像处理当中。姿态传感器MPU-6050陀螺仪测量的角速度通过数学积分运算得到角度的信息,总是会存在微小的偏差和漂移变化所形成的累积误差,并且误差会随时间的增加逐步增大,到最后无法输出正确可控的角度信号。先对其偏差验证估计一个大概值,在用倾角减去刚才估计的八个大概值误差协方差的微分,后期验证再估计一个大概值,最后输出稳定的角度信息。经过多次试验,使用卡尔曼滤波算法融合得到的角度值非常稳定。部分程序代码如下所示。

void Kalman_Filter(float Accel,float Gyro)
{
angle+=(Gyro - Q_bias) * dt; //ÏÈÑé¹À¼Æ
Pdot[0]=Q_angle - PP[0][1] - PP[1][0];

Pdot[1]=-PP[1][1];
Pdot[2]=-PP[1][1];
Pdot[3]=Q_gyro;
PP[0][0] += Pdot[0] * dt;   
PP[0][1] += Pdot[1] * dt;  
PP[1][0] += Pdot[2] * dt;
PP[1][1] += Pdot[3] * dt;
	
Angle_err = Accel - angle;	

PCt_0 = C_0 * PP[0][0];
PCt_1 = C_0 * PP[1][0];

E = R_angle + C_0 * PCt_0;

K_0 = PCt_0 / E;
K_1 = PCt_1 / E;

t_0 = PCt_0;
t_1 = C_0 * PP[0][1];

PP[0][0] -= K_0 * t_0;		 
PP[0][1] -= K_0 * t_1;
PP[1][0] -= K_1 * t_0;
PP[1][1] -= K_1 * t_1;
	
angle	+= K_0 * Angle_err;	 
Q_bias	+= K_1 * Angle_err;	 
angle_dot   = Gyro - Q_bias;	

}

void Yijielvbo(float angle_m, float gyro_m)
{
angle = K1 * angle_m+ (1-K1) * (angle + gyro_m * 0.005);
}

5.2.2一介低通滤波
机械齿轮的减速电机是存在一定的控制死区的,我们没有必要把它控制在一个精度非常高的范围里面,这会让电机产生强烈的震动、更严重的会烧毁电机等不可逆转的损害。恰恰相反,我们可以利用减速电机这存在的死区,适当的减缓速度的变化,可以有效的降低速度控制对直立控制的干扰。在自平衡系统里,直立平衡才是最主要的,其他一切的控制相对平衡来说都算是一种干扰,干扰越大,稳定性越差[6]。所以我们对编码器所测得的电机转速信息乘以0.8后再赋值给编码器输出,对速度偏差乘以0.2后赋值给新的速度偏差变量。相关代码如下所示:

Encode = 0.8; //对Encode进行低通滤波
Encode += Encode_Least
0.2; //对Encode偏差进行低通滤波

5.3 数字PID控制器
5.3.1直立环PD控制

相对于平衡车而言,所有的功能都是建立在车身平衡的基础上的。平衡是主要,其他所有的附加功能相较于直立来说都是干扰[7]。首先定义程序入口参数Angle(角度), Gyro(角速度),Bias(偏差)为浮点型变量,比例值,微分值可以先行估计一个大概值,方便后期调试。定义使得系统平衡的平衡(Balance)变量为整形数据。其次估计车身的机械安装中值为0(姿态传感器安装在绝对零点位置的时候),用陀螺仪所测得的实时变化的角度减去机械安装中值并赋值给偏差变量;再对偏差乘以比例值并加上角速度乘以微分值赋值给平衡PWM波,最后返回的是整形的平衡PWM波值。程序设计如图5.3.1所示。
在这里插入图片描述

图5.3.1 直立环PD控制代码
以上为角度闭环控制也就是直立PD控制的关键部分程序,一般的控制系统而言,只需

### 平衡PID控制器程序流程 对于平衡而言,保持稳定的关键在于精确调整电机的速度来维持身姿态。为了实现这一目标,通常采用比例积分微分(PID)算法来进行实时控制[^1]。 #### 流程概述 - **初始化阶段** 读取传感器数据并设定初始参数值,包括但不限于角度、角速度以及期望的目标位置。 - **循环执行部分** 持续不断地获取最新的倾斜角度信息,并将其传递给PID计算模块;随后依据得出的结果调节电动机功率输出以纠正偏差。 - **反馈机制** 通过不断重复上述过程形成闭环控制系统,从而确保辆始终处于直立状态或者按照预设轨迹移动。 ```python while True: current_angle = get_sensor_data() # 获取当前倾角 error = target_angle - current_angle # 计算误差 p_term = Kp * error # P项 i_term += Ki * error # I项累加 d_term = Kd * (error - last_error) # D项差分 output = p_term + i_term + d_term # 组合三项得到最终输出量 adjust_motor(output) # 调节马达转速 last_error = error # 更新上次误差用于下次迭代中的D计算 ``` 该伪代码展示了如何在一个简单的主循环里完成一次完整的PID运算周期[^2]。 #### 控制逻辑可视化表示 虽然无法直接提供具体的图形化流程图,在此可以描述其大致结构: 1. 开始 -> 初始化设置(加载默认配置) 2. 进入无限循环 -> - 数据采集环节(从IMU等设备取得即时数值) - PID处理单元(基于收集到的信息做相应修正动作) - 输出指令至驱动组件(改变轮子转动情况) 3. 结束条件判断(当满足特定终止标准时退出) 以上即构成了整个系统的运作框架[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值