> 文章列表 > PWM控制直流电机

PWM控制直流电机

PWM控制直流电机

一,TB6612电机驱动模块

 

 

 

直流电机属于大功率器件,GPIO无法直接驱动,需要电机驱动模块配合,才能驱动直流电机.

TB6612可以驱动2个直流电机。由IN1,IN2控制电机旋转方向,由PWM控制电机旋转速度。

二,代码部分

核心代码还是为PWM部分,直流电机初始化也只是多初始化2了两个GPIO口,用于产生电压差,驱动电机,并且可以通过2个GPIO口改变电机旋转方向。

就是两个端口输出电平控制点击转动方向,然后中间那个端口通过输出占空比控制转速
 

PWM.c

#include "stm32f10x.h"                  // Device headervoid 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端口,再选择相应的捕获/比较寄存器

在这里插入图片描述