中级会员
 
- 积分
- 356
- 金钱
- 356
- 注册时间
- 2016-7-20
- 在线时间
- 39 小时
|
本帖最后由 心语心愿 于 2017-7-16 12:11 编辑
最近控制步进电机转固定角度,在网上找很多帖子,有用DMA的,有用主从定时器的,其实STM32高级定时器就自带这样的功能,代码如下:
[mw_shl_code=c,true]void stepmotor_init()
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
GPIO_InitTypeDef GPIO_Structure;
GPIO_Structure.GPIO_Mode=GPIO_Mode_AF;
GPIO_Structure.GPIO_OType=GPIO_OType_PP;
GPIO_Structure.GPIO_Pin=GPIO_Pin_11;
GPIO_Structure.GPIO_PuPd=GPIO_PuPd_DOWN;
GPIO_Structure.GPIO_Speed=GPIO_High_Speed;
GPIO_Init(GPIOA,&GPIO_Structure);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_TIM1);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Down;
TIM_TimeBaseStructure.TIM_Period=249;
TIM_TimeBaseStructure.TIM_Prescaler=20;
TIM_TimeBaseStructure.TIM_RepetitionCounter=4;//这里是设置PWM输出个数,PWM个数是N+1,这里写4就是5个PWM
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
TIM_OCInitTypeDef OC_Structure;
OC_Structure.TIM_OCMode=TIM_OCMode_PWM1;
OC_Structure.TIM_Pulse=125;
OC_Structure.TIM_OutputState=TIM_OutputState_Enable;
OC_Structure.TIM_OutputNState=TIM_OutputNState_Enable;
OC_Structure.TIM_OCNPolarity=TIM_OCNPolarity_Low;
OC_Structure.TIM_OCPolarity=TIM_OCPolarity_High;
OC_Structure.TIM_OCIdleState=TIM_OCIdleState_Set;
OC_Structure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;
TIM_OC4Init(TIM1,&OC_Structure);
TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM1,ENABLE);
TIM_CtrlPWMOutputs(TIM1,ENABLE);
TIM_SelectOnePulseMode(TIM1,TIM_OPMode_Single);//这里是设置定时器单次脉冲模式,很重要
TIM_Cmd(TIM1,ENABLE);
}[/mw_shl_code]
注意一定要用高级定时器,理由如下:
[mw_shl_code=c,true] if ((TIMx == TIM1) || (TIMx == TIM8))
{
/* Set the Repetition Counter value */
TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;
}[/mw_shl_code]
附带一张测试图片:不过这种方法也有缺点,就是最多能控制输出256个PWM
|
-
|