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,一经查实,立即删除!

相关文章

DeFi 基础知识:去中心化金融及其运作方式

文章目录 一、金融的演变:从传统到去中心化二、了解价值主张:为什么选择 DeFi?三、DeFi 基础知识:区块链和智能合约3.1 权力下放:权力归于人民3.2 无需信任的系统和点对点交易3.3 公开透明的账本:区块链的作…

基础款: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的值添加更多数据,使用逻辑回归可以正常预测分类![在这里插入图片…

IP地址的地理位置如何确定?

IP地址的地理位置确定是一个复杂且多步骤的过程,它依赖于多种技术和数据源来实现。下面将详细解释IP地址地理位置是如何被确定的。 首先,我们需要了解IP地址的基本结构。IP地址由一串数字组成,用于标识网络中的设备。这些数字实际上代表了设…

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…

大宋咨询(深圳第三方绩效评估)谈关于消费者满意度研究的概念

消费者满意度研究是一种评估消费者对于特定产品、服务或购物体验的满意程度的方法。它旨在了解消费者在购买和使用过程中的感受、意见和反馈,从而衡量企业的产品、服务质量以及顾客关系管理的效果。消费者满意度研究对于企业了解消费者需求、改进产品和服务&#xf…

使用Selenium爬取目标网站被识别的解决之法

在进行网络数据抓取和爬取时,Selenium是一个常用的工具,它可以模拟人类用户的行为,自动化地操作浏览器进行页面的访问和数据的提取。然而,随着网站对爬虫的检测能力不断提升,很多爬虫程序在运行过程中经常会遭遇被目标…

[DEMO]给两个字符串取交集的词语

要求:2个英文字符串中,取相同的大于等于4个字母的词组 比如: 字符串1:" xingMeiLingabcdef WorldHello", 字符串2:"mnjqlup WorldLingLing xingMeiLingHello" 获取交接: [xingMeiLing…

Faiss:高效相似性搜索与聚类的利器

Faiss 是一个针对大规模向量集合的相似性搜索库,由 Facebook AI Research 开发。它提供了一系列高效的算法和数据结构,用于加速向量之间的相似性搜索,特别是在大规模数据集上。本文将介绍 Faiss 的原理、核心功能以及如何在实际项目中使用它。…

Vue3 中 defineProps 怎么设置默认值?

在 Vue3 中,我们经常需要使用 defineProps 来定义组件的属性,但是如何设置这些属性的默认值呢? 这是一个常见的问题,特别是在开发过程中,我们希望能够为组件的属性提供一些默认值,以便在未传递属性值时能够…

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

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

LangChain入门教程 - 基本问答

自己的学习记录,想到哪里写到哪里。下面用LC指代LangChain。更详细的内容请查看LangChain中文网。 LLM和ChatModel有什么区别? 这是使用LC首先会遇到的问题。 在 Langchain 中,ChatModel 和 LLM(Large Language Model&#xff…

鸿蒙原生应用元服务开发-Web管理位置权限

Web组件提供位置权限管理能力。开发者可以通过onGeolocationShow()接口对某个网站进行位置权限管理。Web组件根据接口响应结果,决定是否赋予前端页面权限。获取设备位置,需要开发者配置ohos.permission.LOCATION权限。 在下面的示例中,用户点…

BKP备份寄存器RTC实时时钟

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

【数学题】俄罗斯竞赛题笔算开平方√446224

这里写目录标题 一级目录二级目录三级目录 一、题目二、解题方式1:设元配方三、解题方式2:逐位逼近①因式分解②数字范围分析③求十位③求个位④整理 四、解题方式3:逐位逼近2①因式分解②数字范围分析③假设个位是3,设十位m,则③…

学生管理系统代码

学生管理系统代码 好好看&#xff0c;好好学&#xff0c;知识点的部分看不懂就多查。 内容很多&#xff0c;仔细看。 #include <stdio.h> #include <stdlib.h> #define M 100 #define N 10//定义学生相关信息结构体 typedef struct stu {char sn[13];char name[9…