【平衡小车专栏】TB6612 的PWM引脚不可以悬空
参考:优信电子《TB6612FNG电机驱动模块纯硬件调试》
当前问题:
我使用标准库,配置了 TB6612 的相关 GPIO,将STBY使能为高电平,将 PWMA/B 悬空。然后在 main() 中 AIN1 = 1, AIN2 = 0,但是电机毫无反应,不知道怎么回事。
1 void DRIVER_GPIO_Config(void) 2 { 3 4 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE); 5 6 //------------------------Left/A-Driver--------------------------------- 7 //PB12 8 GPIO_InitTypeDef GPIO_InitStruct; 9 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//Out PP 10 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12; 11 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 12 GPIO_Init(GPIOB, &GPIO_InitStruct); 13 14 //PB13 15 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13; 16 GPIO_Init(GPIOB, &GPIO_InitStruct); 17 18 //------------------------Right/B-Driver--------------------------------- 19 //PB14/PB15 20 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15; 21 GPIO_Init(GPIOB, &GPIO_InitStruct); 22 23 24 //STBY 25 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;//Out PP 26 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12; 27 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 28 GPIO_Init(GPIOA, &GPIO_InitStruct); 29 30 GPIO_SetBits(GPIOA, GPIO_Pin_12); 31 32 /* 33 //Initiation 34 AIN1(0); 35 AIN2(0); 36 BIN1(0); 37 BIN2(0); 38 */ 39 }
问题解决:
IN1 | IN2 | PWM | STBY | 输出状态 |
---|---|---|---|---|
H | H | H/L | H | 制动 |
L | H | H | H | 反转 |
L | H | L | H | 制动 |
H | L | H | H | 正转 |
H | L | L | H | 制动 |
L | L | H | H | 停止 |
- | - | - | L | 待机 |
STBY引脚在高电平的时候模块是正常工作,低电平模块待机;PWM要有信号输入或者处于高电平且IN1和IN2电平不同时,模块才会有输出。
问题的原因是:TB6612的PWMA/B引脚不能悬空,必须高电平或者有信号,才能够输出。(这与 L298N PWM引脚(ENA,ENB)一样,在不需要调速的时候,ENA和ENB用用跳帽连接VCC,当需要调速的时候,ENA/ENB接定时器输出引脚)
一则有趣的问答:
问:电机的 PWM 引脚可以悬空吗?
答:最好不要,不连接PWM调速线,这可能导致不可预测的运行行为。
我没有初始化 PWM 引脚,也没有设置信号。因此电机不转。
加上初始化代码:
void DRV_TIM_GPIO_Config(void) { //general time TIM1--->CH4_PA11 CH1N->NULL BKIN->NULL RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStruct; //GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct); //TIM1--->CH1_PA8 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8; GPIO_Init(GPIOA, &GPIO_InitStruct); }
再加上 PWM 引脚高电平设置