STM32-PWM-控制直流电机

1.直流电机及驱动简介

直流电机是一种将电能转换为机械能的装置,有两个电极,当电极正接时,电机正转,当电极反接时,电机反转

直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作

TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速和方向

2.TB6612电路

3.代码展示

这篇文章代码不详细讲解,想看详细讲解可以去看我的另一篇文章,PWM驱动舵机

void PWM_Init(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_OCInitTypeDef TIM_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	//第一步开启时钟,RCC内部时钟,GPIOA
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
//	GPIO_SetBits(GPIOA,GPIO_Pin_0);
	
	//第二部选择时基单元的时钟,内部时钟模式
	TIM_InternalClockConfig(TIM2);
	
	//配置时基单元
//	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数模式
	//公式:1hz=72mhz/(psc+1)/(arr+1) 72mhz=72 000 000hz
	TIM_TimeBaseInitStructure.TIM_Period=100-1;//ARR自动重装器的值
	TIM_TimeBaseInitStructure.TIM_Prescaler=720-1;//PSC预分频器的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器参数,高级计数器菜使用
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
//PWM计算公式
//PWM频率:Freq=72mhz/(psc+1)/(arr+1)
//PWM占空比:Duty=CRR/(arr+1)
//PWM分辨率:Reso=1/(arr+1)
//例子;输出1khz的PWM波形 分辨率为1% 占空比为50%
//1%=1/(arr+1) arr=99 50%=CRR/100 CRR=50  PSC=720-1
//	TIM_OCInitTypeDef TIM_InitStructure;
	TIM_InitStructure.TIM_OCMode=TIM_OCMode_PWM1; //输出模式
	TIM_InitStructure.TIM_OCNPolarity=TIM_OCPolarity_High;//极性选择
	TIM_InitStructure.TIM_OutputState=TIM_OutputState_Enable;//输出使能
	TIM_InitStructure.TIM_Pulse=50;//CCR赋值
	TIM_OC3Init(TIM2,&TIM_InitStructure);
	
	//启动定时器
	TIM_Cmd(TIM2,ENABLE);
}

void PWM_SetCompare3(uint16_t Compare)
{
	TIM_SetCompare3(TIM2,Compare);
}

PA4,PA5是用来控制电机正反转的。 

void Motor_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStrucutre;
	PWM_Init();
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	GPIO_InitStrucutre.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStrucutre.GPIO_Pin=GPIO_Pin_4 |GPIO_Pin_5;
	GPIO_InitStrucutre.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStrucutre);
}

void SetSpeed(int8_t Speed)
{
	if(Speed>=0)
	{
		GPIO_SetBits(GPIOA,GPIO_Pin_4);
		GPIO_ResetBits(GPIOA,GPIO_Pin_5);
		PWM_SetCompare3(Speed);
	}
	else
	{
		GPIO_ResetBits(GPIOA,GPIO_Pin_4);
		GPIO_SetBits(GPIOA,GPIO_Pin_5);
		PWM_SetCompare3(-Speed);
	}
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值