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