为了保证这个项目有头有尾,特说明一下项目暂停的理由。 对于这个电源和负载,其重要部分是对输出的电压和消耗电流采样并进行AD转换。并由这个AD结果对PWM部分的输出进行微调。 LPC1343的AD部分参考电压是取自3.3V供电,没有单独的参考电压引脚,也没有内部的参考电源。当时也心存侥幸:应该也可以得到稳定的AD结果。 可是从后面我做的一系列实验来看:AD结果调的实在太厉害了,10位的AD结果变动的位数应该有4位吧! 当然我也做了一些努力。 一、软件滤波。(借用一下八股文风格) 最初我采用采样64次去掉最大值和最小值再取平均的做法,不过结果还是变动的厉害。 考虑到可能只去掉一个最大值和一个最小值不能完全除去那些不稳定的AD结果,我又对64次结果去除最大的5个数和最小的5个数,再取平均值,函数如下:
//ADC结果滤波计算,先将N个结果都加起来(同时找到最大数和最小数),然后减去最大最小数除以N-2 int adcfilter(int* shujv ,int shucounter) { int jieguo=0,max=0,min=shujv[0]; int i,j; for (i=1;i<shucounter;i++) { j=0; while (j<i) { if (shujv[j]>shujv) { for (jieguo=j;jieguo<i;jieguo++) { max=shujv[jieguo]; shujv[jieguo]=shujv; shujv=max; } j=i; } j++;
} } jieguo=0; if (shucounter<=10) j=0; else j=5; for (i=j;i<shucounter-j;i++) //前后5个都不要 { jieguo +=shujv; } return jieguo; }
结果貌似稳定了一些,跳的慢了一些。不过后来发现这只是运算量大造成的系统反映慢而已,跳动范围还是很大的。 二、对MCU提供3.3V的稳定电压。 考虑到前面做的实验都是在开发板上,LPC1343使用下载器的3.3V电源,这个电压不稳定,偏低,而且受各种干扰源污染,AD结果当然不稳定拉。于是我把OLED的3.3V供电提供给LPC1343。这是由LM1117提供的,可以说电力十分稳定纯净。而且OLED的逻辑电路耗电很小,不会带来很多干扰。 结果还是不理想, AD结果还是跳动。 三、还有一种可能就是电压本身不稳定,这个不能怪LPC1343。 我用万用表量了输出电压,万用表的读数基本不动。 四、可能设计开发板时对AD通道没有做专门的考虑,也会导致AD结果不稳定。 这个只有专门做板了。
目前我用古老的MEGA8继续这个工作,结果十分顺利: MEGA8同样有10位的AD转换,有单独的参考电压引脚。不过我用了他内部的2.56V参考电压,AD结果很稳定,只有最低1位偶有跳动。 本来早就想公布结果,考虑到大家对这个不是很感冒,所以就偷了一下懒。最近看到11楼对我的结果很不满意,想一想以前或者以后不满意的人可能会很多,今天就仔细说一说。
[ 本帖最后由 zhdphao 于 2010-7-17 08:22 编辑 ] |