数码之家

 找回密码
 立即注册
搜索
查看: 5549|回复: 17

再次求助:热电偶采样问题

[复制链接]
发表于 2021-9-30 10:11:50 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
上次求助把显示程序搞定了,但是又出现新问题,单片机无法直接采样K型热电偶的输出信号,试用LM358搭了个放大电路失败,后来从拼多多上买了个放大模块,终于可以用单片机采样了,但是发现采样结果每次都不一样,数码管显示的数字跳的很快看不清,后改为每秒采样一次,数字可以看清了,但是还是不稳定。给热电偶上并了个温控器,可以看到温控器的显示很稳定,温度变化显示也很及时,而我用单片机采样的那个显示就不及时。请教大家应该怎么解决这个问题?
发表于 2021-9-30 10:28:59 | 显示全部楼层
感觉还得在信号放大器这方面找原因,最好是用示波器配合一下否则挺不好弄的。
回复 支持 反对

使用道具 举报

发表于 2021-9-30 10:34:17 来自手机浏览器 | 显示全部楼层
每秒采集10次,去掉一两个最高最低值,再取平均值。
回复 支持 反对

使用道具 举报

发表于 2021-9-30 10:37:49 | 显示全部楼层
  1. 假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad();  

  2. 1、限副滤波

  3. /* A值可根据实际情况调整

  4. value为有效值,new_value为当前采样值

  5. 滤波程序返回有效的实际值 */



  6. #define A 10

  7. char value;

  8. char filter()

  9. {

  10.         char new_value;

  11.         new_value = get_ad();

  12.         if ( ( new_value - value > A ) || ( value - new_value > A )

  13.         return value;

  14.         return new_value;



  15. }



  16. 2、中位值滤波法

  17. /* N值可根据实际情况调整

  18. 排序采用冒泡法*/



  19. #define N 11

  20. char filter()

  21. {

  22.         char value_buf[N];

  23.         char count,i,j,temp;

  24.         for ( count=0;count<N;count++)

  25.         {

  26.                 value_buf[count] = get_ad();

  27.                 delay();

  28.         }

  29.         for (j=0;j<N-1;j++)

  30.         {

  31.                 for (i=0;i<N-j;i++)

  32.                 {

  33.                         if ( value_buf>value_buf[i+1] )

  34.                         {

  35.                                 temp = value_buf;

  36.                                 value_buf = value_buf[i+1];

  37.                                 value_buf[i+1] = temp;

  38.                         }

  39.                 }

  40.         }

  41. return value_buf[(N-1)/2];

  42. }



  43. 3、算术平均滤波法

  44. /*

  45. */



  46. #define N 12

  47. char filter()

  48. {

  49.         int sum = 0;

  50.         for ( count=0;count<N;count++)

  51.         {

  52.                 sum + = get_ad();

  53.                 delay();

  54.         }

  55.         return (char)(sum/N);

  56. }



  57. 4、递推平均滤波法(又称滑动平均滤波法)

  58. /*

  59. */



  60. #define N 12

  61. char value_buf[N];

  62. char i=0;

  63. char filter()

  64. {

  65.         char count;

  66.         int sum=0;

  67.         value_buf[i++] = get_ad();

  68.         if ( i == N ) i = 0;

  69.         for ( count=0;count<N,count++)

  70.         sum = value_buf[count];

  71.         return (char)(sum/N);

  72. }



  73. 5、中位值平均滤波法(又称防脉冲干扰平均滤波法)

  74. /*

  75. */



  76. #define N 12

  77. char filter()

  78. {

  79.         char count,i,j;

  80.         char value_buf[N];

  81.         int sum=0;

  82.         for (count=0;count<N;count++)

  83.         {

  84.                 value_buf[count] = get_ad();

  85.                 delay();

  86.         }

  87.         for (j=0;j<N-1;j++)

  88.         {

  89.                 for (i=0;i<N-j;i++)

  90.                 {

  91.                         if ( value_buf>value_buf[i+1] )

  92.                         {

  93.                                 temp = value_buf;

  94.                                 value_buf = value_buf[i+1];

  95.                                 value_buf[i+1] = temp;

  96.                         }

  97.                 }

  98.         }

  99.         for(count=1;count<N-1;count++)

  100.         sum += value[count];

  101.         return (char)(sum/(N-2));

  102. }



  103. 6、限幅平均滤波法

  104. /*

  105. */

  106. 略 参考子程序1、3





  107. 7、一阶滞后滤波法

  108. /* 为加快程序处理速度假定基数为100,a=0~100 */



  109. #define a 50

  110. char value;

  111. char filter()

  112. {

  113.         char new_value;

  114.         new_value = get_ad();

  115.         return (100-a)*value + a*new_value;

  116. }





  117. 8、加权递推平均滤波法

  118. /* coe数组为加权系数表,存在程序存储区。*/



  119. #define N 12

  120. char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12};

  121. char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;

  122. char filter()

  123. {

  124.         char count;

  125.         char value_buf[N];

  126.         int sum=0;

  127.         for (count=0,count<N;count++)

  128.         {

  129.                 value_buf[count] = get_ad();

  130.                 delay();

  131.         }

  132.         for (count=0,count<N;count++)

  133.         sum += value_buf[count]*coe[count];

  134.         return (char)(sum/sum_coe);

  135. }





  136. 9、消抖滤波法



  137. #define N 12

  138. char filter()

  139. {

  140.         char count=0;

  141.         char new_value;

  142.         new_value = get_ad();

  143.         while (value !=new_value);

  144.         {

  145.                 count++;

  146.                 if (count>=N) return new_value;

  147.                 delay();

  148.                 new_value = get_ad();

  149.         }

  150.         return value;

  151. }



  152. 10、限幅消抖滤波法

  153. /*

  154. */

  155. 略 参考子程序1、9
复制代码


回复 支持 反对

使用道具 举报

发表于 2021-9-30 10:48:52 | 显示全部楼层
信号放大之前还需要滤波的
回复 支持 反对

使用道具 举报

发表于 2021-9-30 10:53:46 | 显示全部楼层
加电容呗,这么长难免会引入干扰杂波信号!!
或者给放大器用正负电源!!!
回复 支持 反对

使用道具 举报

发表于 2021-9-30 11:45:51 | 显示全部楼层
应该放大倍数过高是震荡了
回复 支持 反对

使用道具 举报

发表于 2021-9-30 15:26:33 | 显示全部楼层
358肯定不行,本身的漂移过大了。
回复 支持 反对

使用道具 举报

发表于 2021-9-30 20:57:47 | 显示全部楼层
LM358这样的垃圾运算放大器用于热电偶的弱信号肯定不行,
你用屁多多买的那个放大模块是什么电路的?估计也是山寨OP07, 如果是正品的OP07那肯定没问题。
回复 支持 反对

使用道具 举报

发表于 2021-9-30 22:43:18 来自手机浏览器 | 显示全部楼层
我记得你是单片机直驱数码管的,可能是单片机的电源被数码管拉低了,你可以试着在数码管灭的时候读温度电压,再给单片机加隔离二极管,加大退耦电容。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-30 22:51:38 | 显示全部楼层
广东梁百万 发表于 2021-9-30 20:57
LM358这样的垃圾运算放大器用于热电偶的弱信号肯定不行,
你用屁多多买的那个放大模块是什么电路的?估计也 ...

用的芯片是AD620,刚开始实在搞不定,后来在输入输出端加了101电容后可以放大了。但是温度对不住,在40°时调整放大倍数和零点使得温控器和单片机显示一致了,到实际70度的时候显示成了100多度,得慢慢调整放大倍数和零点看看能不能调到最佳
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-30 22:54:07 | 显示全部楼层
zj97czb 发表于 2021-9-30 22:43
我记得你是单片机直驱数码管的,可能是单片机的电源被数码管拉低了,你可以试着在数码管灭的时候读温度电压 ...

这个还没有考虑到,我是用烧写器连电脑同时给放大器和单片机供电的,电压为4.8V,万用表量不出波动
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-12 15:44:10 | 显示全部楼层

先谢谢您的指导。  if ( ( new_value - value > A ) || ( value - new_value > A )

        return value;

        return new_value;
这3句有点不懂。我先去百度一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-12 15:54:10 | 显示全部楼层
iritwq 发表于 2021-10-12 15:44
先谢谢您的指导。  if ( ( new_value - value > A ) || ( value - new_value > A )

        return valu ...

看了几个解释,还是没有完全弄懂。根据我的理解,我改成了这样
if  ( ( new_value - value > 10) || ( value - new_value > 10 ))
        {
                value= new_value ;
        }
但是最后一个字依然闪来闪去
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-12 16:04:08 | 显示全部楼层
iritwq 发表于 2021-10-12 15:54
看了几个解释,还是没有完全弄懂。根据我的理解,我改成了这样
if  ( ( new_value - value > 10) || ( va ...

改成这样
if ( abs( value - new_value ) > 5 )
        {
                value = new_value ;
        }
就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-12 16:28:15 | 显示全部楼层
zj97czb 发表于 2021-9-30 22:43
我记得你是单片机直驱数码管的,可能是单片机的电源被数码管拉低了,你可以试着在数码管灭的时候读温度电压 ...

现在用的电位器模拟信号,等程序差不多了试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-12 16:29:41 | 显示全部楼层
广东梁百万 发表于 2021-9-30 20:57
LM358这样的垃圾运算放大器用于热电偶的弱信号肯定不行,
你用屁多多买的那个放大模块是什么电路的?估计也 ...

AD620,卖家说可以放大直流信号
回复 支持 反对

使用道具 举报

发表于 2021-12-15 12:09:09 | 显示全部楼层
来学习一下。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-25 19:00 , Processed in 0.171601 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表