STM32输出PWM驱动直流电机——PWM输出
STM32输出PWM驱动直流电机需要 电机驱动板(我是买的这款),STM32需要输出一路PWM用于驱动电机,两路高低电平控制电机正反转。PWM输出选用TIM3定时器CH1通道控制(PA6),高低电平选用PD0、PD1控制。
定时器PWM初始化(timer.c)
void TIM3_PWM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//TIM3 GPIO 初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIO外设时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能定时器3时钟
//配置PWM输出频率100Hz,占空比为CCR/1000(千分之CCR) 10ms
//Fpwm = 72M / ((arr+1)*(psc+1))(单位:Hz) 72000000/(1000*720)
//76MHz = 76000000hz
TIM_TimeBaseStructure.TIM_Period=1000 - 1; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值1000
TIM_TimeBaseStructure.TIM_Prescaler= 720 -1; //设置用来作为TIMx时钟频率除数的预分频值720
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
//初始化TIM
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OCInitStructure.TIM_Pulse = 0; //默认输出占空比0
// CH1
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC1
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR1上的预装载寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIM3
}
控制引脚初始化(timer.c)
void MotorInit(void) //正反转控制引脚
{
//定义句柄
GPIO_InitTypeDef GPIO_InitStructure;
//GPIO挂上时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD , ENABLE);
//PD0、1初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 ; //引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
主函数
int main(void)
{
delay_init(); //延时函数初始化
TIM3_PWM_Init();
MotorInit();
while(1)
{
Cargo; //定义timer.h中 #define CarGo PDout(0)=0;PDout(1)=1
TIM_SetCompare1(TIM3,400); //预装载值1000与400比较,占空比40%
}
}
结果可通过keil仿真查看。