您的位置:首页 > 其它

STM32 配置定时器让引脚输出PWM波形

2015-07-03 00:00 666 查看
摘要: STM32 配置定时器让引脚输出PWM波形

最近一个项目需要控制比较多的步进电机,而且还要求步进电机能几个同时转,用软件计时然后定时翻转IO脚太麻烦了,也不好用,好在STM32可以通过配置定时器让特定引脚输出PWM波形,配置好后打开输出,使能定时器,然后只需要在中断中判断是否应该停止即可。附定时器配置代码:

/*
* 函数名:void TIMx_PWMOutConf(TIM_TypeDef * TIMx,uint32_t RCC_APB1Periph)
* 描述  :初始化通用定时器TIMx作为PWM输出
* 输入  :TIMx: where x can be 1 to 17 to select the TIM peripheral,定时器时钟地址,通道编号
* 输出  :无
*/
void TIMx_PWMOutConf(TIM_TypeDef * TIMx,uint8_t TIMx_Channelx,uint32_t RCC_APB1Periph_TIMx)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_DeInit(TIMx);

/*开启TIM时钟*/
if(RCC_APB2Periph_TIM8 == RCC_APB1Periph_TIMx || RCC_APB2Periph_TIM1 == RCC_APB1Periph_TIMx)
{
RCC_APB2PeriphClockCmd(RCC_APB1Periph_TIMx,ENABLE);
}
else
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx,ENABLE);
}

/*设置周期*/
TIM_TimeBaseInitStructure.TIM_Period = PWM_INIT_PERIOD;
/*设置定时器时钟频率*/
TIM_TimeBaseInitStructure.TIM_Prescaler = TIM_INIT_PRESCALER;
/*向上计数模式*/
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
/*设置TIMx预分频寄存器和自动重装寄存器*/
TIM_TimeBaseInit(TIMx,&TIM_TimeBaseInitStructure);

/*要设置TIMx_CR1 寄存器的ARPE 位,使TIMx_ARR 寄存器具有缓冲*/
TIM_ARRPreloadConfig(TIMx,ENABLE);
/* PWM1模式 在向上计数时,一旦TIMx_CNT<TIMx_CCR1 时通道1为有效电平,否则为
无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1 时通道1 为无效电平
(OC1REF=0) ,否则为有效电平(OC1REF=1) */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
/*有效电平为高电平*/
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
/*设置占空比*/
TIM_OCInitStructure.TIM_Pulse = PWM_INIT_DUTY_CYCLE;
/*允许PWM输出*/
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
switch(TIMx_Channelx)
{
case 1:
{
/*必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器*/
TIM_OC1PreloadConfig(TIMx,TIM_OCPreload_Enable );
&nb
3ff0
sp;          TIM_OC1Init(TIMx,& TIM_OCInitStructure);
/*允许比较中断*/
TIM_ITConfig(TIMx,TIM_IT_CC1,ENABLE);
}break;

case 2:
{
/*必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器*/
TIM_OC2PreloadConfig(TIMx,TIM_OCPreload_Enable );
TIM_OC2Init(TIMx,& TIM_OCInitStructure);
/*允许比较中断*/
TIM_ITConfig(TIMx,TIM_IT_CC2,ENABLE);
}break;

case 3:
{
/*必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器*/
TIM_OC3PreloadConfig(TIMx,TIM_OCPreload_Enable );
TIM_OC3Init(TIMx,& TIM_OCInitStructure);
/*允许比较中断*/
TIM_ITConfig(TIMx,TIM_IT_CC3,ENABLE);
}break;

case 4:
{
/*必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器*/
TIM_OC4PreloadConfig(TIMx,TIM_OCPreload_Enable );
TIM_OC4Init(TIMx,& TIM_OCInitStructure);
/*允许比较中断*/
TIM_ITConfig(TIMx,TIM_IT_CC4,ENABLE);
}break;

default:
break;
}

if(RCC_APB2Periph_TIM8 == RCC_APB1Periph_TIMx || RCC_APB2Periph_TIM1 == RCC_APB1Periph_TIMx)
{
TIM_CtrlPWMOutputs(TIMx, ENABLE);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  STM32 定时器 PWM