不骗你,一看就会的机器人电机驱动教程!

01 前言

之前,我们出了一系列的STM32机器人控制开发教程,收到不少小伙伴的反馈,于是我们对教程进行了优化,并将增加新的内容和工具。

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

机器人驱动板:

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

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

使用STM32CubeIDE搭建开发环境。

第一步:

  • STM32CubeIDE集成了STM32CubeMX,可以直接打开STM32CubeIDE,选择新建STM32 Project,自定义工程名称,工程文件类型选择STM32Cube,之后进入STM32CubeMX界面,选择使用的芯片型号,机器人控制板使用的芯片为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界面,Project的内容设置如下,选择使用ST官方的STM32CubeIDE作为程序开发。

Code Generator中勾选生成单独一对.c/.h文件。

完成以上步骤之后按住ctrl+s快捷键即可生成程序。

对生成的程序进行编译,显示没有错误即可继续下一步。

第五步:

  • 编写电机驱动程序

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_Back();        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,500);  //前进左转        HAL_Delay(2000);      MotorControl(0,500,0);  //前进右转        HAL_Delay(2000);      MotorControl(1,0,500);  //左转退回        HAL_Delay(2000);      MotorControl(1,500,0);  //右转退回        HAL_Delay(2000);    }}

第六步:

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

可以使用ST-LINK或J-LINK  连接驱动板上的SWD接口,将程序烧写到板上。

这里我们再给大家介绍一款工具:STM32CubeProgrammer。该工具提供多种烧录模式,并支持多种生成文件格式。将ST-LINK 连接驱动板上的SWD接口,打开生成的.elf文件,将程序烧写到板上,烧写成功之后,按下板子上的复位键,将小车置于平地上,就可以看到小车按照代码的设定开始跑动了!

演示效果如下:

03

用舵机进行转向

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

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

STM32CubeIDE中打开STM32CubeMx的文件(后缀为.ioc),找到舵机对应接口,将其设置为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控制!

代码?这里:GitHub - COONEO/NEOR-nano

猜你喜欢

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