步进电机程序
请帮忙看下自己写的一部分步进程序,已实验过能工作。请问这样改变CCR1的值行吗,有更好的方法吗
void TIM3_IRQHandler(void)
{
u16 temp;
static u16 x_step,counter;
if(TIM3->SR&=0x0002)
{
TIM3->SR&=0xfffd; //清中断标志
*X_EN=0;//开X驱动器
if(xup_step==0) //加速段结束
{
if(xhigh_step==0) //高速段结束
{
if(xdown_step==0) //减速段结束
{
TIM3->CR1&=0xfffe;//关定时器和中断
TIM3->DIER&=0xfffd;
*X_EN=1; //关X驱动器
*X_CLK=1;
x_step=0;
}
else
{
counter=1000000/(START_FRE+(UPDOWN_FRE*xdown_step));//减速段,调整脉冲频率
if((TIM3->CCR1+counter)>0xffff)
{
temp=0xffff-TIM3->CCR1;
TIM3->CCR1=counter-temp;
}
else
{
TIM3->CCR1+=counter;
}
*X_CLK=~*X_CLK; //步进脉冲改变状态
if(*X_CLK)
{
x_step++; //步数加一
xdown_step--;
}
}
}
else
{
if((TIM3->CCR1+counter)>0xffff) //高速段,调整脉冲频率
{
temp=0xffff-TIM3->CCR1;
TIM3->CCR1=counter-temp;
}
else
{
TIM3->CCR1+=counter;
}
*X_CLK=~*X_CLK; //步进脉冲改变状态
if(*X_CLK)
{
x_step++; //步数加一
xhigh_step--;
}
}
}
else
{
counter=1000000/(START_FRE+(UPDOWN_FRE*x_step));//加速段,调整脉冲频率
if((TIM3->CCR1+counter)>0xffff)
{
temp=0xffff-TIM3->CCR1;
TIM3->CCR1=counter-temp;
}
else
{
TIM3->CCR1+=counter;
}
*X_CLK=~*X_CLK; //步进脉冲改变状态
if(*X_CLK)
{
x_step++; //步数加一
xup_step--;
}
}
}
}
/**************************TIM3配置*********************************/
void TIM3_Configuration(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure; //基本结构体变量定义
TIM_OCInitTypeDefTIM_OCInitStructure; //输出结构体变量定义
TIM_DeInit(TIM3);
TIM_TimeBaseStructure.TIM_Prescaler = 35; //TIM基本初始化
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period =65535;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; //TIM输出通道初始化
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse =65535;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3,&TIM_OCInitStructure);
TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE); //开定时器中断
TIM_Cmd(TIM3,ENABLE);
} STM32 基本定时器
/*******************************************************************************
* Function Name: TIM2_IRQHandler
* Description : This function handles TIM2 global interrupt request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void TIM2_IRQHandler(void)
{
/* 方法1:
// Clear TIM2 update interrupt
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
TIM_SetAutoreload(TIM2, Motor2Tcnt1Val); //TIM2->ARR = 1000 ; // T1Tcnt1Val 1000
Motor2DriveInTimer(); //Motor-Driver
*/
static u16 capture = 0;
//----------------TIM_IT_CC1---------------------------------------------
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) //1ms
{
// Clear TIM2 Capture Compare1 interrupt pending bit
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
Motor1DriveInTimer(); //Motor-Driver
capture = TIM_GetCapture1(TIM2);
TIM_SetCompare1(TIM2, capture + Motor1Tcnt1Val);
}
//----------------TIM_IT_CC2---------------------------------------------
else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
{
// Clear TIM2 Capture Compare2 interrupt pending bit
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
Motor2DriveInTimer(); //Motor-Driver
capture = TIM_GetCapture2(TIM2);
TIM_SetCompare2(TIM2, capture + Motor2Tcnt1Val);
}
//----------------TIM_IT_CC3---------------------------------------------
else if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
{
// Clear TIM2 Capture Compare3 interrupt pending bit
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
Motor3DriveInTimer(); //Motor-Driver
capture = TIM_GetCapture3(TIM2);
TIM_SetCompare3(TIM2, capture + Motor3Tcnt1Val);
}
//----------------TIM_IT_CC4---------------------------------------------
else
{
// Clear TIM2 Capture Compare4 interrupt pending bit
TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
Motor4DriveInTimer(); //Motor-Driver
capture = TIM_GetCapture4(TIM2);
TIM_SetCompare4(TIM2, capture + Motor4Tcnt1Val);
}
//-------------------------------------------------------------------------------
} 对不起没看懂
页:
[1]