【STM32】DRV8833驱动电机

1.电机如何转动

只需要给电机两个端子加一正一负的极性就会转起来了,但是要注意的是不要将电机两端直接接在5v和gnd之间,这种电机一般要提供几百毫安的电流,而GPIO口只能提供几毫安,所以我们使用一个DRV8833来驱动
在这里插入图片描述
DRV8833输入口要接PA0,PA1,并且供电,通过OUT1,OUT2连接电机
在这里插入图片描述
IN1,IN2对应PA0,PA1。
如果要使电机转速发生改变,我们可以将通入DRV8833的IN1,IN2接PWM即可。通过改变高电平时间实现转速的快慢
在这里插入图片描述

2.DRV8833

在这里插入图片描述
因为有两对输出口,则一个DRV8833可以驱动两个电机,对应SLEEP引脚是如果开启,则驱动芯片停止工作,实现低功耗,FAULT引脚是出现控制错误时提醒单片机

3.DRV8833驱动代码

drv8833.h


#ifndef __DRV8833_H_
#define __DRV8833_H_#include <stdint.h>/*** @brief 衰减模式枚举*/
typedef enum {SLOW_DECAY,  /**< 慢衰减模式 */FAST_DECAY   /**< 快衰减模式 */
} DecayMode;/*** @brief 初始化DRV8833*/
void DRV8833_Init(void);/*** @brief 设置衰减模式* @param mode 衰减模式*/
void DRV8833_SetDecayMode(DecayMode mode);/*** @brief 控制电机前进* @param speed 速度值(0-100)*/
void DRV8833_Forward(uint8_t speed);/*** @brief 控制电机后退* @param speed 速度值(0-100)*/
void DRV8833_Backward(uint8_t speed);/*** @brief 电机刹车*/
void DRV8833_Brake(void);/*** @brief 电机滑行*/
void DRV8833_Coast(void);#endif /* __DRV8833_H_ */

drv8833.c

/*** @file drv8833.c* @brief DRV8833双H桥电机驱动器控制实现*/#include "drv8833.h"
#include "tim.h"/** @brief IN1引脚的定时器 */
#define IN1_TIM &htim2
/** @brief IN2引脚的定时器 */
#define IN2_TIM &htim2/** @brief IN1引脚的定时器通道 */
#define IN1_CH TIM_CHANNEL_1
/** @brief IN2引脚的定时器通道 */
#define IN2_CH TIM_CHANNEL_2/** @brief 最大速度值 */
#define MAX_SPEED 100/** @brief 当前衰减模式 */
static DecayMode currentDecayMode = SLOW_DECAY;/*** @brief 设置IN1引脚的PWM占空比* @param duty 占空比值*/
static inline void __SetIn1PWM(uint8_t duty)
{__HAL_TIM_SET_COMPARE(IN1_TIM, IN1_CH, duty);
}/*** @brief 设置IN2引脚的PWM占空比* @param duty 占空比值*/
static inline void __SetIn2PWM(uint8_t duty)
{__HAL_TIM_SET_COMPARE(IN2_TIM, IN2_CH, duty);
}/*** @brief 初始化DRV8833*/
void DRV8833_Init(void)
{HAL_TIM_PWM_Start(IN1_TIM, IN1_CH);HAL_TIM_PWM_Start(IN2_TIM, IN2_CH);
}/*** @brief 设置衰减模式* @param mode 衰减模式*/
void DRV8833_SetDecayMode(DecayMode mode)
{currentDecayMode = mode;
}/*** @brief 控制电机前进* @param speed 速度值(0-100)*/
void DRV8833_Forward(uint8_t speed)
{if (speed > MAX_SPEED)speed = MAX_SPEED;if (currentDecayMode == FAST_DECAY) {__SetIn1PWM(speed);__SetIn2PWM(0);} else {__SetIn1PWM(MAX_SPEED);__SetIn2PWM(MAX_SPEED - speed);}
}/*** @brief 控制电机后退* @param speed 速度值(0-100)*/
void DRV8833_Backward(uint8_t speed)
{if (speed > MAX_SPEED)speed = MAX_SPEED;if (currentDecayMode == FAST_DECAY) {__SetIn1PWM(0);__SetIn2PWM(speed);} else {__SetIn1PWM(MAX_SPEED - speed);__SetIn2PWM(MAX_SPEED);}
}/*** @brief 电机刹车*/
void DRV8833_Brake(void)
{__SetIn1PWM(MAX_SPEED);__SetIn2PWM(MAX_SPEED);
}/*** @brief 电机滑行*/
void DRV8833_Coast(void)
{__SetIn1PWM(0);__SetIn2PWM(0);
}

4.使用

使用旋转编码器控制电机转动,旋转编码器顺时针转实现电机正转,并且越转越快。
旋转编码器逆时针转实现电机反转并且越转越快
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
PA0,PA1刚好是定时器2的1通道和2通道
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
使用屏幕配置i2c

5.代码

#include "drv8833.h"
#include "oled.h"
#include <stdio.h>
#define MAX_COUNT 20
int main(void)
{MX_GPIO_Init();MX_I2C1_Init();MX_TIM1_Init();MX_TIM2_Init();/* USER CODE BEGIN 2 */OLED_Init();HAL_TIM_Encoder_Start(&htim1,TIM_CHANNEL_ALL);//打开编码器计数DRV8833_Init();//打开PWM通道int count;char message[50]="";int speed;//电机的占空比0~100__HAL_TIM_SET_COUNTER(&htim1,MAX_COUNT);//先设置为20,让电机不转while (1){count=__HAL_TIM_GET_COUNTER(&htim1);//获取编码器计数if(count>60000)//逆时针转      //保证编码器计数在0~40{count=0;__HAL_TIM_SET_COUNTER(&htim1,0);}else if(count>MAX_COUNT*2){count=MAX_COUNT*2;__HAL_TIM_SET_COUNTER(&htim1,MAX_COUNT*2);}if(count<MAX_COUNT)//反转,count越接近0,越快{speed=(MAX_COUNT-count)*100/MAX_COUNT;//speed在0~100,先×100,如果0~20数/20会为0DRV8833_Forward(speed);}else//正转,count越接近40,越快,count为20,speed为0,不转{speed=(count-MAX_COUNT)*100/MAX_COUNT;DRV8833_Backward(speed);}OLED_NewFrame();sprintf(message,"count:%d",count);//显示编码器计数OLED_PrintString(10,0,message,&font16x16, OLED_COLOR_NORMAL);sprintf(message,"speed:%d",speed);//显示速度OLED_PrintString(10,20,message,&font16x16, OLED_COLOR_NORMAL);if(count<20)OLED_PrintString(10,40,"反转",&font16x16, OLED_COLOR_NORMAL);else if(count>20)OLED_PrintString(10,40,"正转",&font16x16, OLED_COLOR_NORMAL);OLED_ShowFrame();HAL_Delay(10);}}
 DRV8833_Forward(speed);DRV8833_Forward(speed);//操作定时器2的1,2通道通过设置比较寄存器的值来改变占空比,控制转速

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

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

相关文章

vue2老版本 npm install 安装失败_安装卡主

vue2老版本 npm install 安装失败_安装卡主 特别说明&#xff1a;vue2老版本安装慢、运行慢&#xff0c;建议升级vue3element plus vite 解决方案1&#xff1a; 第一步、修改npm 镜像为国内镜像 使用淘宝镜像&#xff1a; npm config set registry https://registry.npmmir…

Linux相关概念和易错知识点(27)(认识线程、页表与进程地址空间、线程资源划分)

目录 1.认识线程 &#xff08;1&#xff09;进程与线程的关系 &#xff08;2&#xff09;最小执行流 &#xff08;3&#xff09;轻量级进程&#xff08;LWP&#xff09; ①对task_struct的理解 ②轻量级进程 ③LWP和TCB的区别 2.页表与进程地址空间 &#xff08;1&…

GitHub基本操作及Git简单命令

GitHub简介 GitHub就是一个远程仓库&#xff0c;远程仓库可以理解为就是一个可以保存自己代码的地方&#xff0c;在实际开发当中一个项目往往是有多个人来共同协作开发完成的&#xff0c;那么就需要一个统一代码保存的地方&#xff0c;而GitHub就是起到一个共享和汇总代码的作…

数据结构(陈越,何钦铭)第三讲 树(上)

3.1 树与数的表示 3.1.1 顺序查找 int SequentialSearch(List Tbl,ElementType K){int i;Tbl->Element[0]K;for(iTbl->Length;Tbl->Element[i]!K;i--);return i; } typedef struct LNode *List; struct LNode{ElementType Element[MAXSIZE];int Length; };3.1.2 二分…

【PYTORCH】官方的turoria实现中英文翻译

参考 https://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html 背景 pytorch官方的是seq2seq是法语到英文&#xff0c;做了一个中文到英文的。 数据集 下载后解压&#xff0c;使用的data\testsets\devset\UNv1.0.devset.zh和UNv1.0.devset.en&#x…

仿叮咚买菜鸿蒙原生APP

# DingdongShopping 这是一个原生鸿蒙版的仿叮咚买菜APP项目 鸿蒙Next发布至今已经有一年多的时间了&#xff0c;但有时候我们想要实现一些复杂的功能或者效果&#xff0c;在开发文档上查阅一些资料还是比较费时的&#xff0c;有可能还找不到我们想要的内容。而社会层面上分享…

VSCode 接入DeepSeek V3大模型,附使用说明

VSCode 接入DeepSeek V3大模型,附使用说明 由于近期 DeepSeek 使用人数激增,服务器压力较大,官网已 暂停充值入口 ,且接口响应也开始不稳定,建议使用第三方部署的 DeepSeek,如 硅基流动 或者使用其他模型/插件,如 豆包免费AI插件 MarsCode、阿里免费AI插件 TONGYI Lin…

中上211硕对嵌入式AI感兴趣,如何有效规划学习路径?

今天给大家分享的是一位粉丝的提问&#xff0c;中上211硕对嵌入式AI感兴趣&#xff0c;如何有效规划学习路径&#xff1f; 接下来把粉丝的具体提问和我的回复分享给大家&#xff0c;希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问&#xff1a; 中上211&#xff0c;…

Linux 目录结构与基础命令学习记录

在 Linux 的学习旅程中&#xff0c;熟练掌握基础命令是开启高效操作与系统管理的钥匙。这些命令不仅能帮助我们在 Linux 系统中自由穿梭&#xff0c;还能深入了解系统的运行状态。以下是我对 Linux 基础命令的学习总结&#xff0c;希望能为大家的 Linux 学习提供帮助。 一、Lin…

python学opencv|读取图像(六十五)使用cv2.boundingRect()函数实现图像轮廓矩形标注

【1】引言 前序学习进程中&#xff0c;已经使用cv2.findContours()函数cv2.drawContours()函数实现图像轮廓识别和标注&#xff0c;这种标注沿着图像的轮廓进行&#xff0c;比较细致。相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;六十四&#xff09;使用…

Visionpro 齿轮测量

效果展示 一、题目要求 求出最大值&#xff0c;最小值&#xff0c;平均值 二、分析 1.首先要进行模板匹配 2.划清匹配范围 3.匹配小三角的模板匹配 4.卡尺 5.用找圆工具 工具 1.CogPMAlignTool 2.CogCaliperTool 3.CogFindCircleTool 4.CogFixtureTool 三、模板匹…

【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析②】

ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase02 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月15日 关键词&#xff1a;UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-002测试用例 用例ID测试场景验证要点参考条款预期…

AlmaLinux使用Ansible自动部署k8s集群

一、环境准备 节点规划&#xff08;最低要求&#xff09; 1台Master节点&#xff08;4核/8GB内存&#xff09;2台Worker节点&#xff08;2核/4GB内存&#xff09;1台Ansible控制机&#xff08;可复用Master节点&#xff09; 系统配置 # 所有节点执行 sudo hostnamectl set-hos…

机器学习:十大算法实现汇总

机器学习十大算法代码实现&#xff1a;使用numpy、pandas&#xff0c;不调用机器学习相关库。 已将代码和相关文档上传到了github&#xff1a;golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com) 一元线性回归&#xff1a;机器学习&…

ffmpeg学习:ubuntu下编译Android版ffmpeg-kit

文章目录 前言一. 配置环境1.1 虚拟机版本1.2 安装Android环境1.2.1 Android SDK安装1.2.2 Android NDK安装 1.3 编译前的准备工作1.3.1 libtasn1-1安装1.3.2 meson安装1.3.3 harfbuzz下载 二. 编译ffmpeg-kit三. 总结 前言 ffmpeg-kit是一款跨多个平台的&#xff0c;用于在应…

Qt使用pri和pro文件进行模块化编程

假如我想要做一个功能&#xff0c;这个功能用代码模块化实现出来&#xff0c;方便将来移植&#xff0c;比如音视频播放器的界面&#xff0c;将来想要在其他工程使用时&#xff0c;只需要将widget提升为音视频播放界面即可。 当我们其他工程需要这个功能时&#xff0c;我们在调用…

C# windowForms 的DataGridView控件的使用

C# Windows Forms DataGridView 控件使用详解 DataGridView 是 Windows Forms 中用于显示和编辑表格数据的核心控件。它支持高度自定义的列类型、数据绑定、事件处理和丰富的样式配置。以下是其详细使用方法。 目录 基础使用 数据绑定 列类型与自定义

PyQt 界面编程:QDialog、QWidget、QMainWindow 的面向过程与面向对象编程

文章目录 一、PyQt简介二、面向过程编程三、面向对象编程(推荐)3.1 QWidget窗口3.2 QMainWindow窗口3.3 QDialog窗口文档: https://www.riverbankcomputing.com/static/Docs/PyQt5/ 一、PyQt简介 PyQt简介:PyQt 是一个用于创建图形用户界面(GUI)的 Python 库,它将 Qt …

Jvascript网页设计案例:通过js实现一款密码强度检测,适用于等保测评整改

本文目录 前言功能预览样式特点总结&#xff1a;1. 整体视觉风格2. 密码输入框设计3. 强度指示条4. 结果文本与原因说明 功能特点总结&#xff1a;1. 密码强度检测2. 实时反馈机制3. 详细原因说明4. 视觉提示5. 交互体验优化 密码强度检测逻辑Html代码Javascript代码 前言 能满…

智能车摄像头开源—8 元素处理

目录 一、前言 二、无元素状态 三、直线与弯道 四、十字与环岛 1、十字识别处理 2、环岛识别处理 五、坡道 六、障碍物 七、斑马线 八、入库 九、出界停车 一、前言 在写这篇文章之前&#xff0c;考虑了很久到底该写到什么程度&#xff0c;但思来想去&#xff0c;不同…