STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!

这篇具有很好参考价值的文章主要介绍了STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

01 前言

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

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

机器人驱动板:

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

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

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

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

使用STM32CubeIDE搭建开发环境。

第一步:

  • STM32CubeIDE集成了STM32CubeMX,可以直接打开STM32CubeIDE,选择新建STM32 Project,自定义工程名称,工程文件类型选择STM32Cube,之后进入STM32CubeMX界面,选择使用的芯片型号,机器人控制板使用的芯片为STM32F103RCT6。

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

第二步:

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

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

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

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

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

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

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

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

第三步:

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

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

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

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

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

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

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

在左栏的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)

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

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

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

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

第四步:

  • 生成工程文件

切换到Project Manager界面,Project的内容设置如下,选择使用ST官方的STM32CubeIDE作为程序开发。

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

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

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

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

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

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

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

第五步:

  • 编写电机驱动程序

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文件,将程序烧写到板上,烧写成功之后,按下板子上的复位键,将小车置于平地上,就可以看到小车按照代码的设定开始跑动了!

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

演示效果如下:

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

03

用舵机进行转向

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

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

STM32CubeIDE中打开STM32CubeMx的文件(后缀为.ioc),找到舵机对应接口,将其设置为PWM输出模式

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

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

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

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

舵机的控制角度在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 使用舵机转向效果演示

STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!,stm32,单片机,机器人,驱动开发,c语言

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

代码?这里:GitHub - COONEO/NEOR-nano文章来源地址https://www.toymoban.com/news/detail-754443.html

到了这里,关于STM32两轮差速/阿克曼转向机器人/小车电机驱动教程!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 「算法小记」-1:Ackermann函数/阿克曼函数的一点思考解法【递归/非递归/堆栈方法】(C++ )

    😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:程序员洲洲。 🎈 本文专栏:本文收录于洲洲的《算法小记》系列专栏,该专栏记录了许

    2024年02月08日
    浏览(32)
  • 【ROS2机器人入门到实战】Gazebo仿真插件之两轮差速

    当前平台文章汇总地址:ROS2机器人从入门到实战 获取完整教程及配套资料代码,请关注公众号鱼香ROS获取 教程配套机器人开发平台:两驱版| 四驱版 为方便交流,搭建了机器人技术问答社区:地址 fishros.org.cn 小鱼又来了,完成了上节课的Gazebo加载FishBot,但是机器人还是不

    2024年02月03日
    浏览(32)
  • 两轮差速移动机器人从A点移动到B点的C++语言代码

    (⊙﹏⊙)如下同样是AI撰写。 您可以使用两轮差速移动机器人的控制代码来控制它从A点移动到B点。可以使用各种语言,如C,C++,Python等来编写控制代码。 从A点移动到B点的C代码应该是:moveToB(A,C); 差动运动学模型机器人从A点移动到B点的C语言代码是一种基于位置、速度和加

    2024年02月09日
    浏览(30)
  • STM32两轮平衡小车原理详解(开源)

    关于STM32两轮平衡车的设计,我想在读者阅读本文之前应该已经有所了解,所以本文的重点是代码的分享和分析。至于具体的原理,我觉得读者不必阅读长篇大论的文章,只需按照本文分享的代码自己亲手制作一辆平衡车,其原理并不言而喻了。 源完整代码工程在文章末尾百

    2024年02月05日
    浏览(35)
  • STM32控制直流电机转向

    一、所需硬件模块 1.主控芯片:STM32F103C8T6 2.程序下载器:STLINK 3.电机:直流电机 4.电机驱动模块:L298N 二、模块介绍 1、主控芯片采用的是STM32系列的最小系统板,通过控制其引脚的输出进而实现对电机的控制; 2、STLINK下载器是用于烧录程序,其中的SWCLK、SWDLO、GND、3.3V引脚

    2024年02月07日
    浏览(25)
  • STM32单片机智能小车一PWM方式实现小车调速和转向

    目录 1. 电机模块开发 2. 让小车动起来 3. 串口控制小车方向 4. 如何进行小车PWM调速 5. PWM方式实现小车转向 L9110s概述 接通VCC,GND 模块电源指示灯亮, 以下资料来源官方,具体根据实际调试 IA1输入高电平,IA1输入低电平,【OA1 OB1】电机正转; IA1输入低电平,IA1输入高电平,

    2024年02月07日
    浏览(37)
  • 移动机器人底盘-四轮差速模型(四轮独立)

    四轮差速模型底盘实例如下图所示。对于底盘的前轮和后轮来说,其速度是同步的,那么在理想条件下,可以将底盘运动视为以ICR为圆心做圆周运动,对于四个轮子来说,圆周运动的角速度是一致的,圆周运动圆心ICR始终位于底盘几何中心COG的y轴延长线上,ICR与COG之间的距离

    2024年02月09日
    浏览(37)
  • 小型双轮差速底盘机器人实现红外跟随功能

            本文示例将实现R023样机小型双轮差速底盘跟随人移动的功能。在小型双轮差速底盘前方按下图所示安装3个  近红外传感器 ,制作一个红外线发射源,实现当红外发射源在机器人的检测范围内任意放置或移动时,机器人能追踪该发射源。 在这个示例中,我们采用了以

    2024年02月14日
    浏览(37)
  • 差速驱动机器人的车轮里程计模型

            车轮测程法是指使用旋转编码器(即连接到车轮电机以测量旋转的传感器)的测程法(即估计运动和位置)。这是轮式机器人和自动驾驶汽车定位的有用技术。         在本文中,我们将通过探索差速驱动机器人的

    2024年02月15日
    浏览(29)
  • 纯跟踪算法(Pure Pursuit)在差速机器人上的应用

    Pure Pursuit 是一种路径跟踪算法。 在给定线速度的前提下,它计算移动的角速度令机器人从其当前位置到达机器人前方的某个前瞻点(lookahead)。该算法根据机器人的当前位置不断地追着它前面的一个点,直到路径的最后一个点。 1.差速轮模型  差速轮模型中:         2

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包