STM32机器人控制开发教程No.1驱动电机(基于HAL库)

01 前言

本教程使用的机器人控制板拥有4个带编码器的电机接口,4个舵机接口,串口通信接口、SWD下载调试接口、航模遥控接口、USB5V输出接口以及方便与树莓派直接连接的40PIN接口等,板载资源丰富,方便调试!可以控制两轮、四轮差速及阿克曼转向机器人/小车。

驱动板的正面:

驱动板的反面:

与树莓派连接的效果,省去额外的串口通信连线及电源线,化繁为简:

02 机器人小车电机驱动开发——让小车跑起来!
 

使用STM32CubeMX配置工程文件。STM32CubeMX是意法半导体(ST)官方推荐的STM32芯片图形化配置工具,使用者可以使用图形化向导生成基于HAL库的初始化代码,大大减轻了开发前期的初始化配置需要的时间,极大的提高了开发者的效率!

第一步:

  • 打开STM32CubmeMX,选择新建NewProject,并选择使用的芯片型号,机器人控制板使用的芯片为STM32F103RCT6。

第二步:

  • 进行芯片的初始化配置。

在左栏的System Core中选择RCC时钟设置,选择高速时钟并且使用外部晶振

在SYS中进行调试的配置,在Debug下拉中选择Serial Wire,此处时钟源选择SysTick即可。

在Clock Configuration中进行时钟树的设置,将HCLK的频率设置为72MHz,输入72并回车确认即可,软件会自动完成内部倍频的设置。

 前两步操作在大部分STM32的裸机开发过程中均可适用,当加入RTOS时需要注意系统时钟源的选择。

第三步:

  • 完成上述两步后,就可以根据NANO驱动板的原理图,找到对应的接口进行配置,开始驱动电机!

本次设计的机器人控制板自带TB6612FNG电机驱动芯片,通过TB6612FNG芯片可以驱动电机完成正反转以及PWM调速的功能。

如图左边绿框为连接电机的输出引脚,右边红框内为连接STM32的驱动引脚,1个TB6612FNG芯片可以实现对两路电机的控制。在原理图中找到STM32对应的引脚,进行初始化的配置。

在STM32CubeMX中找到PC6、PC7引脚,选择作为定时器8的通道1和通道2使用,当未完成初始化配置时,管脚的颜色为黄色,完成相关的初始化配置后,管脚颜色变为绿色。

在左栏的Timers中选择TIM8,Clock Source选择内部时钟Internal Clock,然后选择打开通道1与通道2的PWM输出模式,在下方的参数设置中填入预分频数(psc)和自动重装载值(arr),输出的PWM频率

frequency=sysclk/(psc+1)*(arr+1)

在本次测试中,根据使用的减速电机,设置PWM的输出频率为18KHz,根据上述公式可以计算得到,并将两个通道都设置为PWM1模式

18,000=72,000,000/(3+1)*(999+1)

完成相应的初始化配置后,可以看到右边的PA6和PA7管脚已经变为绿色。

配置完定时器后,还需要配置用于控制电机正反转的两组引脚,分别为AIN1和AIN2、BIN1和BIN2,对应为STM32的PC0~PC3管脚,将其配置成为普通的输出管脚即可。

第四步:

  • 生成工程文件

切换到Project Manager界面,自定义工程名称,工程存放路径等,这里选择使用ST官方的STM32CubeIDE作为程序开发。

第五步:

  • 编写电机驱动程序

使用STM32CubeIDE打开生成的工程文件,在USER CODE BEGIN 0下编写电机控制的相关函数

/**
*    @brief 控制电机进行正转、反转、停止
*    @param None
*    @retval None
*/
void LeftMotor_Go() //左电机正转 AIN输出相反电平  BIN也输出相反电平
{
    HAL_GPIO_WritePin(Dir_Port,AIN1,GPIO_PIN_SET);
    HAL_GPIO_WritePin(Dir_Port,AIN2,GPIO_PIN_RESET);
}
void LeftMotor_Back()  //左电机反转
{
    HAL_GPIO_WritePin(Dir_Port,AIN1,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(Dir_Port,AIN2,GPIO_PIN_SET);
}
void LeftMotor_Stop()  //左电机停止 AIN和BIN输出相同电平
{
    HAL_GPIO_WritePin(Dir_Port,AIN1,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(Dir_Port,AIN2,GPIO_PIN_RESET);
}
void RightMotor_Go() //右电机正转 AIN输出相反电平  BIN也输出相反电平
{
    HAL_GPIO_WritePin(Dir_Port,BIN1,GPIO_PIN_SET);
    HAL_GPIO_WritePin(Dir_Port,BIN2,GPIO_PIN_RESET);
}
void RightMotor_Back()  //右电机反转
{
    HAL_GPIO_WritePin(Dir_Port,BIN1,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(Dir_Port,BIN2,GPIO_PIN_SET);
}
void RightMotor_Stop()  //右电机停止 AIN和BIN输出相同电平
{
    HAL_GPIO_WritePin(Dir_Port,BIN1,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(Dir_Port,BIN2,GPIO_PIN_RESET);
}

/**
*    @brief 控制电机进行速度控制
*    @param 运动方向,左右电机的PWM值
*    @retval None
*/
void MotorControl(char motorDirection,int leftMotorPWM, int rightMotorPWM)
{
    switch(motorDirection)
        case 0:
            LeftMotor_Go();
            RightMotor_Go();
         __HAL_TIM_SET_COMPARE(motor_TIM,leftMotorChannle,leftMotorPWM);
         __HAL_TIM_SET_COMPARE(motor_TIM,rightMotorChannle,rightMotorPWM);break;
    case 1:
        LeftMotor_Bcak();
        RightMotor_Back();
        __HAL_TIM_SET_COMPARE(motor_TIM,leftMotorChannle,leftMotorPWM);
        __HAL_TIM_SET_COMPARE(motor_TIM,rightMotorChannle,rightMotorPWM);break;
    case 2:
        LeftMotor_Stop();
        RightMotor_Stop();
        __HAL_TIM_SET_COMPARE(motor_TIM,leftMotorChannle,0);
        __HAL_TIM_SET_COMPARE(motor_TIM,rightMotorChannle,0);break;
    default:break;
}

驱动的部分主函数如下:(以下示例省略了由STM32CubeMX自动生成的配置函数,具体驱动参考例程文件)

int main()
{
    while(1)
    {
      MotorControl(0,500,500); //直行
      HAL_Delay(2000);
      MotorControl(2,0,0); //停止
       HAL_Delay(2000)
      MotorControl(1,500,500); //后退
        HAL_Delay(2000);
      MotorControl(0,0,200);  //前进左转
        HAL_Delay(2000);
      MotorControl(0,200,0);  //前进右转
        HAL_Delay(2000);
      MotorControl(1,0,200);  //左转退回
        HAL_Delay(2000);
      MotorControl(1,200,0);  //右转退回
        HAL_Delay(2000);
    }
}

第六步:

  • 将调试好的程序下载到机器人控制板上并驱动小车动

使用ST-LINK或J-LINK  连接驱动板上的SWD接口,将程序烧写到板上,按下复位键,将小车置于平地上,就可以看到小车按照代码的设定开始跑动了!

03 用舵机进行转向

上述驱动例程是根据左右两轮速度差(差速)完成左转弯和右转弯功能

但不要忘了NANO驱动板上还具有舵机接口!因此小车的转弯也可以通过舵机实现,加入舵机的控制只  要对驱动稍作修改即可!下面为大家讲解如何驱动阿克曼小车。

打开STM32CubeMx,找到舵机对应接口,将其设置为PWM输出模式

一般舵机的控制频率为50Hz~100Hz,即10ms~20ms,我们可以根据上文提到的频率计算方法,设置需要的PSC和ARR值,将其控制频率设置为50Hz,即20ms。

72,000,000/(719+1)*(1999+1)=50Hz

舵机的控制角度在0° ~ 180°,脉宽范围为0.5ms ~ 2.5ms,通过计算,将期望转动的角度值转化为PWM的占空比,将90°作为中位值,即左转范围为0° ~ 90°,右转范围为90° ~ 180°。

void Set_Servo_angle(TIM_HandleTypeDef * htim,uint32_t Channel,uint8_t angle)
{
    uint16_t compare_value=0;
    if(angle <= 180)  //限制角度为180°
    {
        compare_value=0.5*2000/20+angle*2000/20/90;  //角度转化为数值
        __HAL_TIM_SET_COMPARE(htim, Channel, compare_value);
    }

驱动的部分主函数如下:(以下示例省略了由STM32CubeMX自动生成的配置函数,具体驱动参考例程文件)

int main()
{
    MotorControl(0,500,500); //设定电机初始速度
    while(1)
    {
        Set_Servo_angle(&htim4,TIM_CHANNEL_3,60); //左转30°
        HAL_Delay(2000);
        Set_Servo_angle(&htim4,TIM_CHANNEL_3,90);  //方向回正
        HAL_Delay(2000); Set_Servo_angle(&htim4,TIM_CHANNEL_3,120);    //右转30° 
        HAL_Delay(2000);
    }
}

04 转向效果演示
 

电机差速转向:

 舵机阿克曼转向:

在本篇文章中主要演示了机器人控制板控制电机运动、舵机转向的一些基本功能,但这块控制板还能做 更多事情,在下一篇文章中,将继续为你演示如何利用这款机器人控制板实现电机编码器测速和电机的PID控制!

欢迎加入我们的交流群,该群面向热爱机器人研发的朋友们,方便大家一起学习、分享、交流智能机器人创造,结识更多志同道合的小伙伴。更有不定期的社区专属福利哦!关注公众号(COONEO)即可获取入群方式。

创作不易,如果喜欢这篇内容,请您也转发给您的朋友,一起分享和交流创造的乐趣,也激励我们为大家创作更多的机器人研发攻略,让我们一起learning by doing!

猜你喜欢

转载自blog.csdn.net/COONEO/article/details/125764627