|
楼主 |
发表于 2011-7-30 10:19:56
|
显示全部楼层
我在这里就大概讲讲我这个程序的细分思路:
大家都知道我的硬件电路接法只能跑单四拍(原因是为了节省CPU I/O,加了74HC14反相器)。即:
A B C D
1 1 0 0 // 第一拍
0 1 1 0 // 第二拍
0 0 1 1 // 第三拍
1 0 0 1 // 第四拍
这样就形成一个循环的节拍周期。没有细分的程序就是不断的查表循环跑上图这四个节拍,而我的细分思路就是:第一拍和第二拍,第二拍和第三拍,第三拍和第四拍,第四拍和第一拍之间插入16个细分因子,把驱动节拍的0和1扩大成16位,所以有了这个表:
unsigned int code wTableUnl2803DriveValue[] =
{
0x0000, 0x0080, 0x0820, 0x1110, 0x2244, 0x2492, 0x4a52, 0x5554,
0xaaaa, 0xabaa, 0xbaae, 0xbbba, 0xeeee, 0xeefe, 0xf7f7, 0x7fff,
};
这个表里的每个数据都是16位的,通过检测这16个位每个位是0或是1,来确定CPU I/O 输出的是当前的第一拍还是下一拍,就这样依次把表里的每个数据都做一次检测,这样就有了在当前拍和下一拍之间插入了16个高低电平.程序如下:
for (c = 0; c != 16; c ++)
{
if (wTemp & 0x0001)
cDriveValue = cPhaseValueRight;
else
cDriveValue = cPhaseValueLeft;
cPwmDriveBuffer[c] &= cShieldValue;
cPwmDriveBuffer[c] |= cDriveValue;
wTemp >>= 1;
}
cPwmDriveBuffer[16] &= cShieldValue;
cPwmDriveBuffer[16] |= cPhaseValueRight;
} |
|