Driver8833电机驱动模块的使用(STM32为主控)

一、硬件
STM32C8T6、STLINK下载器
Driver8833:TI公司的DRV8833是双桥马达驱动器解决方案,包括有两个H桥驱动器,可驱动两个DC电刷马达,或一个步进马达, 螺线管和其它电感负载. DRV8833具有PWM绕组电流调整/限制,H桥的输出电流1.5A RMS,2A峰值,工作电压2.7V-10.8V。
编码电机

二、Driver8833的使用

模块供电2.7-10.8v,芯片中共有两个全H桥,最多可以同时驱动两个直流电机,内置过热保护和用户可调的限流保护电路。
引脚说明:
SLEEP:睡眠模式控制,高电平使能芯片,低电平关闭芯片;
UTL:报警端,过热和电流过大时输出低电平,默认不用;
输入IN1、IN2控制输出OUT1、OUT2,第一路H桥;
输入IN3、IN4控制输出OUT3、OUT4,第二路H桥;
GND:与单片机共地。

1.H桥驱动逻辑

IN1 IN2 OUT1 OUT2 状态
0 0 Z Z 慢速运行/快速衰减
1 0 1 0 正转
0 1 0 1 反转
1 1 0 0 制动/慢速衰减

输入为相同电平电机停止,相异控制电机正反转。
场效应管(FET)的两种电流衰减方法-----快速衰减和慢速衰减,衰减指的是电流衰减的速度,并且与电机的停止速度成反比。

硬件相关知识参考这篇文章:https://blog.csdn.net/oXiaoXue123456789/article/details/110260343

2.PWM控制逻辑

IN1 IN2 状态
PWM 0 正转,快速衰减
PWM 1 反转,慢速衰减
1 PWM 正转,慢速衰减
0 PWM 反转,快速衰减

输入为一个低电平,一个PWM时,正反转、快衰减,占空比越大,转速越快。
输入为一个高电平,一个PWM时,正反转、慢衰减,占空比越小,转速越快。

三、主要程序:
motor.c

#include "motor.h" /******************************************** * @brief 电机GPIO初始化 * @param void * @retval void *********************************************/ void Motor_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;//PB6 PB7作为方向控制 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_ResetBits(GPIOB, GPIO_Pin_6|GPIO_Pin_7); }

pwm.c

#include "stm32f10x.h" #include "pwm.h" /******************************************** * @brief TIM2 PWM初始化 * @param arr * psc * @retval void *********************************************/ void TIM2_PWM_Init(u16 arr, u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; //定义引脚初始化结构体 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue; //定义定时中断结构体 TIM_OCInitTypeDef TIM_OCInitTypeStrue; //定义PWM输出结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能通用定时器2时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;//定时器引脚PA1 CH2 PA2 CH3 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用推挽输出模式,A0引脚复用 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //引脚输出速度为 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化引脚GPIO TIM_TimeBaseInitStrue.TIM_Period=arr; //计数周期 TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //预分频系数 TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1; //一般不使用,默认TIM_CKD_DIV1 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStrue); //初始化定时器TIM2 TIM_OCInitTypeStrue.TIM_OCMode=TIM_OCMode_PWM1; //PWM模式1,定时器计数小于 TIM_Pulse时,输出有效电平 TIM_OCInitTypeStrue.TIM_OCPolarity=TIM_OCNPolarity_High; //输出有效电平为高电平 TIM_OCInitTypeStrue.TIM_OutputState=TIM_OutputState_Enable; //使能PWM输出 TIM_OCInitTypeStrue.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值 TIM_OC2Init(TIM2, &TIM_OCInitTypeStrue); //初始化定时器2通道2 TIM_OCInitTypeStrue.TIM_OCMode=TIM_OCMode_PWM1;//PWM模式1,时器计数小于TIM_Puls输出有效电平 TIM_OCInitTypeStrue.TIM_OCPolarity=TIM_OCNPolarity_High; //输出有效电平为高电平 TIM_OCInitTypeStrue.TIM_OutputState=TIM_OutputState_Enable; //使能PWM输出 TIM_OCInitTypeStrue.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值 TIM_OC3Init(TIM2, &TIM_OCInitTypeStrue); //初始化定时器2通道3 TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable); //CH2预装载使能 TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable); //CH3预装载使能 TIM_ARRPreloadConfig(TIM2, ENABLE); //预装载使能 TIM_Cmd(TIM2, ENABLE); //使能定时器TIM2 }

main.c

#include "stm32f10x.h" #include "main.h" #include "motor.h" #include "pwm.h" int main(void) { TIM2_PWM_Init(99,0);//720khz Motor_Init(); while(1) { /*IN1---1 IN2---PWM 正转 慢速衰减 占空比越小速度越快*/ GPIO_SetBits(GPIOB, GPIO_Pin_6); TIM_SetCompare2(TIM2, 40); /*IN1---PWM IN2---0 正转 快速衰减 占空比越大速度越快*/ GPIO_ResetBits(GPIOB, GPIO_Pin_7); TIM_SetCompare3(TIM2, 90); } }

四、现象总结
调速过程中PWM频率过低会产生异响,转速缓慢,增大频率后消失。目前只是对driver8833进行了一个初步的使用。


__EOF__

本文作者xiaohu
本文链接https://www.cnblogs.com/xiaohuzaixue/p/17363415.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   EternalH  阅读(3851)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示