使用PWM进行直流电机控制

一,TB6612电机驱动模块

 

 

 

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

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

二,代码部分

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

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

PWM.c

#include "stm32f10x.h"                  // Device header
 
void PWM_Init(void)
{
	//开启TIM2连接的总线APBB1
	RCC_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;   //ARR
	TIM_TimeBaseStruct.TIM_Prescaler=36-1;  //PSC
	TIM_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;    //CCR
	TIM_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端口,再选择相应的捕获/比较寄存器

 

物联沃分享整理
物联沃-IOTWORD物联网 » 使用PWM进行直流电机控制

发表评论