毕业设计| 球上自平衡机器人

发布时间:2023-04-26  

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

保持动态平衡过程需要对机器人进行运动学分析

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

# 控制器设计 #

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

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


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


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


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


# 硬件及结构设计 #

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

56mm全向轮 45元/个

42步进电机 25/个

42步进闭环模块 59.8元/个

LM2596S降压模块 20元

STM32F103C8T6-4飞控板 59.8元

GY-521六轴陀螺仪 25元


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

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

Image


# 程序部分 #

在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);  

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>