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!

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

  1. STM32机器人控制开发教程No.3 使用遥控控制电机/舵机(基于HAL库)

    01 前言 本教程使用的机器人控制板拥有4个带编码器的电机接口,4个舵机接口,串口通信接口.SWD下载调试接口.航模遥控接口.USB5V输出接口以及方便与树莓派直接连接的40PIN接口等,板载资源丰富 ...

  2. STM32外挂FLASH模拟U盘(基于HAL库)

    STM32外挂FLASH模拟U盘(基于HAL库) 1.背景 1.1这篇文章能给你带来什么 1.2根据你要解决的问题,精确快速跳转到相应位置 1.3我在做完这个后还有不明白的地方,希望能有大触解答困惑 ...

  3. STM32软件学习笔记(一)基于HAL库的STM32F429单片机串口打印程序

    |版权声明:本文为博主原创文章,转载请注明出处.https://blog.csdn.net/NeverImagine_/article/details/95517664   目前ST官方有提供两种库文 ...

  4. SAP UI5 应用开发教程之六十六 - 基于 OData V4 的 SAP UI5 表格控件如何实现删除功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  5. SAP UI5 应用开发教程之六十五 - 基于 OData V4 的 SAP UI5 表格控件如何实现创建,编辑和保存功能

    本教程前几个步骤,我们已经用 SAP UI5 table 控件开发了一个包含 User 列表的应用,并且支持了根据 LastName 字段进行查询,以及排序的操作. SAP UI5 应用开发教程之六十 ...

  6. SAP UI5 应用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)功能试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  7. SAP UI5 应用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)功能

    本教程的上一个步骤,我们学习了如何基于 OData V4 开发一个最简单的使用了 Table(表格)控件的 SAP UI5 应用. SAP UI5 应用开发教程之六十二 - 基于 OData V4 的 ...

  8. SAP UI5 应用开发教程之六十二 - 基于 OData V4 的 SAP UI5 表格控件使用方法介绍试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  9. 正点原子STM32(基于HAL库)0

    目录 开发环境搭建与使用 常用开发工具简介 MDK 安装 仿真器驱动安装 CH340 USB 虚拟串口驱动安装 使用MDK5 编译例程 使用串口下载程序 使用DAP 下载与调试程序 使用DAP 下载程 ...

最新文章

  1. NVIDIA之AI Course:Getting Started with AI on Jetson Nano—Class notes(一)
  2. c++17(33)-数值上下限、无穷、非数、中文字符串
  3. Android开发学习之路-环境搭建
  4. Python多线程下载网络URL图片的方法
  5. GO学习笔记 - Go 只有一种循环结构—— for 循环。
  6. 3-2 :eq(index)过滤选择器
  7. NHibernate文档翻译--体系结构
  8. javacript 字典
  9. Unity3D--枚举+协程控制定点移动
  10. linux思考与实验答案,linux课后习题答案教材课后习题参考答案
  11. 二叉搜索树的后序遍历序列验证
  12. NWT创业失败原因之层层分析
  13. StringUtils工具类常用方法汇总1(判空、转换、移除、替换、反转)
  14. 计算机五笔打字员,mac五笔打字软件 五笔打字员mac
  15. GUARDED_BY(c) 和 PT_GUARDED_BY(c)
  16. STM32单片机点亮流水灯
  17. C语言实现最大值、最小值、均值、标准差、峰值因子、方差和百分位数的计算
  18. 中山大学计算机博士_中山大学数据科学与计算机学院2019申请审核制博士招生简章...
  19. Flink结合Kafka实时写入Iceberg实践笔记
  20. 解决ubuntu 22.04上teamViewer/toDesk闪退等问题

热门文章

  1. winscp下载及安装教程
  2. for循环中的let 和 var
  3. 克服 iOS HTML5 音频的局限
  4. ConcurrentDictionary
  5. 洪涝灾害风险评估(持续更新)
  6. 【数据挖掘】BPNN初步应用-MNIST数据集
  7. 数据治理系列文章:(6)数据质量
  8. vue项目全局配置微信分享_Vue项目history模式下微信分享总结-个人文章-SegmentFault思否...
  9. 【微语】第二周(11.23~11.29)
  10. fluxion技术学习