路灯标志物的讲解
路灯代码测试过程
公式:第十三、十四届比赛的公式
实验
距离 |
|
设置实参固定为330 |
|||
初始档位 |
|
1 |
2 |
3 |
4 |
目标档位(由公式运算得出) |
|
2 |
1 |
4 |
1 |
相差档位 |
|
1 |
3 |
1 |
1 |
调试编译 |
初始档位 |
1 |
1 |
3 |
3 |
最终档位 |
2 |
2 |
4 |
4 |
|
相差档位 |
1 |
1 |
1 |
1 |
|
结果正确? |
√ |
× |
√ |
|
|
实际最终档位 |
第一次实验 |
2 |
1 |
2(手动按至初始档位:3挡) |
1 |
第二次实验 |
4(由初始档位:4档执行程序到1档,再按下小车按钮,结果为4) |
1 |
4 |
1 |
|
第三次实验 |
4 |
1 |
2 |
1 |
|
第四次实验 |
4 |
1 |
4 |
1 |
|
第五次实验 |
2(按了RST复位键) |
3 |
4 |
1 |
|
第六次实验 |
2(由初始档位:4档执行程序到1档,再按下小车按钮,结果为2) |
3(原因是初始档位认作了1挡) |
4 |
1 |
|
第七次实验 |
2 |
|
2 |
1 |
|
更多次实验 |
大多数为2,少数为4 |
大多数为1 |
大多数为4,少数为2 |
始终为1 |
|
路灯最终档位结果是否符合预期 |
|
|
|
|
始终符合 |
结论 |
暂空 |
【问题】
光照强度同时赋值给了p[0]和p[1](如下图),这不符合我所编写的代码逻辑。(代码在最底部)。
【研究】
给循环体内的加档位(下图335行)和读取光照值(下图338行) 两处代码加断点,
手动操控加档和读取,连续测试好几次发现数组元素均能正确赋值。
由于手动调试是分布进行的,由此得出:可能是由于加档位 和 读取光照值 两个操作间隔时间太短而导致p[0]和p[1]读取到了同一光照档位的值。
【改进】
在原来延时1s的基础上又加了0.5s延时,测试好几次均正确。但由于路灯标志物 耗费时间太长,故最终直接沿用了书上代码。经少量次(5~6次,明天再测试12次,每个档位、不同距离各测三次)测试,书上代码可用且没有出现上述问题。
【结论】
我认为自己写的代码与书上逻辑一致。且有一个疑问尚存,就是:书上的(加档位与读取光照值之间的)代码延时时间为100ms,还没有我的(加档位与读取光照值之间的)代码延时时间1s长,为什么书上代码不会出现p[0]和p[1]赋统一光照值的问题,而我的代码会有。
本文总结
不知为何老是结果不准确(代码逻辑百分百没问题,下附),最终,决定使用书上代码。
/*****************************************************************
* 函 数 名 : 返回初始档位函数
* 参 数 : 无
* 返 回 值 : 初始档位
* 调用方法 :chushidangwei();
*****************************************************************/
uint8_t chushidangwei()
{
uint8_t i = 0;
uint16_t p[4] ;
uint8_t j = 0;
uint8_t csdw;
uint16_t csz; //初始值
uint16_t temp; //排序的中间变量
csz = p[0] = Get_Bh_Value(); //读取光照度值并赋值给变量p[i]:p[1]是加一档,p[2]是加两档,p[3]是加三挡
delay_ms(500);delay_ms(500);
for(i=1; i<4; i++)
{
Infrared_Send(Light_plus1,4); //加1档
delay_ms(500); //等光源稳定下来
delay_ms(500); //等光源稳定下来
// delay_ms(500); //等光源稳定下来
p[i] = Get_Bh_Value(); //读取光照度值并赋值给变量p[i]:p[1]保存加一档后的值,p[2]保存加两档,p[3]保存加三挡
delay_ms(500);delay_ms(500);delay_ms(500); //延时1.5秒
}
Infrared_Send(Light_plus1,4); //加1档变为初始档位(for循环里加了三档,需要再加一档变回初始档位)
delay_ms(100); //等光源稳定下来
for(i=0; i<3; i++)
{
for(j=0; j<3-i; j++)
{
if(p[j] > p[j+1]) //从小到大冒泡排序
{
temp = p[j]; p[j] = p[j+1]; p[j+1] = temp;
}
}
}
delay_ms(100);
//从小到大排序好的值一定对应:1档,2档,3档,4档
if(csz == p[0])
{
csdw = 1;
}
else if(csz == p[1])
{
csdw = 2;
}
else if(csz == p[2])
{
csdw = 3;
}
else
{
csdw = 4;
}
return csdw;
}
- 点赞
- 收藏
- 关注作者
评论(0)