楼主你好,我在调试你这个程序的时候发现了一个疑问,不知道是否可商榷?
在X轴反转函数里面
void xn()//x轴反转
{
uint i;
while(!K4)
{
for(i=8;i>0;i--)
{
P1=step_table[ i];
delay(10);
}
这个for循环for(i=8;i>0;i--)可以调试通,但是反转实际运行步数是少一步的,这样会不会有丢步现象。
这是地址数组真值表:
uchar code step_table[]={0x8,0xa,0x2,0x6,0x4,0x5,0x1,0x9};
数组循环i++是正确,因为X轴正转的for循环是i++:for(i=0;i<8;i++)
数组的下标是从零开始,这样八位table取值是0,1,2,3,4,5,6,7,刚好匹配,
==========================重点
在反转中采用for循环i--:for(i=8;i>0;i--),
当第一次循环取的数值是step_table[i=8],实际上这已经数组越界,但是越界为什么会能转,因为只有几十毫秒的通电循环,可能堵转,这样第二步(step_table[i=7]是倒叙数组表也就是取的正传最后一位是正确的)当循环到step_table[i=0]时,因为判断条件是i>0,这样正转第一步也就是i=0是不赋值的,出现舍弃现象, X轴反转函数P1=step_table[0]是不执行的;会不会出现丢步?
===========================测试过程
按照这个思路修改调试:
先修改反转循环for(i=7;i>=0;i--),调试运行到最后一步I=0第一次可以,随后下一步出现堵转,
跟踪发现:在反转函数中,当i=0循环完毕后随后下一步,会出现随机数整数,在看开始定义约定。
unsigned int i,j;
这个unsigned 参数类型约定了无符号整形,查询一部分文档才发现无符号随机数的跳转,因为不同于数组赋值真值表,所以出现堵转。
按照保险的做法,又声明一个反转数组,只是把位置颠倒过来:
正转:uchar code step_table[]={0x8,0xa,0x2,0x6,0x4,0x5,0x1,0x9};
反转:uchar code step_table[]={0x9,0x1,0x5,0x4,0x6,0x2,0xa,0x8};
然后反转for循环是i++:for(i=0;i<8;i++)
这样步数同步了。
还一种方法,声明i参数不要unsigned 无符号声明,原来您的代码只是修改为for(i=7;i>=0;i--)其他不变,这样改不知道在单片机编程中是否合规。
为什么会考虑这个问题呢?
当需要循环计算指定角度步数的时候,需要累加循环次数,每八拍丢一步,实际上道最后差别就大了。
不知道我的思路对不对,希望楼主指点。
谢谢! |