STM32定时器PWM波电机驱动直流电机

利用stm32单片机控制直流电机。

硬件部分:stm32f103c8t6、TB6612电机驱动模块、直流减速电机

首先搞明白原理。例如一个12v的直流电机,在其两端接上12v的电压,电机会满额转动,转速达到自身最快。若想控制速度变化,就需要改变电机两端的电压。此处我们利用PWM波实现,PWM波涉及两个重要的概念:频率和占空比。后面在代码部分会讲到。

TB6612是一个电机驱动模块,能同时控制两路电机。下图是其原理图。其中PWMA、PWMB接单片机产生PWM波的通道的IO口。

 

 

 

基于keil5的代码部分。

首先编写TB6612的GPIO驱动函数代码,由于正反转是由高低电平控制的,所以初始化一下端口时钟,然后配置一下IO口,推挽输出,速度50Mhz,就可以。

 然后在头文件中对IO口进行宏定义,方便编写输出高低电平。

 

 之后利用PWM控制PWMA和PWMB。该部分需要用到芯片的定时器部分,所以需要有timer驱动文件,从例程中移植过来。

根据原理图,确定PWMA和PWMB和c8t6哪两个IO口相连(这两个IO口一定是定时器的两个通道),然后初始化外设,此处以定时器的通道1和通道4为例。

//TIM1 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//使能对应定时器
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能定时器1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,
ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE); //Timer3部分重映射
TIM3_CH2->PB5
//配置对应引脚功能
//设置该引脚为复用输出功能,输出TIM1 CH1 和CH4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11; //TIM_CH1 TIM_CH4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
//初始化TIM1
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据
TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM1 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3OC2
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
//初始化TIM1 Channel4 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC4Init(TIM1, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3OC2
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
TIM_Cmd(TIM1, ENABLE); //使能TIM1
TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能,高级定时器必须开启这个
}

之后再主函数中调用该初始化函数

TIM1_PWM_Init(1999,359);

 上面的1999和359分别是自动重载值和预分频数。例如c8t6的定时器1是挂载在72Mhz时钟下,先进行360的分频,72 000 000/360=200 000,然后没到2000自动重载值,200 000/2 000=100hz。

然后就可以改变占空比了。

TIM_SetCompare1(TIM1,1500);	 
TIM_SetCompare4(TIM1,500);

如上面所示,定时器1通道1的阈值设为1500,因为在定时器初始化部分设置的向上计数,所以就是定时器从1开始计数,计数到1500之后,输出高电平,到2000,也就是前面设置的自动重载值,则归为1继续重新计数。所以输出的PWM波形如下:

 同理,通道4的就跟通道1的波形反过来了。

以通道1为例,占空比为1/4,即A电机的平均电压为3v。

物联沃分享整理
物联沃-IOTWORD物联网 » STM32定时器PWM波电机驱动直流电机

发表评论