RISC-V MCU 全自动平衡车

目录

 1.综述

2.代码示例

 2.1直立环

2.2速度环

2.3转向环

3.硬件构造

3.1电机驱动部分

 3.2单片机核心部分


 1.综述

 基于沁恒v307实现平衡车的设计,是以角加速度仪和陀螺仪来对沁恒v307控制的平衡车进行倾斜角度和角加速度的监测,然后把数据迅速反馈给沁恒v307芯片,并通过卡尔曼滤波和PID算法演算后得出相应的数据,继而向驱动电动机发送执行指令,让平衡车产生前进或后退的加速度来达到整个小车体前后的平衡。

2.代码示例

pid控制算法采用串级pid

 2.1直立环

/*********************
直立环PD控制器:Kp*Ek+Kd*Ek_D

入口:期望角度、真实角度、真实角速度
出口:直立环输出
*********************/
int Vertical(float Med,float Angle,float gyro_Y)
{
	int PWM_out;
	float err;
	static float with_err;
	err = Angle-Med;
	with_err  += err;
	with_err = with_err > 20 ? 20 : with_err;
	PWM_out=Vertical_Kp*(Angle-Med)+Vertical_Kd*(gyro_Y-0)+Vertical_Ki*with_err;
	return PWM_out;
}


2.2速度环

/*********************
速度环PI:Kp*Ek+Ki*Ek_S
*********************/
int Velocity(int Target,int encoder_left,int encoder_right)
{
	static int Encoder_S,EnC_Err_Lowout_last,PWM_out,Encoder_Err,EnC_Err_Lowout;
	float a=0.7;

	//1.计算速度偏差
	Encoder_Err=((encoder_left+encoder_right)-Target);//舍去误差--我的理解:能够让速度为"0"的角度,就是机械中值。
	//2.对速度偏差进行低通滤波
	//low_out=(1-a)*Ek+a*low_out_last;
	EnC_Err_Lowout=(1-a)*Encoder_Err+a*EnC_Err_Lowout_last;//使得波形更加平滑,滤除高频干扰,防止速度突变。
	EnC_Err_Lowout_last=EnC_Err_Lowout;//防止速度过大的影响直立环的正常工作。
	//3.对速度偏差积分,积分出位移
	Encoder_S+=EnC_Err_Lowout;
	//4.积分限幅
	Encoder_S=Encoder_S>10000?10000:(Encoder_S<(-10000)?(-10000):Encoder_S);

	if(stop==1)Encoder_S=0,stop=0;//清零积分量

	//5.速度环控制输出计算
	PWM_out=(Velocity_Kp*EnC_Err_Lowout+Velocity_Ki*Encoder_S)/100;
	return PWM_out;
}



2.3转向环

/*********************
转向环:系数*Z轴角速度+系数*遥控数据
*********************/
int Turn(int gyro_Z,int RC)
{
	int PWM_out;
	//这不是一个严格的PD控制器,Kd针对的是转向的约束,但Kp针对的是遥控的转向。
	PWM_out=Turn_Kd*gyro_Z + Turn_Kp*RC;
	return PWM_out;
}

3.硬件构造

3.1电机驱动部分

 3.2单片机核心部分

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值