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)

STM32中的高级定时器TIM1可作为专门的电机驱动定时器。通过设置TIM1_CCER寄存器的CCxE、CCxNE位。
Step[N]
CCER_MASK = 0x0055
TIM1_CCER &= ~ CCER_MASK;
TIM1_CCER |= Step[N], N=0,1,2,3
TIM1时钟FTIM1_CLK = 72M/72=1MHz。ARR值(Period)为400。
则:PWM周期TPWM = 1us × 400 = 400us
CCR1、CCR2值为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寄存器的CCPC置1
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;
//COM置1
/* 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);
/* MOE置1 - 主输出允许 */
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
在比较中断服务程序中调整TIM1_CCER寄存器的CCxE、CCxNE位。
#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
{
u16 tmpccer = 0;
if ((TIM1->SR & 0x0001) != 0)
。。
}
在更新UIF标记中进行操作。软件仿真波形如下:
[img][/img]
但是在烧录到芯片后,PA8/PA9/PB13/PB14都为低电平,为什么?
1.gif