五.步值计数产生AB极性逻辑和正反转
网上看到的步进电机驱动程序千篇一律的都是数组存储io状态查表输出,带细分更少。先来梳理一下目前已经现在做到的内容,内存中有一个数组存放整个正弦半周期的实时运算的spwm数据,这个数据是根据当前的pwm周期折算过,因此每个pwm周期依次将数组内容赋值给定时器通道值就可以在定时器通道管脚输出正弦变化的pwm了。另外使用一个(l6205是两个,也可以用非门)io口来控制极性输出,比如高电平输出正弦负半周,低电平输出正弦正半周。
接下来需要安排一个合理而简单的数据结构把步进计数、细分和极性控制合为一体。首先我们用一个s32 stepcounter全局量来做步进计数,它的数值与步进电机的实时位置对应,这个变量是一个很关键的变量,因为任意时刻的AB两相spwm数据输出点和极性控制信号都由它产生。假设我们把它的低八位视为细分步计数(256为最大细分),则这个计步值除256对应整步位置。另外安排一个u8 microstep用来控制细分步进,它的取值和当前的细分度有关,如果256细分则
microstep=1,128细分microstep=2,以此类推.如果电机正转前进一个微步则stepcounter+=microstep,如果反转一个微步则
stepcounter-=microstep(微步进这部分可以放到中断程序里),OK正反转很简单,微步前进自动更新整步。关键点在于如何使用这个计数值产生两个相位的极性信号输出控制和A相B相的spwm数据位置,这里解释一下为什么会希望控制都由这一个变量产生:因为这样的程序最