STM32自平衡机器人项目,附代码、电路图等资料
单片机与嵌入式 2024-05-17

机器人原理分析

首先来看成品图:

如图所示,该机器人根据陀螺仪的位姿数据,通过三个全向轮驱动底部球体调整自己在球上的位置,保持动态平衡的同时实现全向移动。

保持动态平衡过程需要对机器人进行运动学分析,这里参考了平衡小车之家的运动学方程:

自平衡控制问题转化为三步:输入X、Y角度—控制器计算—输出A、B、C电机转速的控制模型。

控制器设计

首先考虑参考平衡车控制,球上自平衡机器人本质上依然是一个一阶倒立摆问题。

这里参考了飞思卡尔直立车的控制方法,采用串级PID控制器,外环PD角度环,内环速度PI环。

由于我的驱动方案选择的是42步进电机,在速度闭环的时候有些问题。正常的直流电机+编码器的控制方案可以通过编码器将轮子的真实速度计算出来,从而和控制器的理想转速作差,实现速度控制。

而我这里的速度闭环是通过计算上一个时钟周期时给步进电机的控制量,通过运动学方程分解,得到机器人的虚拟速度,与理想转速作差控制。我认为这种速度闭环方式还是存在一定缺陷的,但是在网上查看论文的时候我发现有很多自平衡机器人都是用42步进电机来实现速度闭环的,不知道是什么方法。

这里还可以好好思考一下为什么角度环要用PD控制,速度环要PI控制,角度环的P部分和D部分对机器人控制有什么影响?在很多调试平衡车的文章中都有解释。

硬件及结构设计

自平衡机器人的硬件清单有:

56mm全向轮 45元/个

42步进电机 25/个

42步进闭环模块 59.8元/个

LM2596S降压模块 20元

STM32F103C8T6-4飞控板 59.8元

GY-521六轴陀螺仪 25元

用到的模块大致如上所示,C8T6的价格随着最近芯片涨价直线上升,我白嫖了实验室的两块板子,现在买一块实在太贵,可以等芯片价格稳定一些再买。其余开关排针等常见元件不再赘述。

电路原理图如下所示:

机器人使用solidworks设计整体结构,底板可在某宝定制6050太空铝切割,蓝色件为正常3D打印件。

程序部分

在keil 5中开发STM32。

控制程序采用定时器0.5ms定时中断的方式进行计算,每触发两次中断计算对电机控制一次,这里还是推荐大家采用外部中断读取GY-521上的INT引脚的方式,控制计算周期。GY-521上的INT引脚每5ms触发一次跳变,采用外部中断的方式可以严格保证读取位姿数据与计算处理同步。

int TIM1_UP_IRQHandler (void) { u8 key_cal; if(TIM_GetITStatus(TIM1,TIM_IT_Update) != RESET) { TIM_ClearITPendingBit(TIM1,TIM_IT_Update);  flag_target=!flag_target; key_cal=KEY_Scan(0); if(state_flag==1)//矫正结束 { if(flag_target==1)//每读取两次陀螺仪控制一次  { Read_DMP(); //===读取倾角 scope(); return 0; } } if(key_cal==1)//矫正按键 { Angle_Zero_X=Angle_Balance_X; Angle_Zero_Y=Angle_Balance_Y; key_cal=0; Flag_Stop=0; } if(key_cal==2||key_cal==3)//矫正按键 { Flag_Stop=1;//关闭速度环I积分 key_cal=0; } Angle_Bias_X =Angle_Balance_X-Angle_Zero_X; //获取Y方向的偏差 Angle_Bias_Y =Angle_Balance_Y-Angle_Zero_Y; //获取Y方向的偏差 if(control_mode==0)//PID控制模式 { Encoder_Analysis(Motor_A,Motor_B,Motor_C); //正运动学分析,得到X Y方向的速度 Balance_Pwm_X= balance_X(Angle_Bias_X,Gyro_Balance_X);//X方向的倾角控制 Balance_Pwm_Y=-balance_Y(Angle_Bias_Y,Gyro_Balance_Y); //Y方向的倾角控制//      if(++flag_target_2==4)//速度环频率慢于加速度环 但是还没加速度环 //          { Velocity_Pwm_X=velocity_X(compute_X); //X方向的速度控制 Velocity_Pwm_Y=velocity_Y(compute_Y); //Y方向的速度控制 //          flag_target_2=0;//          } Move_X =Balance_Pwm_X+Velocity_Pwm_X; //===X方向控制量累加  Move_Y =Balance_Pwm_Y+Velocity_Pwm_Y; //===Y方向控制量累加  Move_Z=0;  Kinematic_Analysis(Move_X,Move_Y,Move_Z);//逆运动学分析得到ABC电机控制量 } Motor_A=Target_A;//直接调节PWM频率  Motor_B=Target_B;//直接调节PWM Motor_C=Target_C;//直接调节PWM//以下都是为了速度连续化处理防止突变 if(Motor_A==0)  Motor_A=motor_a_last; if(Motor_B==0)  Motor_B=motor_b_last; if(Motor_C==0)  Motor_C=motor_c_last; Xianfu_Pwm(2000); Set_Pwm(Motor_A,Motor_B,Motor_C); Gyro_Balance_X_last=Gyro_Balance_X; Gyro_Balance_Y_last=Gyro_Balance_Y; Gyro_Balance_Z_last=Gyro_Balance_Z; Angle_Balance_X_last=Angle_Balance_X; Angle_Balance_Y_last=Angle_Balance_Y; Angle_Balance_Z_last=Angle_Balance_Z; motor_a_last=Motor_A; motor_b_last=Motor_B; motor_c_last=Motor_C; } return 0;}
对于电机控制,由于采用的驱动方案是步进电机,调速的方式是改变驱动步进电机的脉冲频率。我这里选择了三个定时器,动态调节定时器的频率,具体方式是在初始化时设定好定时器的预分频系数psc的值,然后在程序里动态更改ARR寄存器的值,从而改变定时器的定时频率。
//这里以A电机的速度控制为例 输入为 电机方向和电机速度void set_motorA_speed(u8 dir,u16 speed){ u32 arr; arr=speed; TIM_ARRPreloadConfig(TIM3,DISABLE); TIM3->ARR=arr;//计数到10000在归零重新计数 TIM3->CCR4=arr/2;//保持占空比为50% TIM_ARRPreloadConfig(TIM3,ENABLE); TIM_Cmd(TIM3,ENABLE); if(dir==0) { GPIO_SetBits(GPIOA,GPIO_Pin_1); } else { GPIO_ResetBits(GPIOA,GPIO_Pin_1); }}

小车的运动学分解代码实现如下,参考了平衡小车之家的代码:

/**********************************************************函数功能:小车运动数学模型入口参数:X Y Z 三轴速度或者位置返回  值:无***********************************************************/void Kinematic_Analysis(float Vx,float Vy,float Vz){ Target_A   = Vx + L_PARAMETER*Vz; Target_B   = -X_PARAMETER*Vx + Y_PARAMETER*Vy + L_PARAMETER*Vz; Target_C   = -X_PARAMETER*Vx - Y_PARAMETER*Vy + L_PARAMETER*Vz;}/*****************************************************************函数功能:小车运动 正运动学分析 入口参数:A B C三个电机的速度返回  值:无******************************************************************/void Encoder_Analysis(float Va,float Vb,float Vc){ compute_X=(Va*2-Vb-Vc); compute_Y=((Vb-Vc)*sqrt(3)); compute_Z=(Va+Vb+Vc); }

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • 人工智能
  • 机器人
  • AI
  • 神经
  • 人工智能优势:降低岗位工作难度

    人工智能就其本质而言,是对人的思维的信息过程的模拟。在ChatGPT出来之后,人工智能的关注度越来越高。为增进大家对人工智能的认识,本文将对人工智能的优势、人工智能的技术予以介绍。如果你对人工智能具有兴趣...

    07-08
  • 理解PID的控制原理

    很多朋友觉得PID是遥不可及,很神秘,很高大上的一种控制,对其控制原理也很模糊,只知晓概念性的层面,知其然不知其所以然,那么本期从另类视角来探究微分、积分电路的本质,意在帮助理解PID的控制原理

    06-27
  • SLAM的工作原理及应用场景

    SLAM(Simultaneous Localization and Mapping)技术,即同时定位与地图构建,是机器人和无人驾驶领域的核心技术之一。

    06-27
  • PID是一种什么“算法”?

    PID精彩好文!

    06-27
  • 嵌入式MCU和AI有什么关系?

    AI设计主要参与方都是功能强大的CPU,GPU和FPGA等。微型微控制器与强大的人工智能(AI)世界有什么关系?

    05-30
  • 一个故事讲清楚什么是卷积

    一文看懂卷积

    05-17
  • 全面理解伺服电机的定位

    伺服电机,作为自动化工业领域的核心动力组件,以其精确的位置、速度和扭矩控制能力,广泛应用于数据中心、机器

    05-17
  • 快速入门:掌握AIGC基本概念的方法

    AI大模型,或称为预训练大模型,是一种机器学习模型,具备处理各种信息(如图像、文字、声音等)的能力,并通过训练来完成复杂任务。

    05-15
  • 平衡二叉树AVL和KD-Tree的理解

    1.1 定义1.2 判断条件1.3 为什么要有平衡二叉树?

    05-11
  • 机器人IGV、AMR、IGV都是什么?

    这就来了解一下行走在工厂中的搬运机器人

    04-23
  • AI芯片的原理是什么?

    芯片是非常重要的电子器件之一,我们的手机和电脑等设备中都有芯片。为增进大家对芯片的认识,本文将对AI芯片的原理,以及AI芯片的重新配置予以介绍。如果你对芯片或是AI芯片具有兴趣,不妨和小编一起继续往下阅读...

    02-21
下载排行榜
更多
评测报告
更多
EE直播间
更多
广告