入行已经三年多了,已经在Cypress开发过一套比较完整的电机控制代码了,结果昨天除了些奇怪的问题,花了点时间找到原因,结果是一些比较低级的错误,先记录下来:
1. 在main()函数开始的时候记得加入上电延时
芯片是使用的stm32F103,当时第一次使用M3核的单片机,因此看了很多例程,在例程上删减后,不断的增加新的功能,到如今的规模。产品已经开始准备小批量量产了,但是在量产的前一天下班前,突然发现一个很异常的现象。单片机AD到的初始电压值严重偏离正常值,**一闪,想起来上电后没有加延时就进行了配置和电压采样,这样不出问题才怪呢。这样的常识估计大家都知道。可是每当大家使用新的芯片时一般都是从例程上开始的,尤其容易忘了这一点。
上电延时为200ms左右,如果需要采集初始电压,最好设置到1s以上。这样误差比较小一下。
2. 一些自己计算的数值最好放到预处理#define中去
在注释中可以写上当时计算的公式。当然最好的办法是让编译器自己去计算出值。好处很多:1.如果过比较长的一段时间后需要修改,只要看一下公式,就很容易改动了。不需要苦思冥想当时是如何想的;2.改动方便,并且如果公式中别的因素变了的话,这个计算值也会跟着改变,不怕遗漏 ;3. 减少自己计算过程中的错误
3. #define预处理中的计算
大家都知道,在单片机中最好先算乘法然后再算除法。对于编译器的预处理也是如此。这样可以显著的减少误差。另外如果要做两次除法,比如X*Y/Z/A,那么最好改成X*Y/(Z*A)。后者基本上接近真实值,前者因为有两次除法,因此有比较大的误差。
|