一,TB6612电机驱动模块
直流电机属于大功率器件,GPIO无法直接驱动,需要电机驱动模块配合,才能驱动直流电机.
TB6612可以驱动2个直流电机。由IN1,IN2控制电机旋转方向,由PWM控制电机旋转速度。
二,代码部分
核心代码还是为PWM部分,直流电机初始化也只是多初始化2了两个GPIO口,用于产生电压差,驱动电机,并且可以通过2个GPIO口改变电机旋转方向。
就是两个端口输出电平控制点击转动方向,然后中间那个端口通过输出占空比控制转速
PWM.c
#include "stm32f10x.h"// Device header void PWM_Init(void){//开启TIM2连接的总线APBB1RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIOA_InitStructure;GPIOA_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIOA_InitStructure.GPIO_Pin=GPIO_Pin_2;GPIOA_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIOA_InitStructure);//选择内部时钟TIM_InternalClockConfig(TIM2);//时基单元初始化TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;TIM_TimeBaseStruct.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseStruct.TIM_Period=100-1; //ARRTIM_TimeBaseStruct.TIM_Prescaler=36-1;//PSCTIM_TimeBaseStruct.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStruct);TIM_OCInitTypeDef TIM_OCInitStructture;TIM_OCStructInit(&TIM_OCInitStructture);TIM_OCInitStructture.TIM_OCMode=TIM_OCMode_PWM1;TIM_OCInitStructture.TIM_OCPolarity=TIM_OCPolarity_High ;TIM_OCInitStructture.TIM_OutputState=TIM_OutputState_Enable;TIM_OCInitStructture.TIM_Pulse=90;//CCRTIM_OC3Init(TIM2,&TIM_OCInitStructture);TIM_Cmd(TIM2,ENABLE);}void PWM_SetCompare3(uint16_t Compare){TIM_SetCompare3(TIM2,Compare);}
Motor.c
#include "stm32f10x.h"// Device header#include "PWM.h" void Motor_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIOA_InitStructure;GPIOA_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIOA_InitStructure.GPIO_Pin=GPIO_Pin_4 | GPIO_Pin_5;GPIOA_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIOA_InitStructure);PWM_Init();}void Motor_SetSpeed(int8_t Speed){if(Speed>=0){GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_ResetBits(GPIOA,GPIO_Pin_5);PWM_SetCompare3(Speed);}else{GPIO_SetBits(GPIOA,GPIO_Pin_5);GPIO_ResetBits(GPIOA,GPIO_Pin_4);PWM_SetCompare3(-Speed);}}
main.c
#include "stm32f10x.h"// Device header#include "Delay.h"#include "LED.h"#include "Key.h"#include "Buzzer.h"#include "OLED.h "#include "Motor.h" uint8_t KeyNum;int8_t Speed;int main(){OLED_Init();Motor_Init();Key_Init();OLED_ShowString(1,1,"Speed:"); while(1){KeyNum=Key_Getnum();if(KeyNum==1){Speed+=20;if(Speed>100){Speed=-100;}Motor_SetSpeed(Speed);OLED_ShowSignedNum(1,7,Speed,3);}}}
三、怎么选择输出占空比函数
这个函数TIM_SetCompare1,这个函数有四个,分别是TIM_SetCompare1,TIM_SetCompare2,TIM_SetCompare3,TIM_SetCompare4。
位于CH1那一行的GPIO口使用TIM_SetCompare1这个函数
位于CH2那一行的GPIO口使用TIM_SetCompare2这个函数
位于CH3那一行的GPIO口使用TIM_SetCompare1这个函数
以此类推
四、如何选择捕获/比较寄存器
在选择捕获/比较寄存器的时候,我们可以先根据输出比较的端口,在上面的图里面选择出输出的端口。如何对应选择出CHx端口,再选择相应的捕获/比较寄存器