当前位置: 首页 > news >正文

(二)【平衡小车制作】电机驱动(超详解)

一、硬件设计

1.直流减速电机
  直流减速电机,即齿轮减速电机,是在普通直流电机的基础上,
加上配套齿轮减速箱。齿轮减速箱的作用是,提供较低的转速,较大的力矩。
  简单的来说,STM32分配两个IO口给一个直流减速电机,并给予高低电平,来使得电机进行正转或反转

在这里插入图片描述

我用的电机为GM25-370直流减速电机(带霍尔编码器),工作电压:6-24VDC,额定电压12V,额定电流0.65A,空载转速350RPM,额定功率5W,最大精度,1496CPR,配备 CPR霍尔AB两相编码器,减速后输出单圈374个正交脉冲。

2.TB6612FNG电机驱动芯片

        要实现小车的转向与前进后退控制,我们可以使用STM32实现,但是STM32的IO口带负载能力较弱,而直流电机是大电流感性负载,所以我们需要功率放大器件,在这里,我选择使用TB6612FNG这款电机驱动芯片。
  TB6612FNG 是东芝半导体公司生产的一款直流电机驱动器件,它具有大电流MOSFET-H 桥结构,双通道电路输出,可同时驱动 2 个电机。相比于 L298N的热耗性和外围二极管续流电路,TB6612FNG无需外加散热片,外围电路简单,只需外接电源滤波电容就可以直接驱动电机,利于减小系统尺寸。对于PWM信号输入频率范围,我采用10KHz的频率,并通过改变占空比调节电机的速度。

平衡小车中使用到的引脚:
  电机1——PB12/PB13
  电机2——PB14/PB15
  PWM1——PA8
  PWM2——PA11

在这里插入图片描述

在这里插入图片描述 

3.H桥驱动电路

        上面说到TB6612FNG 具有大电流MOSFET-H桥结构,那么很多小伙伴想问:什么是H桥结构呢?我以下面两张图举例,帮助大家简单化理解H桥电路结构。
注:图中的电路Q1,Q2,Q3,Q4为三极管,而TB6612内部集成的是四个MOSFET,我以下图举例,大家不可把下图看做是TB6612内部电路,其内部电路可查看TB6612的参考手册。
 

① 当Q1,Q4导通,Q2,Q3关断时,电流从Q1,从电机正极通过电机负极,再从Q4流出,完成一条回路,电机Motor正转。

在这里插入图片描述

 ① 当Q2,Q3导通,Q1,Q4关断时,电流从Q3,从电机负极通过电机正极,再从Q2流出,完成一条回路,电机Motor反转。

在这里插入图片描述

二、软件编程

1.电机驱动函数——motor.c
1)电机GPIO初始化函数
 入口参数:

  • 初始化GPIO–PB12、PB13、PB14、PB15为推挽输出
void Motor_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);// 开启时钟GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;// 初始化GPIO--PB12、PB13、PB14、PB15为推挽输出GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStruct);	
}

2)限幅函数
 入口参数:电机A脉冲个数,电机B脉冲个数

  • 限制电机的脉冲个数在规定范围内,有个最值,即自动重装载值(我设置的是PWM_MAX = 7200,PWM_MIN = -7200)
void Limit(int *motoA,int *motoB)
{if(*motoA>PWM_MAX)*motoA=PWM_MAX;if(*motoA<PWM_MIN)*motoA=PWM_MIN;if(*motoB>PWM_MAX)*motoB=PWM_MAX;if(*motoB<PWM_MIN)*motoB=PWM_MIN;
}

 3)绝对值函数(非常通用,建议保存!!)
 入口参数:常规变量

  • 通过与0比较,大于0则返回不变的值,小于0则返回相反的值。
int abs(int p)
{int q;q=p>0?p:(-p);return q;
}

4)赋值函数
 入口参数:电机A脉冲个数,电机B脉冲个数

  • 入口参数即为PID运算完成后的最终PWM值(后续会讲解PID算法的实现)
void Load(int moto1,int moto2)
{//1.研究正负号,对应正反转if(moto1>0)	Ain1=1,Ain2=0;//正转else 				Ain1=0,Ain2=1;//反转//2.研究PWM值TIM_SetCompare1(TIM1,abs(moto1));//1.研究正负号,对应正反转if(moto2>0)Bin1=1,Bin2=0;else 				Bin1=0,Bin2=1;	//2.研究PWM值TIM_SetCompare4(TIM1,abs(moto2));
}

2.电机驱动函数头文件——motor.h

#ifndef  _MOTOR_H
#define  _MOTOR_H#include "sys.h" #define Ain1  PBout(14)
#define Ain2  PBout(15)#define Bin1  PBout(13)
#define Bin2  PBout(12)void Motor_Init(void);
void Limit(int *motoA,int *motoB);
int abs(int p);
void Load(int moto1,int moto2);
#endif

3.PWM函数——pwm.c

1. 定时器初始化函数
 入口参数:预分频值,自动重装载值

  • PA8,PA11复用推挽输出
  • 对应定时器1通道1和通道4
  • 开启MOE主输出使能(高级定时器特有!!!)
void PWM_Init_TIM1(u16 Psc,u16 Per)
{GPIO_InitTypeDef GPIO_InitStruct;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_OCInitTypeDef TIM_OCInitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1 | RCC_APB2Periph_AFIO,ENABLE);//开启时钟GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;        // 初始化GPIO--PA8、PA11为复用推挽输出GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8 | GPIO_Pin_11;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);  // 初始化定时器。TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period=Per;TIM_TimeBaseInitStruct.TIM_Prescaler=Psc;TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct);   // TIM1TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;      // 初始化输出比较TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;TIM_OCInitStruct.TIM_Pulse=0;TIM_OC1Init(TIM1,&TIM_OCInitStruct);TIM_OC4Init(TIM1,&TIM_OCInitStruct);TIM_CtrlPWMOutputs(TIM1,ENABLE);// 高级定时器专属!!!--MOE主输出使能TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);// OC1预装载寄存器使能TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);// OC4预装载寄存器使能TIM_ARRPreloadConfig(TIM1,ENABLE);// TIM1在ARR上预装载寄存器使能TIM_Cmd(TIM1,ENABLE);           // 开定时器。
}

4.PWM函数头文件——pwm.h

#ifndef  _PWM_H
#define  _PWM_H#include "sys.h" void PWM_Init_TIM1(u16 Psc,u16 Per);
#endif

以上就是平衡小车系列文章第二讲——电机驱动,包括硬件结构讲解和STM32软件编程的讲解,文章中出现错误或者小伙伴对以上内容有所疑问,欢迎大家在评论区留言,小政看到后会尽快回复大家!

相关文章:

(二)【平衡小车制作】电机驱动(超详解)

一、硬件设计 1.直流减速电机   直流减速电机&#xff0c;即齿轮减速电机&#xff0c;是在普通直流电机的基础上&#xff0c;加上配套齿轮减速箱。齿轮减速箱的作用是&#xff0c;提供较低的转速&#xff0c;较大的力矩。  简单的来说&#xff0c;STM32分配两个IO口给一个…...

快速了解车联网V2X通信

自动驾驶拥有极其巨大的潜力&#xff0c;有可能改变我们的出行方式。它不仅有望永远改变车辆的设计和制造&#xff0c;还会永远改变汽车的所有权乃至整个交通运输业务。要实现全自动驾驶的目标&#xff0c;开发人员需要开发极为复杂的软件&#xff0c;软件中融入的人工智能(AI)…...

「Codeforces」D. Infinite Set

D. Infinite Set https://codeforces.com/contest/1635/problem/D 题目描述 你有一个由不同正整数组成的数组和一个无限集 S&#xff0c;现在你需要往集合 S 中塞入所有符合 x x x 条件的数。 x x x 的条件&#xff08;满足其中任意一个即可&#xff09;&#xff1a; x a i …...

项目---基于TCP的高并发聊天系统

目录 服务端 服务端视角下的流程图 一、数据库管理模块 1.1 数据库表的创建 1.2 .对于数据库的操作 1.2.1首先得连接数据库 1.2.2执行数据库语句 1.2.3 返回数据库中存放的所有用户的信息 1.2.4返回数据库中存放的所有用户的好友信息 二、用户管理模块 2.1、UserInfo类&…...

iOS热更新-8种实现方式

一、JSPatch 热更新时&#xff0c;从服务器拉去js脚本。理论上可以修改和新建所有的模块&#xff0c;但是不建议这样做。 建议 用来做紧急的小需求和 修复严重的线上bug。 二、lua脚本 比如&#xff1a; wax。热更新时&#xff0c;从服务器拉去lua脚本。游戏开发经常用到。…...

R语言 | 编写自己的函数

目录 一、正式编写程序 二、设计第一个函数 三、函数也是一个对象 四、程序代码的简化 五、return()函数的功能 六、省略函数的大括号 七、传递多个参数函数的应用 7.1 设计可传递2个参数的函数 7.2 函数参数的默认值 7.3 3点参数“…”的使用 八、函数也可以作为参数 …...

【Java校招面试】基础知识(七)——数据库

目录 前言一、数据库索引二、数据库锁三、数据库事务四、数据库连接池后记 前言 本篇主要介绍数据库的相关内容。 “基础知识”是本专栏的第一个部分&#xff0c;本篇博文是第六篇博文&#xff0c;如有需要&#xff0c;可&#xff1a; 点击这里&#xff0c;返回本专栏的索引文…...

MySQL高级--锁

一、锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题…...

Maven(六):Maven的使用——继承与聚合

Maven&#xff08;六&#xff09;&#xff1a;Maven的使用——继承与聚合 前言一、实验九&#xff1a;继承1、概念2、作用3、举例4、操作4.1 创建父工程4.2 创建模块工程4.3 查看被添加新内容的父工程 pom.xml4.4 解读子工程的pom.xml4.5 在父工程中配置依赖的统一管理4.6 子工…...

Java ---System类

System 类位于 java.lang 包&#xff0c;代表当前 Java 程序的运行平台&#xff0c;系统级的很多属性和控制方法都放置在该类的内部。由于该类的构造方法是 private 的&#xff0c;所以无法创建该类的对象&#xff0c;也就是无法实例化该类。 System 类提供了一些类变量和类方…...

代码随想录_贪心_leetcode 406 452

leetcode 406. 根据身高重建队列 406. 根据身高重建队列 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高…...

C++类的静态成员详解:成员函数非静态成员函数的非法调用

在C中&#xff0c;静态成员是属于整个类的而不是某个对象&#xff0c;静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则&#xff0c;保证了安全性还可以节省内存。 静态成员的定义或声明要…...

Qt之滑动条和进度条(QSlider、QProgressBar)

文章目录 前言一、QSliderQSlider的常用API信号与槽 二、QProgressBar滑动条和滚动条的常用API 总结 前言 在用户界面设计中&#xff0c;滑动条和进度条是常见的控件。Qt中提供了QProgressBar和QSlider两个类来实现滚动条和滑动条。 一、QSlider 在Qt中&#xff0c;QSlider是…...

Flutter之插件开发plugin

目的:适用于独立业务模块,或者与原生页面交互频繁的地方。 基于flutter3.x , IDE :androidStudio demo:https://download.csdn.net/download/SHTLoveXX/87751845​​​​​​​ 步骤: 1.新建flutter project 【New flutter project】. 2. 在新建工程面板记得切换 …...

asp.net基于web的音乐管理网站dzkf17A9程序

本系统主要包含了等系统用户管理、公告信息管理、音乐资讯管理、音乐类型管理多个功能模块。下面分别简单阐述一下这几个功能模块需求。 管理员的登录模块&#xff1a;管理员登录系统对本系统其他管理模块进行管理。 用户的登录模块&#xff1a;用户登录本系统&#xff0c;对个…...

itop-3568开发板驱动学习笔记(25)设备树(四)GPIO 实例分析

《【北京迅为】itop-3568开发板驱动开发指南.pdf》 学习笔记 文章目录 GPIO 控制器必要属性其他属性 指定 GPIO 引脚 和时钟类似&#xff0c;GPIO 在设备树中也存在两层定义&#xff0c;首先是 GPIO 控制器&#xff0c;这部分由芯片原厂工程师编写&#xff0c;相当于 GPIO 底层…...

函数(定义、返回值、调用、参数)

目录 ❤ 无参函数 ❤ 有参函数 ❤ 空函数 ❤ 什么是返回值&#xff1f; ❤ 为什么要有返回值&#xff1f; ❤ 什么是函数调用&#xff1f; ❤ 为何用调用函数&#xff1f; ❤ 函数调用的三种形式 ❤ 形参和实参 形参 实参 ❤ 位置参数 位置形参 位置实…...

28. Kubernetes 核心组件讲解——API Server

本章讲解知识点 Kubernetes API Server 概述etcd 简介API Server 架构解析API Server 的 List-Watch 机制独特的 Kubernetes Proxy API 接口集群功能模板之间的通信1. Kubernetes API Server 概述 1.1 基本概念 Kubernetes API Server(API Server)是 Kubernetes 的核心组件…...

springboot框架开发医院云HIS 住院医生站、住院护士站功能实现

住院医生站主模块&#xff1a;包括医嘱管理、病案首页、分配入科、住院清单、我的质控等子模块 &#xff08;1&#xff09;医嘱管理功能简介 ①住院患者开立医嘱、支持医嘱复制、停止、作废等操作&#xff1b; ②医嘱类型含药品、项目、材料、嘱托&#xff1b; ③支持住院各…...

高性能定时器介绍及代码逐行解析--时间堆

简介 在《Linux高性能服务器编程》中&#xff0c;介绍了三种定时方法&#xff1a; socket选项SO_RCVTIMEO和SO_SNDTIMEOSIGALRM信号I/O复用系统调用的超时参数 基础知识 非活跃&#xff0c;是指客户端&#xff08;这里是浏览器&#xff09;与服务器端建立连接后&#xff0c…...

在OpenClaw中配置Taotoken作为Agent任务的模型提供商

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在OpenClaw中配置Taotoken作为Agent任务的模型提供商 基础教程类&#xff0c;指导使用OpenClaw框架的开发者&#xff0c;如何按照T…...

Godot游戏解包终极指南:3步提取.pck文件所有资源

Godot游戏解包终极指南&#xff1a;3步提取.pck文件所有资源 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker 你是否下载过Godot引擎开发的游戏&#xff0c;想要研究其中的美术资源、脚本代码或音效素…...

从测试开发到智能体工程师,我的转型全流程,全是避坑指南

文章目录 前言一、为什么我要从测试开发转智能体工程师1.1 测试开发的职业天花板&#xff0c;比我想象的还要低1.2 AI正在以惊人的速度&#xff0c;吞噬传统测试的工作1.3 智能体赛道&#xff0c;是程序员最后的红利期 二、转型前我踩过的那些致命大坑2.1 坑1&#xff1a;上来就…...

Kibana 7.3.0 导出CSV报告保姆级教程:从保存搜索到解决内存溢出

Kibana 7.3.0 高效数据导出实战&#xff1a;从基础配置到性能调优全攻略 当你面对TB级别的日志数据需要离线分析时&#xff0c;Kibana的CSV导出功能就像一把双刃剑——用得好能大幅提升工作效率&#xff0c;用不好则可能陷入内存溢出和性能瓶颈的泥潭。本文将带你深入Kibana 7…...

Gemini CLI:将AI助手集成到终端,提升开发者效率的实战指南

1. 从命令行到智能伙伴&#xff1a;为什么你需要一个终端里的AI助手如果你和我一样&#xff0c;每天大部分时间都泡在终端里&#xff0c;那么你肯定经历过这样的场景&#xff1a;面对一个陌生的代码库&#xff0c;想快速理解它的架构&#xff0c;却不得不花上半天时间在文件树和…...

避开这些坑,你的STM32四足机器人才能走得更稳:从步态调试到电源选择的完整避坑指南

STM32四足机器人实战避坑指南&#xff1a;从步态优化到系统稳定的全流程解决方案 当第一台自制的四足机器人颤颤巍巍地迈出第一步时&#xff0c;那种成就感无与伦比——直到它突然失去平衡翻倒在地。这个场景揭示了四足机器人开发中最真实的挑战&#xff1a;让机器人"能动…...

自主AI助手Angel:基于大语言模型的多通道智能体部署与实战

1. 项目概述&#xff1a;一个能帮你“跑腿”的自主AI助手如果你和我一样&#xff0c;经常在Discord、Slack、iMessage和Signal这几个聊天软件之间来回切换&#xff0c;同时电脑上还开着十几个终端窗口处理各种杂事&#xff0c;那你肯定幻想过能有一个“数字管家”。它最好能看懂…...

如何永久保存微信聊天记录:3步完成专业级数据备份方案

如何永久保存微信聊天记录&#xff1a;3步完成专业级数据备份方案 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因手机丢失、系统升级或更换设备&#xff0c;而…...

NotebookLM私有知识库安全加固指南(GDPR/等保2.0双合规配置手册,仅限内部技术团队流通)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM私有知识库安全加固概览 NotebookLM 是 Google 推出的基于用户上传文档进行语义理解与问答的 AI 工具&#xff0c;其本地化部署或私有知识库场景下&#xff0c;数据驻留、访问控制与内容脱敏…...

IO-Link技术解析:工业自动化通信与LTC2874/LT3669芯片应用

1. IO-Link技术概述&#xff1a;工业自动化的神经末梢在工业4.0的浪潮中&#xff0c;设备间的实时通信如同工厂的神经系统。IO-Link作为这个系统中的"神经末梢"&#xff0c;实现了控制层与现场设备间的最后一米连接。这项技术最早由PROFIBUS用户组织在2009年推出&…...