Driver8833電機驅動模組的使用(STM32為主控)

xioahuhu發表於2023-04-29

一、硬體
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進行了一個初步的使用。

相關文章