本帖最后由 李逍遥 于 2019-6-3 23:16 编辑
首先,感谢作者的分享,认真读完代码,学到了很多知识,但在其中发现一些错误,可能是我的拙见,如果理解错误请指出。
问题:在运行原代码时,电机总是转动一个角度,然后来回晃一晃,再转动一个角度,再晃一晃,起初以为是电机质量问题。在读到#define ROTATE(x) {PORTD|=x; PORTD&=(x|0x0F);}时产生疑惑,之后仔细分析,发现错误。
错误:以四相单四拍为例const char SinBeat[4]={0x80,0x40,0x20,0x10};四相单四拍的本意是给PORTD依次赋值0x80 0x40 0x20 0x10从而实现单四拍的目的。而根据ROTATE(x)的定义,PORTD的赋值依次为0x80 0xc0 0x40 0x60 0x20 0x30 0x10 0x90这就变成四相双八拍的了 。显然,对于四相双八拍,就大错特错了,由于原代码初始使用的是四相双八拍,所以出现了晃动的现象。(同时,对于(x|0x0F)尚有不解,因为全程没有涉及到3号脚,而且这样对3号脚也没有影响)
猜想:估计#define ROTATE(x) {PORTD|=x; PORTD&=(x|0x0F);}这一条代码是专门为四相双八拍设计的,这样在定义时,只用定义四个数值即可。
修改:由于作者在给三种模式定义时,精确到每一步的数值,所以直接删去#define ROTATE(x)的定义,对于逆时针旋转和顺时针旋转的函数中,将ROTATE(MODE);修改为PORTD&