stm32智能小车前进,后退,左转,右转,停止

本文代码使用 HAL 库。

文章目录

  • 前言
  • 一、电机模块介绍
  • 二、原理图分析
  • 三、电机驱动小车运动原理
      • 1. **小车前进,后退,停止**
      • 2,小车左转,右转
      • 3,左自旋,右自旋
  • 四,cubeMX 配置
  • 五,代码模块化编写
  • 总结

前言

  • 实验小车:STM32F103C8T6。
  • 所需软件:keil5 , cubeMX 。
  • 实验目的:了解 电机模块如何驱动小车运动。

一、电机模块介绍

TB6612模块是一种常见的双路直流电机驱动模块,广泛应用于机器人、无人机、智能小车等电机控制场景中。它采用TB6612FNG芯片作为驱动控制芯片,提供了可靠的电机驱动功能。
在这里插入图片描述

TB6612模块的主要特点和功能:

  1. 双路电机控制:TB6612模块可以同时控制两个直流电机的速度和方向。
  2. 高电流驱动:该模块的驱动电流可达最大1.2A,提供了足够的电流供应能力,适用于各种大小的直
    流电机驱动。
  3. 逻辑电平兼容:TB6612模块采用3.3V或5V逻辑电平兼容,可以直接与微控制器、Arduino等主控
    板连接。
  4. PWM控制:通过PWM信号可以精确地控制电机的转速,实现速度调节。

二、原理图分析

  1. TB6612电机驱动模块
    在这里插入图片描述
    在这里插入图片描述
    智能小车左右均有2个电机,由于左边两个电机的AO1是合并在一起的,AO2也是合并一起的。所以通过AO1 ,AO2 可以控制左边2个电机。同理,右边通过 BO1,BO2 可以控制右边2个电机。

TB6612 电机驱动模块通过AIN1,AIN2 控制左边2个电机BIN1,BIN2 控制右边2个电机

  1. stm32小车地板电路图
    在这里插入图片描述
    由上图可知:
  • 左电机控制
    AIN1 ------------> PB8
    AIN2 ------------> PB9
    PWMA ------------> PB7 (pwm 调速)

  • 右电机控制
    BIN1 ------------> PB5
    BIN2 ------------> PB4
    PWMB ------------> PB6(pwm 调速)

三、电机驱动小车运动原理

控制左右电机引脚输出高低电平控制 小车运行

1. 小车前进,后退,停止

0 : 引脚输出低电平。 1 : 引脚输出高电平。

驱动 左电机:
在这里插入图片描述
驱动 右电机:
在这里插入图片描述

2,小车左转,右转

小车右转 ------ > 左电机前进,右电机停止
小车左转 ------ > 左电机停止,右电机前进

在这里插入图片描述

3,左自旋,右自旋

小车右自旋 ------ > 左电机前进,右电机后退
小车左自旋 ------ > 左电机后退,右电机前进
在这里插入图片描述

四,cubeMX 配置

  1. 设置引脚:
    在这里插入图片描述
  2. 选择 定时器的PWM功能,便于电机调速
    在这里插入图片描述

五,代码模块化编写

采用模块化的编程,将 小车的电机驱动封装在一个驱动文件中。

motor.h:

#ifndef _MOTOR_H_
#define _MOTOR_H_/* 电机初始化 */
void motor_init(void);/* 左电机控制 */
void Left_motor(int mode, int speed);/* 右电机控制 */
void Right_motor(int mode, int speed);/* 小车运动,mode:1前进,2后退,3左转,4右转 */
void Car_sport(int mode, int speed);#endif

motor.c:

#include "motor.h"
#include "main.h"extern TIM_HandleTypeDef htim4;/* 电机初始化 */
void motor_init(void)
{// 开启 PWM 功能HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_2);
}/* 左电机控制,mode:1前进,2后退,0停止 */
void Left_motor(int mode, int speed)
{__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, speed);		//设置占空比 0~1000if(mode == 1){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);}else if(mode == 2){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);}else if(mode == 0){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);}
}/* 右电机控制,mode:1前进,2后退,0停止 */
void Right_motor(int mode, int speed)
{__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_2, speed);		//设置占空比 0~1000if(mode == 1){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);}else if(mode == 2){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);}else if(mode == 0){HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);}
}/* 小车运动,mode:1前进,2后退,3左转,4右转,5左自旋,6右自旋,0停止 */
void Car_sport(int mode, int speed)
{if(mode == 1)		{Left_motor(1,speed);Right_motor(1,speed);					// 前进}else if(mode == 2){Left_motor(2,speed);Right_motor(2,speed);					// 后退}else if(mode == 3){Left_motor(0,speed);Right_motor(1,speed);					// 左转}else if(mode == 4){Left_motor(1,speed);Right_motor(0,speed);					// 右转}else if(mode == 5){Left_motor(2,speed);Right_motor(1,speed);					// 左自旋}else if(mode == 6){Left_motor(1,speed);Right_motor(2,speed);					// 右自旋}else if(mode == 0){Left_motor(0,speed);Right_motor(0,speed);					// 停止}
}

总结

下篇文章为大家介绍 红外 避障。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/4468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基础款:Dockerfile 文件

# bash复制代码# 使用 Node.js 16 作为基础镜像 # 指定一个已经存在的镜像作为模版,第一条必须是from FROM node:16# 将当前工作目录设置为/app # WORKDIR /app# 方法一:用dockerfile命令:进行下载打包文件 # 将 package.json 和 package-loc…

机器人系统开发ros2-基础实践02-自定义一个机器人动作aciton服务端和客户端(c++ 实现)

aciton 是 ROS 中异步通信的一种形式。 操作客户端向操作服务器发送目标请求。 动作服务器将目标反馈和结果发送给动作客户端。 先决条件: 将需要上一个 教程创建操作action_tutorials_interfaces中定义的包和接口。Fibonacci.action 步骤1: 1.1 创建…

MySQL recursive 递归

MySQL 从最内的select开始执行,但是同一个select clause可以在查询的结果上继续查询。 SELECT menu_id,parent_id,(SELECT m1.parent_id FROM sys_menu AS m1 WHERE m1.menu_idm.parent_id) FROM sys_menu AS m WHERE m.menu_id 89 方案1.通过recursive递归 使用…

吴恩达2022机器学习专项课程(一) 6.2 逻辑回归第三周课后实验:Lab2逻辑回归

问题预览/关键词 逻辑回归预测分类创建逻辑回归算法Sigmoid函数Sigmoid函数的表示sigmoid输出的结果Numpy计算指数的方法实验python实现sigmoid函数打印输入的z值和sigmoid计算的值可视化z值和sigmoid的值添加更多数据,使用逻辑回归可以正常预测分类![在这里插入图片…

ESP32-S3如何用socket通信

实验目的: 通过 Socket 编程实现 pyWiFi-ESP32-S3 与电脑服务器助手建立连接,相互收 发数据。 首先先来简单了解一下Socket 我们先来看看网络层级模型图,这是构成网络通信的基础: 我们看看 TCP/IP 模型的传输层和应用层&…

SpringBoot + Vue实现Github第三方登录

前言:毕业设计终于好了,希望能有空多写几篇 1. 获取Github账号的Client ID和Client secrets 首先点击这个链接进入Github的OAuth Apps页面,页面展示如下: 之后我们可以创建一个新的apps: 填写资料: 创建之后就可以获…

WhatsApp解封方法和防封技巧分享,内附解封话术!

WhatsApp 已成为外贸人员不可或缺的沟通工具,它不仅加速了全球范围内的客户沟通,还提供了一个方便快捷的社交媒体营销平台。然而,面对WhatsApp账号被封的问题,许多外贸人常常感到束手无策。本文旨在分享有效的WhatsApp解封方法&am…

西湖大学赵世钰老师【强化学习的数学原理】学习笔记2节

强化学习的数学原理是由西湖大学赵世钰老师带来的关于RL理论方面的详细课程,本课程深入浅出地介绍了RL的基础原理,前置技能只需要基础的编程能力、概率论以及一部分的高等数学,你听完之后会在大脑里面清晰的勾勒出RL公式推导链条中的每一个部…

BKP备份寄存器RTC实时时钟

文章目录 BKP简介相关引脚BKP基本结构 RTC简介RTC框图三种时钟源RTC基本结构 硬件电路RTC操作注意事项 BKP简介 BKP(Backup Registers)备份寄存器BKP可用于存储用户应用程序数据。当VDD(2.0~ 3.6V)电源被切断,他们仍然…

【QT】ROS2 Humble联合使用QT教程

【QT】ROS2 Humble联合使用QT教程 文章目录 【QT】ROS2 Humble联合使用QT教程1. 安装ROSProjectManager插件2. 创建ROS项目3.一个快速体验的demoReference 环境的具体信息如下: ubunt 22.04ros2 humbleQt Creator 13.0.0ROS ProjectManager 13.0.0 本文建立在已经…

MT3030 天梯赛

跟MT3029战神小码哥类似,都是贪心堆。注意开long long 这里的堆顶为战斗力最小的,便于贪心的反悔操作。先按容忍度从大到小排序(q中总容忍度取决于最小的容忍度),再向q中存数,存到不能容忍之后再把堆顶踢出…

深度学习-线性回归+基础优化算法

目录 线性模型衡量预估质量训练数据参数学习训练损失最小化损失来学习参数显式解 总结基础优化梯度下降选择学习率 小批量随机梯度下降选择批量大小 总结线性回归的从零开始实现实现一个函数读取小批量效果展示这里可视化看一下 线性回归从零开始实现线性回归的简洁实现效果展示…

静态住宅IP代理VS动态住宅IP代理,该如何选择?

在网络安全和数据采集领域,代理服务已经成为一个必不可少的工具。在IP代理服务中,静态住宅代理和动态住宅代理是两种常见的代理类型。今天就为大家详细介绍静态住宅代理与动态住宅代理的差异。 首先我们来看什么是静态住宅IP,这种IP地址可以被…

硅酸盐玻璃反应离子刻蚀在光学微系统的应用前景

引言 微光学元件和复杂光学微系统需要超精密制造工艺。最大容许粗糙度由所用波长λ的分数定义,例如λ或更好,而元件的整体尺寸和形状可以容易地达到毫米或厘米范围。在RIE过程中,材料传输是通过离子和反应气体与等离子体反应器表面的物理和化…

Spring Boot项目中的ASCII艺术字

佛祖保佑: ${spring-boot.formatted-version} ———————————————————————————————————————————————————————————————————— // _ooOoo_ …

分享爱,分享精彩瞬间,分享5款实用软件

分享爱,分享时光,分享精彩瞬间,大家好,我是互联网的搬运工,今天继续给大家带来几款好用的软件。 1. 数据分析——Chartistic ​ Chartistic是一款功能强大的数据分析可视化工具,它提供了丰富的图表类型和…

C语言操作符和关键字

文章目录 操作符单目操作符sizeof(类型)强制类型转换 关系操作符、逻辑操作符、条件操作符逗号表达式 常见关键字typedefstaticstatic修饰局部变量static修饰全局变量static修饰函数 register寄存器关键词define定义常量和宏 操作符 单目操作符 C语言中…

R-Tree原理及实现代码

目录 一.引言 二.R-Tree的基本原理 插入操作 查询操作 删除操作 平衡操作 三. 节点分裂 线性分裂 二次分裂 增量分裂 四.查询 范围查询 最近邻查询 五.最新研究进展 六.C语言实现示例 七. 实际案例分析 八.总结 一.引言 在计算机科学领域,R-Tree是…

基于 Spring Boot 博客系统开发(一)

基于 Spring Boot 博客系统开发(一) 本系统是简易的个人博客系统开发,为了更加熟练地掌握SprIng Boot 框架及相关技术的使用。🤓🤓🤓 基于 Spring Boot 博客系统开发(二)&#x1f4…

聊聊.NET Core处理全局异常有那些方法

简述 处理全局异常的方法有IExceptionFilter(异常处理),使用中间件异常处理,使用框架自带异常中间件等。考点 考察对异常处理方式的熟悉程度和广度,以及对中间件、过滤器熟练程度。 下面分别具体介绍三种处理异常的…