论坛风格切换切换到宽版
  • 4324阅读
  • 7回复

请教一个温度转换的程序 [复制链接]

上一主题 下一主题
离线BG4ABM
 
发帖
1139
只看楼主 倒序阅读 0楼 发表于: 2008-03-04
我从一位已辞职的同事手里接手了一个项目,其中有一个ad温度转换的程序,这是其中的3句话:
temp =22.0+(((float) atemp / 409.6-0.56)/0.0019) ;
temp0=(float)0.001*temp+0.999*temp_bak;
temp_bak=temp0;  
atemp是ad转换后的二进制数值,temp_bak的初值是24.0,temp0是最后的温度输出值
现在有2个问题搞不懂:
1)temp0=(float)0.001*temp+0.999*temp_bak;
    temp_bak=temp0;
  上面这2句话据其他同事说是起低通滤波的作用,请问是这样吗?
2)我在软件仿真时,把atemp设置成了一个常数,按我的想法,既然ad输出是一个常 数,那么temp0就也应该是一个常数,但我发现temp0却一直在变化,这样的话输出数值就不能反映实际温度值了,请问这个程序有问题吗?
离线BA5RW
发帖
48263
只看该作者 1楼 发表于: 2008-03-04
经过temp0=(float)0.001*temp+0.999*temp_bak;之后temp0的值变了没有?如果变了,则因为temp_bak=temp0; 引起temp0=(float)0.001*temp+0.999*temp_bak;的值又变了,如此循环反复当然temp0却一直在变化.这个同事这样写肯定有其原因,要了解用在哪儿,怎么用才能知道他要干什么,哈哈,乱发议论……
离线bg4rhe
发帖
756
只看该作者 2楼 发表于: 2008-03-05
是个滤波程序。

这儿是个循环或反复执行程序,第一次执行时之前,应预先temp_bak=temp,或第一次不执行temp0=(float)0.001*temp+0.999*temp_bak;

假如atemp设置成了一个常数,那么temp_bak,temp0,temp三值相等,均不变。
离线BA5RW
发帖
48263
只看该作者 3楼 发表于: 2008-03-05
如果atemp设置成了一个常数,不动temp_bak,temp0,temp,是不是数值就随着起始的随机值一直变呢?
谢谢!
离线bg4rhe
发帖
756
只看该作者 4楼 发表于: 2008-03-05
应该是一直变的。 当循环的次数n相当大时,如果temp_bak的随机初始值大于temp,那么temp_bak,temp0,temp三个值都趋与temp;如果temp_bak的随机初始值等于temp,temp_bak,temp0,temp三个值都等于temp,......
离线BY2HIT-AMO
只看该作者 5楼 发表于: 2008-03-12
先看看你的模拟输入信号有什么样的干扰信号……对症下药。不同的滤波方式有不同的应用场合。
离线BY2HIT-AMO
只看该作者 6楼 发表于: 2008-03-12
白噪声-取平均;
尖峰-排序,去头尾取平均;
正弦-设置合理的采样周期,平均;
……
离线hhee01
只看该作者 7楼 发表于: 2008-03-19
我注册了很久,这才能发帖。

没错这就是一个滤波的函数。temp是每次采样得到的值,但它被缩小了,也就是前面乘上了系数0.001
然后把以前很多次的值作为主要值,也就是乘上了0.999
这其实是一种朴素的分析方式。

按数字信号分析的方式来看这是一个数字滤波器,temp_bak是temp0的前一次值。可以写出它的差分方程,作z变换。这样分析比较系统化。


其实这样作滤波器没有必要,浮点运算那麽多次很浪费资源。可以看出atemp是ad转换过来的一个0到4095的整数值。可以看出ad转换器是12位的。
其实可以仅仅对atemp作滤波就可以了。比如作平均滤波等等,这样运算起来很快的。