运动控制器8:TIM2中断服务程序输出步进脉冲

我们仅使用了一个定时器来输出步进脉冲,脉冲和方向输出引脚的映射如下:

运动控制器8:TIM2中断服务程序输出步进脉冲_第1张图片
步进脉冲,方向和脱机控制输出引脚分配表

对输出轴控制,有三个常用功能,设置高电平输出,低电平输出和读回现在的输出电平

#define OUT_Y1        GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)

#define OUT_Y1_ON    GPIO_ResetBits(GPIOD, GPIO_Pin_14)

#define OUT_Y1_OFF    GPIO_SetBits(GPIOD, GPIO_Pin_14)

以及定义了如下的三个协同宏定义,STEP_MASK,DIRECTION_MASK,和STEPPING_MASK,定义宏定义的目的就是同时进行判断和设置。

#define STEP_MASK ((1<

#define DIRECTION_MASK ((1<

#define STEPPING_MASK (STEP_MASK | DIRECTION_MASK)

如,读回现在的输出状态,如下

#define STEPPING_PORT      OutputRead()  //正在进行步进脉冲的位置,读回现在的输出状态

这样,下面的这条语句就用于实现将现在已经输出高电平的位进行拉低设置,不需要逐条判断了。

OutputControl((STEPPING_PORT & ~STEP_MASK) | 0x00); //正在进行脉冲输出的步进脉冲位清零,实现反转,整条定时器的中断服务程序结构如下:

void TIM2_IRQHandler(void){

判断状态寄存器是否确定中断产生;

将FLAG复位,计数器复位

判断pin_h,这个位在中断完成以后将设置为0,这时我们判断,如果为0,则++;

调用OutputControl将目前为高电平的步进脉冲输出位设置为1;并设置状态为busy;

如果一个Block执行完毕,则取出新的BLOCK,用函数plan_get_current_block

// 在TIM2中断服务程序中有调用,如果一个BLOCK执行完毕,用此函数取出新的BLOCK

block_t *plan_get_current_block()

如果新的BLOCK也没有了,则调度器进入闲置模式,如下:

取出新的BLOCK以后,将BLOCK的参数配置给结构体stepper_t.

如果当前的BLOCK都没有执行完,则继续执行当前的BLOCK

//这里开始执行一个未完成的BLOCK,一个BLOCK要进行多次脉冲输出,判断下一个输出的脉冲是哪一轴,先判断X,再判断YZ,方法是一样的。

st.counter_x += current_block->steps_x;

if (st.counter_x > 0) {}

判断完成以后,step_events_completed参数++,这个参数是计算整体输出步进数量。

然后此参数和计算的脉冲数量进行判断,来确定BLOCK是否完成了,如果没有完成,则

另注意这个参数STATE_HOLD,这个是进给保持,一个稳定的减速过程需要进给进行保持,否则会进行跳跃,所以需要判断此位。

然后再进行一个判断,是否要进入闲置模式,判断完成以后调用一个重要的函数set_step_events_per_minute,因为此函数是用来设置新的CRR,也就是设置下一次TIM2中断的计数时间,函数为config_step_timer,入口参数是我们经过计算的steps_per_minute,函数在一番判断和设置不同的倍频后,设置ARR和prescaler。

TIM2->PSC = prescaler;   

TIM2->ARR = ceiling;

继续为了稳定位置和速度输出,sys.state != STATE_HOLD则进行另外一个跳转算法,同样在计算完成以后条用set_step_events_per_minute,参数为经过调整后的trapezoid_adjusted_rate。

//BLOCK完成了,将此BLOCK挂起,设置好列队的头尾值

void plan_discard_current_block()

并设置为不BUSY,可以执行下一个任务。

最后,计算完成了,CRR也设置好了,千万别忘记实际的端口输出,包括步进和方向,如下:

OutputControl((STEPPING_PORT & ~DIRECTION_MASK) | (out_bits & DIRECTION_MASK));

OutputControl((STEPPING_PORT & ~STEP_MASK) | out_bits);

并设置pin_h = 0;

你可能感兴趣的:(运动控制器8:TIM2中断服务程序输出步进脉冲)