运动控制器7:TIM2如何中断控制步进脉冲?
发布网友
发布时间:2023-05-27 20:08
我来回答
共1个回答
热心网友
时间:2024-09-02 12:06
定时器的中断服务程序定义在 stepper.c 中,而定时器的初始化则定义在函数st_init中.
STEPPER.C是直接驱动步进电机的程序,在文件中,首先申明了一个步进电机的结构体,如下:
typedef struct {
// 使用BRESENHAM算法
int32_t counter_x, // 绘制直线的XYZ参数
counter_y,
counter_z;
uint32_t event_count;
uint32_t step_events_completed; // 完成此运动需要的步数量
//下面用于梯形的产生
uint32_t cycles_per_step_event;
uint32_t trapezoid_tick_cycle_counter;
uint32_t trapezoid_adjusted_rate;
uint32_t min_safe_rate;
} stepper_t;
此结构体用于TIM2的中断函数中,具体TIM2如何用,需要怎么样的配置,在移植的时候很关键,下一篇再解读。
TIM2定义了一个静态参数static char pin_h = 1;主要循环的结构如下;
if ((TIM2->SR & 0x0001) != 0) // 如果确实有中断发生,则清除标志和初始值清零。
{TIM2->SR &= ~(1<<0); TIM2->CNT = 0;
if(pin_h == 0){pin_h++;……} //这里是计算的重头戏,没怎么看懂
else if(pin_h != 0){
OutputControl((STEPPING_PORT & ~DIRECTION_MASK) | (out_bits & DIRECTION_MASK));
OutputControl((STEPPING_PORT & ~STEP_MASK) | out_bits); pin_h = 0;}
函数主要执行的是,从计数器从0开始,但是下一个溢出点是通过中间这块的计算来得到的。
源码GRBL还进行了脉宽的设置,也就是说用到了两个定时器,但是我们这里只用到了TIM2.
TIM的初始化设置如下:
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // enable clock for TIM2
TIM2->PSC = 0; // set prescaler
TIM2->ARR = 1000; // set auto-reload
TIM2->CR1 = 0; // reset command register 1
TIM2->CR2 = 0; // reset command register 2
TIM2->DIER = (1<<0); // Update interrupt enabled
TIM2->CR1 |= (1<<0); // Enable Timer
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //选择定时器2中断线
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道
NVIC_Init(&NVIC_InitStructure);
黑体加粗部分,我们主要计算的就是下一个重新加载的值,我们可以看到,在下面的函数里面,对ARR进行了重新设置。
TIM2->PSC = prescaler; // set prescaler
TIM2->ARR = ceiling;
函数本体为:config_step_timer,通过入口函数cycle来设置ceiling的值。
继续往上一级调用函数查找,发现steps_per_minute值是通过cycles_per_step_event来获得的,上文中介绍到过这个参数,它是stepper_t结构体中的一个参数,调用此参数的函数在定时器TIM2的中断服务程序中被调用:
TIM2中断服务对重载值进行了设置
这样,普通定时器TIM2开启以后,以初始化的ARR进行中断,中断完成以后,只需要设置ARR,而ARR的设置经过了一系列的复杂计算,具体如何实现,我们下篇再进行解读。定时器处理完ARR后,将引脚进行设置输出,从而输出脉冲。
这样,我们在移植程序时,只需要设置TIM2的初始化部分就可以了。
运动控制器7:TIM2如何中断控制步进脉冲?
继续往上一级调用函数查找,发现steps_per_minute值是通过cycles_per_step_event来获得的,上文中介绍到过这个参数,它是stepper_t结构体中的一个参数,调用此参数的函数在定时器TIM2的中断服务程序中被调用:TIM2中断服务对重载值进行了设置 这样,普通定时器TIM2开启以后,以初始化的ARR进行中断,中断...
关于控制步进、伺服电机的加减速过程和脉冲数的问题?
对于脉冲频率控制加减速过程分两种情况:1、运动距离大于加减速距离,那就按正常加减速脉冲量加上差值; 2、总运动距离小于加减速距离,那就按最小速度移动或相应速度段移动需要的脉冲量。设:移动脉冲量为: m 加速的脉冲量为: ac 减速的脉冲量为: ad 一. m > ac+ad 正常模式 二 、小于...
运动控制器输出到步进电机的A A- B B-是不是就是差分脉冲?
不是,步进电机是不能接收差分讯号,也不支持差分脉冲的。只有步进电机驱动器的讯号接收口才可以。具体怎么确定。如下图:
运动控制卡只能控制步进电机或伺服电机,那么可以用步进电机或伺服电机...
肯定可以了,减速机本来就是直接与 步进电机或 伺服电机 连接的。运动控制卡只是发脉冲信号给伺服驱动器或步进驱动器。还有什么问题,可以咨询一下 长沙市两湖机电设备有限公司,两湖机电主要提供1-4轴以太网运动控制卡。
三菱 信捷plc如何用编码器控制步进电机
首先确定一个定时中断程序,控制精度越高,那么你的定时中断时间应越短,步进电机的控制就在中断里面做。(一般为1-10ms均可。)其实,步进电机的控制可看做有差调节,中断中采集到 这次的编码器脉冲值-上次中断的采集编码器值=脉冲增量,这就是步进电机输出了,根据自己的需求,可以再脉冲增量前乘以一...
如何确定步进电机的脉冲数?
没有细分状态,控制系统每发一个步进脉冲信号,步进电机就按照整步旋转一个特定的角度。步进电机的参数,都会给出一个步距角的值。如110BYG250A型电机给出的值为0.9°/1.8°(表示半步工作时为0.9°、整步工作时为1.8°),这是步进电机固有步距角。通过步进电机驱动器设置的细分状态,步进电机将会按照细分的步距角...
如何控制步进电机?
问题一:如何控制步进电机??? 步进电机动作的话要靠驱动器来驱动的,步进电机也叫脉冲电机,给一个脉冲转一个角度。12V的话要控制要先买个开关电源,把220V变成12V接到驱动器,再用驱动器控制电机,还要一个外部给脉冲的控制器(单片机或者PLC)给驱动器脉冲信号、问题二:如何控制步进电机 看下...
步进电机如何控制
1.全步进控制:通过给步进电机施加一系列的脉冲信号,每个脉冲信号使电机转动一个固定的角度,通常为1.8度或0.9度。脉冲信号可以由微控制器或步进电机驱动器提供。2.半步进控制:半步进控制是通过在全步进信号之间插入额外的脉冲信号来实现更细微的转动角度。通过在上一步进脉冲之间给出一个额外的脉冲,...
伺服控制系统中如何控制上位机发出的脉冲数
提供速度或电流以及位置信息。脉冲个数和频率取决于主控芯片对于控制指令的处理,最简单的操作,以步进电机控制为例,脉冲频率越快,速度越快,脉冲个数越多,运动距离越远。一般原理都是通过定时器中断进行控制,最基本的就是通过设定定时器中断时间,改变脉冲频率,通过计数器控制脉冲个数。
PLC如何控制步进电机的运行速度和方向
PLC对步进电机也具有良好的控制能力,利用其高速脉冲输出功能或运动控制功能,即可实现对步进电机的控制。步进电机是一种低转子惯量、高定位精度、小误差、控制简单的电机,是运动控制领域的主要执行元件之一。PLC作为一种工业控制计算机,具有模块化结构、配置灵活、高速的处理速度、精确的数据处理能力、多种...