本帖最后由 smartmcu 于 2013-3-22 22:16 编辑
偶尔翻到一个贴 https://bbs.21ic.com/icview-43053-1-1.html 灰常热闹!
在下从另外一个角度,把这个问题转换成:如何在adc受到强干扰时,有最低的识别错误率。那么可以把问题转换成最大信息熵的问题,即,使各电压分段能够最大地容忍干扰。
(只是在下偶然的一个想法,时间仓促,难说会有根本错误,奢望指正,谢谢啦)
代码如下:
/*用最大信息熵求最优AD 按钮 by smartmcu@gmail.com*/
#include <math.h>
void main()
{
long double max_ent,ent;
long double r1,r2, best_r1, best_r2;
long double v1,v2,v3;
long double p0,p1,p2,p3,p4;
max_ent=0;
for (r1=0.001;r1<10000;) //从1欧姆到10兆
{
for (r2=0.001;r2<=r1;) //从1欧姆到r1,r2应该小于r1
{
v1=1/(r1+1);
v2=1/(r2+1);
v3=1/(1/(1/r1+1/r2)+1);
p0=v1/2; //此是0到V1/2之间的占比,状态0
p1=v1/2+(v2-v1)/2; //此是V1/2到(V2-V1)/2 之间的占比,状态1
p2=(v2-v1)/2+(v3-v2)/2; //此是(V2-V1)/2到(v3-v2)/2 之间的占比,状态2
//p3=(v3-v2);
p3=1-p0-p1-p2; //剩下的算状态3
p4=1;
//p4=1-p0-p1-p2-p3;
ent=-(p0*log(p0)+p1*log(p1)+p2*log(p2)+p3*log(p3)+p4*log(p4)); //各段所占比例可以看作概率,以此求出信息熵
if (max_ent<=ent)
{
max_ent=ent;
best_r1=r1;
best_r2=r2;
printf("The best Ent=%f R1=%f R2=%f\n", max_ent, best_r1, best_r2);
printf("V1=%f V2=%f V3=%f\n", v1,v2,v3);
printf("p0=%f p1=%f p2=%f p3=%f\n\n", p0,p1,p2,p3);
}
r2+=r2*0.005; //按0.5%的比率递增电阻值,应该算得快一些
}
r1+=r1*0.005; //按0.5%的比率递增电阻值,应该算得快一些
}
}
/*
+-----1 |
+ |
+ |
+ |
+------V3 +p3
+ |
+--------------
+ |
+------V2 +p2
+ |
+--------------
+ |
+------V1 + p1
+ |
+--------------
+ |
+ +p0
+ |
+------0 |
下个小巧的watcom c编译一下,运行结果如下:
p3=1-p0-p1-p2 的结果
The best Ent=1.349672 R1=1.574371 R2=0.411563
V1=0.388444 V2=0.708434 V3=0.753994
p0=0.194222 p1=0.354217 p2=0.182775 p3=0.268786
这个结果应该是最优值,在adc受干扰严重时,应该识别错误率最低
p3=(v3-v2); p4=1-p0-p1-p2-p3; 的结果
The best Ent=1.547272 R1=1.127148 R2=0.995015
V1=0.470113 V2=0.501249 V3=0.654243
p0=0.235056 p1=0.250625 p2=0.092065 p3=0.152994
此结果有点离谱,有点疑惑
*/
/*
转述 ljm810010 原帖内容如下:
单片机AD口检测按键S1,S2,要求 单独按下S1/单独按下S2/两者都同按下,三种情况下OUT端得出的电压 两两间的差距最大,那么R1,R2要多大才能达到要求?
很简单的电路,计算却很难,我就不会算了,求教高手们出招,不在乎结果,只在乎过程。
转述完毕。*/
|