本篇将介绍stepper.c源码以及PWM,该部分主要负责步进电机控制
大量专用词汇笔者已经在上一篇介绍serial.c时说明,所以本篇直接展示重要函数的功能
1.stepper_init() :步进电机初始化
2.ISR(TIMER1_COMPA_vect):定时器1中断处理,比较中断,可以在设置任意数值
3.ISR(TIMER0_OVF_vect):定时器0中断处理,溢出中断,溢出中断只能在计数器达到最大值或最小值时触发
注:比较中断和溢出中断的比较
在某些情况下,溢出中断可能会因为中断服务程序(ISR)的执行时间而产生误差。如果ISR执行时间较长,可能会导致下一个溢出中断延迟,从而影响定时精度。而比较中断由于可以在任意时刻设置,因此可以减少这种误差
4.st_go_idle():步进电机进入空闲状态
5.st_resst():步进电机变量重置
6.st_get_realtime_rate():获取当前正在执行的速度
7.st_prep_buffer():准备步进电机的运动缓冲区,将G-code命令转换为步进电机的运动指令
8.st_parking_setup_buffer():设置步进电机的停车缓冲区,用于在运动完成后将步进电机移动到安全的位置
9.st_generate_step_dir_invert_masks():生成步进电机步进和方向信号的反转掩码
PWM
在介绍stepper.c如何进行步进控制前,首先需要了解PWM,全称脉冲宽度调制。是一种通过调节数字信号的脉冲宽度(高电平持续时间)来控制模拟效果的常用技术。充分利用了数字信号相比与模拟信号更不易受噪声影响的优点,其核心思想是:用数字信号的开关比例,模拟不同的“等效电压”。
也就是说PWM本质是数字信号,只有0和1两种状态,但通过快速开关和占空比(占空比=高电平时间/周期时间)来模拟出如可变电压的模拟信号(如下)。举个例子:可以通过改变占空比控制LED的亮度,人眼感知的是平均光强
Grbl的步进控制并没有完全直接使用PWM,而是采用了一种“间接PWM”的操作。
为追求高实时性和低资源占用,牺牲了标准PWM的连续性,选择更灵活的中断驱动方式。每个脉冲都由中断精确计数,避免连续输出导致的累积误差,使得对电机的控制中更高效可靠,但需要深入理解硬件定时器的底层行为,接下来将结合上图详细介绍。
我们知道Grbl通常有timer0和timer1两个定时器。
timer0用来控制脉冲宽度以保证有足够脉宽给步进电机驱动
timer1用来控制脉冲频率以控制步进电机速度
由timer1产生步进脉冲周期,然后在timer1的中断函数中开启timer0,在timer0的中断函数中拉低电平,产生一个很窄的步进脉冲信号。
timer1决定了PWM中的Duration Time而timer0决定了Duty Cyle Time,这里与常规PWM不同的是Duration Time是可变的,如此允许了更灵活的频率调整,可以通过动态修改脉冲间隔实现复杂的加速度曲线。
顺带一提,Grbl的主轴控制与步进控制不同,在不需要高动态频率调整和精确脉冲计数的情况下,依旧采用了“直接PWM”的方式控制主轴转速。
下一篇将接着第三篇详细介绍其余的重要算法
以上便是本篇的全部内容啦!
欢迎大家一起交流学习!