路灯标志物的讲解

举报
holo.yh 发表于 2021/10/30 23:33:21 2021/10/30
【摘要】 路灯代码测试过程公式:第十三、十四届比赛的公式实验距离设置实参固定为330初始档位1234目标档位(由公式运算得出)2141相差档位1311调试编译初始档位1133最终档位2244相差档位1111结果正确?√×√实际最终档位第一次实验212(手动按至初始档位:3挡)1第二次实验4(由初始档位:4档执行程序到1档,再按下小车按钮,结果为4)141第三次实验4121第四次实验4141第五次实验2...

路灯代码测试过程

公式:第十三、十四届比赛的公式

实验



距离




设置实参固定为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;
}


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。