大学做过的项目遇到的问题及解决方案总结

大学做过的项目遇到的问题及解决方案总结

项目一:远洋船务有限公司外包项目——转速计

  1. 功能: 数码管显示实时转速V,一个io输出一个和转速有数学关系(公式已知)频率的脉冲信号。

  2. 要求: 1、开机自检,数码管和led闪烁,10s后正常工作。2、显示速度时不显示的数码管默认为黑,速度上来以后才发亮显示。3、需要改变参数时,顺序按按键1,显示不同参数值,长按按键4修改,led和数码管闪烁,按键短按加减1,长按快加减,长按4保存。4、报警功能,对于继电器1当速度大于高阈值时动作,小于低阈值时延后D秒,继电器1不动作。其他继电器只有一个阈值,大于就动作,小于不动作。

  3. 遇见的问题: 一开始对方说仿真实现这些功能,我用proteus仿真实现后,对方要做实物,proteus仿真到stm32实物实现代码不一定完全能用,尤其涉及到延时定时器中断这些。在仿真完后,将程序烧录到实物上存在定时器不能用的问题。输出和转速有数学关系(公式已知)频率的IO口,只在转速到达一定时,频率才会变,并不能实时跟随转速变,有些转速值根本显示不到。实现要求4时,一时不知道怎么实现。

  4. 最终解决办法: 当告知仿真用的代码实物不适用,我先在自己stm32上写了个简单包含定时器中断的程序,然后放在proteus仿真软件里面,果然中断里面led闪烁的频率跟我设定的参数要达到的要求不一致。经过百度,仿真stm32时,时钟确实存在不准的问题,原因是proteus软件的问题,proteus仿真51单片机可以,仿真stm32程序中用到的定时器较多时时钟计算不准确。于是我索性,自己再写一份适用于实物的代码,早知道对方要求做实物就直接在实物上调试了,于是,我在我自己单片机上重新写了定时器(按自己以前写定时器的思路),问好对方多少ms执行什么程序将参数大改。输出频率不能跟随输入实时变的问题是自己代码程序里面输出频率时只修改了计数阈值这一项参数,根据已知的数学公式,没有考虑转速的范围,导致经过数学公式得到的计数阈值这个参数达不到,于是,我根据转速的范围,同时修改定时器的基数阈值和分频系数两个参数,并在数码管显示转速时,用类似二分法原理在转速变化较大时,数码管显示是逐渐逼近目标值的一个过程,而不是来回跳,让用户看着更加舒服。最终实现要求4时,我想到了数电中施密特触发器,这个过程和施密特触发器类似,于是定义了两个参数来标志当前状态是从低到高,还是从高到低。

  5. 总结: 仿真能行不代表实物没问题,如果最终要做实物,如果没有啥危险和成本的话直接在实物上做。在程序调试时用到debug能很快定位到那里出现问题了。

项目二:角磨机牵引绳拉力检测滑车——山西电网项目

  1. 功能: 实时显示钢丝绳张力和高空风速值并将两值实时显示到工作人员手中

  2. 要求: 1、钢丝绳张力和风速超过阈值报警。2、测量得到的钢丝绳张力误差小于2%。3、通信距离大于2km。4、实时上传至云平台并实时显示(可选)。

  3. 遇见的问题: 钢丝绳张力值和风速值都是通过传感器获得,只要用stm32的DAC功能采集传感器电压值然后根据传感器的压力和输出电压关系转换为压力值即可。但压力传感器输出的电压值是0~5v,在采集之前我先用电阻分压让单片机采集的是一个0-3.3v的电压值,但同样的压力,不同单片机采集到的值不一样,并且得到压力后经过三轮滑机械结构得到的钢丝绳张力值受机械结构精度影响较大。

  4. 最终解决办法: 对于DAC电压采集,我网上搜集了别人做的5v转3.3v降压电路,但还是存在不同单片机采集到的值不一样的问题,后来问模电老师,老师说如果精度要求不很高的话直接两个电阻分压就行,我说是要用单片机DAC采集,老师说采集之前最好加个跟随器,因为分压电阻和单片机里面的电阻并联,分压公式就不对了,我恍然大悟,最终在采集之前加了个电压跟随器,果然同样的压力不同单片机采集的也是一样的。对于得到的张力值受机械结构影响较大的问题,我根据平常在调试stm32程序时得到的经验(有时候不想debug,就printf打印变量值,在程序循环等地方加入printf打印字符来看程序跑到那里了)建议老师先做实验然后记录钢丝绳张力值和stm32DAC采集到的电压值,多记录几组然后拟合一条电压值和钢丝绳张力值的曲线,最后在单片机程序中以数组的形式,列出来电压值及其对应的张力值,最后遍历数组中的电压值,看与那个电压值相近就显示对应的张力值。

  5. 总结: 对于没做过的功能先百度尤其是CSDN上找,学学别人的方案,看懂并修改用在自己的项目上尝试。不懂的问题也要记得询问专业课老师,他们知道最基础的原理,也有项目经验。

项目三:智能物流搬运机器人——全国大学生工程综合能力训练大赛(山西省一等奖)

  1. 功能: 识别二维码、分辨物块颜色得到摆放顺序,根据二维码值和物块摆放顺序将上下两层一共6个物块搬运到指定位置,最后返回。
  2. 要求: 1、程序全自动运行得满分,遥控运行在原来得分基础上*50%。2、一次性装卸3个物块(国赛要求)。3、不能使用补光灯(国赛要求)。
  3. 遇见的问题: 我是主要负责视觉这一块,和负责物流车程序的队友通过串口通信。我写openmv程序时,识别物块颜色时受环境灯光影响较大,有时候识别不到,或将识别错误的顺序就发送给主控单片机了或者发送好几次顺序,导致物流车行走轨迹异常,和队友找不到问题(都觉得自己程序没问题)。
  4. 最终解决办法: 对于openmv识别物块颜色问题,我们百度一搜,果然大部分人都会遇见同样的问题。所以我研究了openmv识别颜色的原理,openmv识别物块颜色会提前有个颜色阈值,根据这个阈值找摄像头中和阈值表示的一样的像素域,受环境光影响较大因为,环境光强物体就亮,光弱物体就暗,有时候会和设定的颜色阈值差别较大从而识别不到。如果环境光强不变就会很容易识别到,于是在物流车基础上加了光强传感器和补光灯,记录最快识别到物块颜色时的光强值,在程序中检测到的光强如果小于这个值就增加补光灯的亮度,如果大于这个值就减弱补光灯的亮度,别的队伍都是比赛前根据当时环境,现场调试识别的物块颜色阈值,我们这个方案节省了很多时间去调试别的功能。和队友配合的问题,因为我俩都觉得自己程序是没问题的,找不到解决办法,但还是两个人都看代码找,因为我俩是通过串口通信的,因此借助串口助手模拟了小车行进过程,终于发现问题了,通过串口屏看到我识别的是没问题的,但是我发送了两次二维码值给队友的主控单片机,导致第二次发送,队友那边以为是物块颜色值,从而物流车行走轨迹异常。
  5. 总结: 和队友配合通信时一定先确定好发送数据协议,发送几次,对于发送放程序里先检车数据有没有问题,没有问题再发送出去,对于串口通信,可借助串口助手软件来调试发送方和接收方的程序。

你可能感兴趣的:(STM32F407,单片机,stm32,嵌入式硬件)