TIM1的步进电机驱动问题

发布: 2009-9-29 23:33 | 作者: gabledon | 来源: StmFans思蜕盟 OPELC 自由电子联盟

各位,在用TIM1的PWM2模式进行步进电机驱动时,出现一些问题,有谁也碰到类试问题,可以交流交流
附件是文档。

TIM1驱动步进电机问题.rar
(2009-09-29 23:33:52, Size: 27.8 KB, Downloads: 13)

binglin (2009-10-01 00:07:44)
我帮楼主把文件内容贴上来了,省大家去下载,分析起来直观些:



STM32中的高级定时器TIM1可作为专门的电机驱动定时器。通过设置TIM1_CCER寄存器的CCxECCxNE位。


A
B
C
D






CH1
CH1N
CH2
CH2N
CC1E/CC1EN
CC2E/CC2EN
TIM1_CCER
Step[N]
1
PWM
-
PWM
-
10
10
0x0011
2
PWM
-
-
PWM
10
01
0x0041
3
-
PWM
-
PWM
01
01
0x0044
4
-
PWM
PWM
-
01
10
0x0014

CCER_MASK = 0x0055
TIM1_CCER &= ~ CCER_MASK;
TIM1_CCER |= Step[N], N=0,1,2,3


TIM1时钟FTIM1_CLK = 72M/72=1MHzARR值(Period)为400
则:PWM周期TPWM = 1us × 400 400us
CCR1CCR2值为100。则占空比τ100/400

TIM1初始化如下:
void TIM1_Configuration(void)
{

u16 tempCR2;



TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_BDTRInitTypeDef TIM_BDTRInitStructure;


TIM_DeInit(TIM1);



/* Time base configuration - 2.5KHz Period */

//F(CK_CNT) = 72M/(1+TIM_Prescaler )=1MHz

//TIM_Period = 1uS*400=400uS
    /* PWM输出模式*/
    /*A-PA8(TIM1_CH1), B-PA9(TIM1_CH2), C-PB13(TIM1_CH1N), D-PB14(TIM1_CH2N) */


TIM_TimeBaseStructure.TIM_Period = 400-1;

  //TIMx_ARR  

TIM_TimeBaseStructure.TIM_Prescaler = 71;

  //TIMx_PSC



TIM_TimeBaseStructure.TIM_ClockDivision = 0;






TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

TIM_ARRPreloadConfig(TIM1, ENABLE);

TIM_CCPreloadControl(TIM1, ENABLE);
//CR2寄存器的CCPC1

tempCR2 = TIM1->CR2;

tempCR2 |= 0x0004;
//bit CCUS of CR2 Register set 1

TIM1->CR2 = tempCR2;



TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;

TIM_OCInitStructure.TIM_Pulse = CCR1_VAL;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;

TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;

TIM_OC1Init(TIM1, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);



TIM_OCInitStructure.TIM_Pulse = CCR1_VAL;

TIM_OC2Init(TIM1, &TIM_OCInitStructure);

TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Disable);


/* 配置自动输出允许、中止、死区和锁定级别 */

TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;

TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;

TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;

TIM_BDTRInitStructure.TIM_DeadTime = 0;

TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;

TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;

TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);


TIM1->EGR = 0x0020;
//COM1


/* TIM IT enable [使能TIM1更新中断]*/

//TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);


TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);


TIM_ITConfig(TIM1, TIM_IT_COM, ENABLE);




TIM_Cmd(TIM1, ENABLE);




/* MOE1 - 主输出允许  */

TIM_CtrlPWMOutputs(TIM1, ENABLE);


}

在比较中断服务程序中调整TIM1_CCER寄存器的CCxECCxNE位。

#define CCER_MASK  0x00FF

const unsigned int StepperValue[4] =
{

0x0011, 0x0041, 0x0044, 0x0014
};

void TIM1_CC_IRQHandler(void)
{

u16 tmpccer = 0;



if ((TIM1->SR & 0x0002) != 0)

{


TIM1->SR &= ~(1<<1);
// clear UIF flag



TIM_CtrlPWMOutputs(TIM1, DISABLE);





/* Get the TIMx CCER register value */


tmpccer = TIM1->CCER;



tmpccer &= ~CCER_MASK;





StepMotor_Step_Num ++;


if(StepMotor_Step_Num == 4) StepMotor_Step_Num = 0;



tmpccer |= StepperValue[StepMotor_Step_Num];





/* Write to TIMx CCER */


TIM1->CCER = tmpccer;



TIM_CtrlPWMOutputs(TIM1, ENABLE);


}
}

然而,问题出在比较中断后输出波形有一小段抖动,而且PB14输出极性也产生变化。如下图所示:




图片2.jpg




期望的波形如下:







图片3.jpg





gabledon (2009-10-12 14:43:36)
void TIM1_CC_IRQHandler(void)
{
u16 tmpccer = 0;
if ((TIM1->SR & 0x0001) != 0)
。。
}
在更新UIF标记中进行操作。软件仿真波形如下:
[img][/img]

但是在烧录到芯片后,PA8/PA9/PB13/PB14都为低电平,为什么?
gabledon (2009-10-12 14:49:32)
波形没有插入,重新插入波形:


1.gif

binglin (2009-10-25 16:48:27)
看不明白也要顶一把