TB6612介紹及使用
單片機通過驅動板連接至電機
原因:單品機I/O口輸出電流I小
驅動板:從外部引入高電壓,控制電機驅動 | ||||||||
| ||||||||
電源部分 | VM:電機驅動電源輸入,輸入電壓范圍建議為3.7~12V | |||||||
GND:邏輯電源和電機驅動電源的公共地 | VCC:邏輯電源輸入,輸入電壓為 2.7-5.5V | |||||||
電機接口 | A0 B0可以接兩個電機 | |||||||
電機控制端口 | ||||||||
PWMA? B分別為兩個電機控制的使能端 (可使用PWM調速) | AIN1\AIN2;BIN1\BIN2 | |||||||
STBY | 使能引腳 | |||||||
IN1 | IN2 | PWM | STBY | O1 | O2 | |||
H | H | H/L | H | L | L | 制動 | ||
L | H | H | H | L | H | 反轉 | ||
L | H | L | H | L | L | 制動 | ||
H | L | H | H | H | L | 正轉 | ||
H | L | L | H | L | L | 制動 | ||
L | L | H | H | OFF | - | 停止 | ||
H/L | H/L | H/L | L | OFF | - | 待機 |
main.c #include "stm32f10x.h" #include "led.h" #include "usart.h" #include "delay.h" #include "oled.h" #include "Motor.h" #include "key.h" int key = 0; int key_state = 0; int main(void) { SystemInit();//系統時鐘為72M?? ????? delay_init(72); ????? LED_Init(); ????? LED_On(); ????? MOTOR_Init(); USART1_Config();//串口初始化 ????? Key_Init(); ????? OLED_Init(); ????? printf("Start \n"); ????? delay_ms(1000); ????? OLED_Clear();//顯示電機轉速 OLED_ShowChinese(0,0,0,16,1); OLED_ShowChinese(16,0,1,16,1); OLED_ShowChinese(32,0,2,16,1); OLED_ShowChinese(48,0,3,16,1); OLED_ShowChar(64,0,':',16,1); ? while (1) ? {key = Key_GetData(); ?????????? if(key) ???????????????? key_state++; ?????????? if(key_state%4==1) ?????????? {Motor_SetSpeed(60); OLED_ShowNum(56,24,1,1,16,1); ?????????? }if(key_state%4==2) ?????????? {Motor_SetSpeed(80); OLED_ShowNum(56,24,2,1,16,1);} ?????????? if(key_state%4==3) ?????????? {Motor_SetSpeed(100); OLED_ShowNum(56,24,3,1,16,1);} ?????????? if(key_state%4==0) ?????????? {Motor_SetSpeed(0); OLED_ShowNum(56,24,0,1,16,1);?????? //0}}} |
Motor.c #include "Motor.h" void MOTOR_Init(void) { ????? GPIO_InitTypeDef GPIO_InitStructure; ????? RCC_APB2PeriphClockCmd(MOTOR_CLK, ENABLE ); //配置時鐘 ????? GPIO_InitStructure.GPIO_Pin = MOTOR_AIN1_GPIO_PIN; ????? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ????? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; ????? GPIO_Init(MOTOR_AIN1_GPIO_PORT,&GPIO_InitStructure); ????? GPIO_InitStructure.GPIO_Pin = MOTOR_AIN2_GPIO_PIN; ????? GPIO_Init(MOTOR_AIN2_GPIO_PORT,&GPIO_InitStructure); ????? PWM_Init(); } void PWM_Init(void) { ????? RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); ????? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);??? //開啟GPIOA的時鐘 /*GPIO初始化*/ ????? GPIO_InitTypeDef GPIO_InitStructure; ????? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; ????? GPIO_InitStructure.GPIO_Pin = MOTOR_PWMA_GPIO_PIN; ????? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; ????? GPIO_Init(MOTOR_PWMA_GPIO_PORT, &GPIO_InitStructure);??????????? ???????????????? //將PA1和PA2引腳初始化為推挽輸出 ????? TIM_InternalClockConfig(TIM2);//配置實際單元 ????? TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; ????? TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;????????? //時鐘分頻 ????? TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;?????????? //計數模式 ????? TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;?????????????? //自動重裝ARR????? 分辨率 ????? TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;????? //預分頻PSC??? ????? TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; ????? TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure); ????? TIM_OCInitTypeDef TIM_OCInitStructure; ????? TIM_OCStructInit(&TIM_OCInitStructure);??????? //給結構體賦予初值 ????? TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; ????? TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; ????? TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; ????? TIM_OCInitStructure.TIM_Pulse = 0;?????????????? //CCR ????? TIM_OC3Init(TIM2,&TIM_OCInitStructure); ????? TIM_Cmd(TIM2,ENABLE);}? void PWM_SetCompare3(uint16_t compare) {TIM_SetCompare3(TIM2,compare); }void Motor_SetSpeed(int8_t Speed) {if(Speed >= 0) ????? { ????? GPIO_SetBits(MOTOR_AIN1_GPIO_PORT,MOTOR_AIN1_GPIO_PIN); ????? GPIO_ResetBits(MOTOR_AIN2_GPIO_PORT,MOTOR_AIN2_GPIO_PIN); ????? PWM_SetCompare3(Speed); ????? }else{ ????? GPIO_ResetBits(MOTOR_AIN1_GPIO_PORT,MOTOR_AIN1_GPIO_PIN); ????? GPIO_SetBits(MOTOR_AIN2_GPIO_PORT,MOTOR_AIN2_GPIO_PIN); ?????????? PWM_SetCompare3(-Speed);}} |
Motor.h #ifndef __MOTOR_H #define??? __MOTOR_H #include "stm32f10x.h" #include "delay.h" #include "sys.h" /***************根據自己需求更改****************/ // TB6612FNG電機驅動模塊 GPIO宏定義 #define??? MOTOR_CLK??????????? ????? ?????????? RCC_APB2Periph_GPIOA #define MOTOR_AIN1_GPIO_PIN ?????????????????? GPIO_Pin_0 #define MOTOR_AIN2_GPIO_PIN ?????????????????? GPIO_Pin_1 #define MOTOR_AIN1_GPIO_PORT ??????????????????? GPIOA #define MOTOR_AIN2_GPIO_PORT ??????????????????? GPIOA #define MOTOR_PWMA_GPIO_PIN ??????????????????? GPIO_Pin_2 #define MOTOR_PWMA_GPIO_PORT ???????????????????? GPIOA /*********************END**********************/ void MOTOR_Init(void); void PWM_Init(void); void Motor_SetSpeed(int8_t Speed); #endif |
代碼放在下述連接里面,通過網盤分享的文件:TB6612電機調速資料
鏈接: https://pan.baidu.com/s/1D_d506c3pwiRzHCaSq2_Aw?pwd=HHRR 提取碼: HHRR
--來自百度網盤超級會員v5的分享
此外還有一種電機驅動,介紹如下
微型雙路直流電機驅動基于TB6612FNG驅動IC設計,采用特殊邏輯控制方式,僅需4根管腳即可實現雙路電機控制,相比純芯片而言,減少了兩個IO管腳,為Arduino等控制器節約了寶貴的IO資源,可以應用在更多領域中。
TB6612FNG是一塊雙路全橋驅動芯片,單通道最大連續驅動電流可達1.2A,峰值2A/3.2A(連續脈沖/單脈沖),可驅動一些微型直流電機。控制邏輯與L298N類似,代碼上可直接兼容DFRobot L298N電機驅動。標準XH2.54排針可直插面包板,無論是DIY制作,還是新產品開發,都是非常理想的一個選擇!
產品參數
- 邏輯部分輸入電壓VCC:3.3~5V
- 驅動部分輸入電壓VM:2.5~12V
- 驅動電機路數:2通道
- 單通道最大連續驅動電流:1.2A
- 啟動峰值:2A/3.2A(連續脈沖/單脈沖)
- 接口方式:2.54mm間距排針
模塊尺寸:20 × 19.5(mm)
細節說明
電機接口:M1,M2 可接入兩個電機,其中標注了“+”、“-”表示兩個電機的接線方向。
指示燈:正面指示燈:電源指示燈
電源部分
VCC:邏輯電源輸入,輸入電壓為5V;
VM:電機驅動電源輸入,輸入電壓范圍建議為3.7~12V;
GND:邏輯電源和電機驅動電源的公共地。
電機控制端口
PWM1,PWM2:分別為兩個電機控制的使能端(可使用PWM調速)
DIR1,DIR2:正反轉控制信號輸入端。比如,DIR1=1,M1電機正轉; DIR1=0,M1電機反轉。
引腳說明 | ||
管腳映射 | ||
標號 | 名稱 | 功能描述 |
1 | DIR1 | 電機M1的方向控制引腳 |
3 | PWM2 | 電機M2的速度控制引腳 |
4 | DIR2 | 電機M2的方向控制引腳 |
5 | GND | 邏輯部分電源負極 |
6 | VCC | 邏輯部分電源正極 |
7 | M1+ | M1路電機輸出1 |
8 | M1- | M1路電機輸出2 |
9 | M2+ | M2路電機輸出1 |
10 | M2- | M2路電機輸出2 |
11 | GND | 電機電源負極 |
12 | VM(<12V) | 電機電源正極 |
模塊尺寸:20 × 19.5(m\