新手上路
- 积分
- 22
- 金钱
- 22
- 注册时间
- 2016-10-25
- 在线时间
- 4 小时
|

楼主 |
发表于 2016-10-25 12:40:09
|
显示全部楼层
贴上相关的代码:
void Exit_PE4(void)//Öá1
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO , ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_GenerateSWInterrupt(EXTI_Line4);
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI4_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line4) != RESET)
{
srd1.run_state = STOP;//这个标志位可以在定时器中断中关掉电机的定时器
EXTI_ClearITPendingBit(EXTI_Line4);
}
}
void moto_irq(speedRampData *srd)
{
if(srd->moto_id==1)
{
TIM1->ARR=srd->step_delay;
}
else if(srd->moto_id==2)
{
TIM2->ARR=srd->step_delay;
}
else if(srd->moto_id==3)
{
TIM3->ARR=srd->step_delay;
}
else if(srd->moto_id==4)
{
TIM4->ARR=srd->step_delay;
}
else if(srd->moto_id==5)
{
TIM5->ARR=srd->step_delay;
}
else if(srd->moto_id==6)
{
TIM6->ARR=srd->step_delay;
}
else if(srd->moto_id==7)
{
TIM7->ARR=srd->step_delay;
}
else if(srd->moto_id==8)
{
TIM8->ARR=srd->step_delay;
}
if(srd->run_state)
{
sm_driver_StepCounter(srd->dir,srd->moto_id);
}
srd->i++;
if(srd->i==2)
{
srd->i=0;
switch(srd->run_state)
{
case STOP:
srd->step_count = 0;
srd->rest = 0;
srd->flag_pulse_end=1;
if(srd->moto_id==1)
{
TIM_Cmd(TIM1, DISABLE);
}
else if(srd->moto_id==2)
{
TIM_Cmd(TIM2, DISABLE);
}
else if(srd->moto_id==3)
{
TIM_Cmd(TIM3, DISABLE);
}
else if(srd->moto_id==4)
{
TIM_Cmd(TIM4, DISABLE);
}
else if(srd->moto_id==5)
{
TIM_Cmd(TIM5, DISABLE);
}
else if(srd->moto_id==6)
{
TIM_Cmd(TIM6, DISABLE);
}
else if(srd->moto_id==7)
{
TIM_Cmd(TIM7, DISABLE);
}
else if(srd->moto_id==8)
{
TIM_Cmd(TIM8, DISABLE);
}
break;
case ACCEL:
srd->step_count++;
srd->accel_count++;
srd->new_step_delay = srd->step_delay - (((2 * (long)srd->step_delay) + srd->rest)/(4 * srd->accel_count + 1));
srd->rest = ((2 * (long)srd->step_delay)+srd->rest)%(4 * srd->accel_count + 1);
if(srd->step_count >= srd->decel_start)
{
srd->accel_count = srd->decel_val;
srd->run_state = DECEL;
}
else if(srd->new_step_delay <= srd->min_delay)
{
srd->last_accel_delay = srd->new_step_delay;
srd->new_step_delay = srd->min_delay;
srd->rest = 0;
srd->run_state = RUN;
}
break;
case RUN:
srd->step_count++;
srd->new_step_delay = srd->min_delay;
if(srd->step_count >= srd->decel_start)
{
srd->accel_count = srd->decel_val;
srd->new_step_delay = srd->last_accel_delay;
srd->run_state = DECEL;
}
break;
case DECEL:
srd->step_count++;
srd->accel_count++;
// srd->new_step_delay = srd->step_delay - (long)(2 * srd->step_delay + srd->rest)/(4 * srd->accel_count + 1);
// srd->rest = (long)(2 * srd->step_delay+srd->rest)%(4 * srd->accel_count + 1);
srd->new_step_delay = srd->step_delay - (((2 * (long)srd->step_delay) + srd->rest)/(4 * srd->accel_count + 1));
srd->rest = ((2 * (long)srd->step_delay)+srd->rest)%(4 * srd->accel_count + 1);
if(srd->accel_count >= 0)
{
srd->run_state = STOP;
}
break;
}
srd->step_delay = srd->new_step_delay;
}
}
|
-
|