找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2001|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

關(guān)于使用單片機(jī)+應(yīng)變片制作電子秤的一個(gè)問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:825593 發(fā)表于 2020-10-4 00:39 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
各位大神好,我這里有一個(gè)使用四個(gè)應(yīng)變片做全電橋來制作一個(gè)電子秤的課題,電橋的輸入是5V的電源,輸出接入一個(gè)24位的AD模塊HX711,然后使用stc8a單片機(jī)來讀取HX711的值,再通過讀取到的值使用公式轉(zhuǎn)化成實(shí)測物品的質(zhì)量。單片機(jī)的程序流程是首先測試200個(gè)數(shù)據(jù)取平均值作為基準(zhǔn)數(shù)據(jù),然后每次取一個(gè)原始數(shù)據(jù)都進(jìn)行一次窗口為100的滑動(dòng)均值濾波,接下來使用濾波后的數(shù)值對(duì)基準(zhǔn)數(shù)據(jù)做差得到的增量作為一個(gè)用來代入公式計(jì)算質(zhì)量的待處理數(shù)據(jù),而這一步的待處理數(shù)據(jù)和實(shí)際質(zhì)量的關(guān)系式原計(jì)劃是使用多次測值進(jìn)行數(shù)據(jù)擬合的方式來得到,可目前遇到了一個(gè)問題是實(shí)測到的這個(gè)待處理數(shù)據(jù)的波動(dòng)范圍非常大,最大值和最小值有兩三千甚至可能更多的差距,因此沒有辦法進(jìn)行選合適的值進(jìn)行擬合,所以想要問一問各位有沒有做過這類的東西的有什么解決辦法嗎?

獲取質(zhì)量相關(guān)的單片機(jī)程序如下(weight.h文件中僅有函數(shù)聲明和窗口長度的宏定義,沒有其他內(nèi)容):
  1. #include <stc8.h>
  2. #include "weight.h"
  3. #include <intrins.h>

  4. //與HX711通信的兩個(gè)端口
  5. sbit SCK=P1^6;
  6. sbit DOUT=P1^7;

  7. //這兩個(gè)變量分別是基準(zhǔn)數(shù)據(jù)和窗口濾波用的數(shù)組
  8. unsigned long zero_point;
  9. unsigned long xdata window[100]={0};

  10. //軟件延時(shí)函數(shù),1us
  11. void Delay1us(int n)                //@24.000MHz
  12. {
  13.         unsigned char i;

  14.         while(n--)
  15.         {
  16.                 _nop_();
  17.                 _nop_();
  18.                 i = 3;
  19.                 while (--i);
  20.         }
  21. }
  22. //讀取HX711輸出的數(shù)據(jù)
  23. unsigned long Read711()
  24. {
  25.         unsigned long dat=0;
  26.         char i;

  27.         DOUT=1;

  28.         SCK=0;         Delay1us(1);
  29.         while(DOUT);
  30.         for(i=0;i<24;i++)
  31.         {
  32.                 SCK=1;
  33.                 Delay1us(1);
  34.                 SCK=0;
  35.                 dat|=DOUT;
  36.                 dat<<=1;   
  37.                 Delay1us(1);
  38.         }
  39.         SCK=1;  //這里多進(jìn)行一次脈沖的目的是選擇hx711的工作模式為128倍增益,通道一
  40.         Delay1us(1);
  41.         SCK=0;

  42.         return dat;
  43. }
  44. //讀200次數(shù)取均值為零點(diǎn),返回零點(diǎn)(基準(zhǔn)數(shù)據(jù))
  45. unsigned long get_zpoint(void)
  46. {
  47.         unsigned long sum=0;
  48.         unsigned long dat;
  49.         unsigned char i;
  50.         
  51.         for(i=0;i<100;i++)
  52.         {
  53.                 dat=Read711();
  54.                 sum+=dat;
  55.         }
  56.         return (sum/200);
  57. }
  58. //零點(diǎn)初始化函數(shù),用于獲得基準(zhǔn)數(shù)值
  59. void zpoint_init()
  60. {
  61.         zero_point=get_zpoint();  
  62. }

  63. //滑動(dòng)濾波函數(shù)
  64. //參數(shù):每次讀取到的原始數(shù)據(jù)
  65. //返回值:濾波后的數(shù)據(jù)
  66. unsigned long sfilter(unsigned long basic_dat)
  67. {
  68.         static unsigned char cnt=0;
  69.         unsigned long sum=0;
  70.         unsigned long res_dat;
  71.         char i;
  72.         
  73.         window[cnt]=basic_dat;
  74.         
  75.         for(i=0;i<WINDOW_LEN;i++)    //WINDOW_LEN是窗口長度,當(dāng)前值是100
  76.         {
  77.                 sum+=window[i];
  78.         }
  79.         
  80.         res_dat=sum/WINDOW_LEN;
  81.         cnt++;
  82.         
  83.         if(cnt==WINDOW_LEN)
  84.                         cnt=0;

  85.         return res_dat;
  86. }
  87. //獲取增量函數(shù)
  88. //說明:濾波后的數(shù)據(jù)與基準(zhǔn)數(shù)據(jù)(零點(diǎn))作差得到增量,隨后通過增量計(jì)算待測物品的質(zhì)量
  89. //參數(shù):待處理數(shù)據(jù),基準(zhǔn)數(shù)據(jù)
  90. //返回值:增量
  91. unsigned long get_increment(unsigned long pd,unsigned long zp)
  92. {
  93.         unsigned long inc;
  94.         
  95.         if(pd<zp) pd=zp;   //當(dāng)前數(shù)據(jù)小于基準(zhǔn)數(shù)據(jù)時(shí)把增量置零,防止出現(xiàn)負(fù)數(shù)
  96.         
  97.         inc=pd-zp;
  98.         
  99.         return inc;
  100. }

  101. /*
  102.         這里應(yīng)有一個(gè)換擋函數(shù),用于選擇分段擬合的比率(如果有這樣的需求)
  103. */

  104. //說明:獲取質(zhì)量
  105. //參數(shù):無
  106. //返回值:當(dāng)前物品質(zhì)量
  107. //ps:目前由于沒有進(jìn)行數(shù)據(jù)擬合因此僅返回濾波后的增量
  108. unsigned long get_weight()
  109. {
  110.         unsigned long zp;
  111.         unsigned long pd;
  112.         unsigned long zm;

  113. /*
  114.         這里要聲明比率
  115. */        
  116.         pd=sfilter(Read711());
  117.         zp=zero_point;
  118.         zm=get_increment(pd,zp);

  119. /*
  120.         這里要計(jì)算實(shí)際質(zhì)量
  121. */        
  122.         return zm;
  123. }
復(fù)制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:128334 發(fā)表于 2021-1-26 22:13 | 只看該作者
真是懶得看這么多  你先用其他稱重儀表或者示波器 看看你的信號(hào)線路有沒有問題
HX711 上16位精度 很輕松的
回復(fù)

使用道具 舉報(bào)

板凳
ID:282850 發(fā)表于 2021-1-26 22:38 | 只看該作者
HX711是24位SD型 AD,實(shí)際上能到15、16位,還算不錯(cuò)了。處理辦法:丟掉幾個(gè)低位,數(shù)值就很穩(wěn)定。
如 :ADV=ADV>>6;
或者除1000000也行
我實(shí)際操作是移位丟的。
回復(fù)

使用道具 舉報(bào)

地板
ID:879809 發(fā)表于 2021-1-26 23:08 | 只看該作者
如果是HX711的原始數(shù)據(jù)波動(dòng)兩三千那太正常了,你自己算々這點(diǎn)數(shù)字對(duì)于HX711的滿量程來說是多么的渺小和微不足道?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表