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

QQ登錄

只需一步,快速開(kāi)始

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

單片機(jī)芯片讀取ADC的值,數(shù)值在抖動(dòng),怎么辦?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1107043 發(fā)表于 2024-3-4 16:38 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
各位大佬。我現(xiàn)在遇到了個(gè)問(wèn)題。我現(xiàn)在使用的是STM32G030單片機(jī)芯片。我需要讀取一個(gè)引腳的ADC數(shù)值。我的期望是他可以比較穩(wěn)定的在一個(gè)數(shù)值,波動(dòng)范圍小一點(diǎn),F(xiàn)在結(jié)果發(fā)現(xiàn)數(shù)波動(dòng)較。目前我使用了過(guò)濾采集的數(shù)值。即連續(xù)讀取10個(gè)數(shù),去2個(gè)最大2個(gè)最小,取剩下的平均值?墒沁是不行。在暫時(shí)不改電路的基礎(chǔ)上(即在采集ADC的線路加電阻電容過(guò)濾.),各位大佬教教我!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1110945 發(fā)表于 2024-3-4 19:33 | 只看該作者
單片機(jī)的adc,都說(shuō)是12位,其實(shí)能保證有效的精度只有8位,
好一點(diǎn)的能有10位有效精度,能到11位或以上精度的單片機(jī)非
常少。本來(lái)就是附加的功能,你的期望值不能太高。
你可以選擇帶16bit-adc功能的單片機(jī)呀,或者外加專門的adc芯
片。
回復(fù)

使用道具 舉報(bào)

板凳
ID:1059013 發(fā)表于 2024-3-4 20:16 | 只看該作者
取樣等待時(shí)間太短的原因吧
回復(fù)

使用道具 舉報(bào)

地板
ID:883242 發(fā)表于 2024-3-4 20:29 | 只看該作者
那就多讀幾個(gè)數(shù),直到滿意為止。
回復(fù)

使用道具 舉報(bào)

5#
ID:401564 發(fā)表于 2024-3-4 21:01 | 只看該作者
ADC引腳有個(gè)104的電容就行了,加太大電容影響"真實(shí)"數(shù)據(jù)
ADC的結(jié)果一定是抖動(dòng)的,像萬(wàn)用表這種也是加了濾波的
在單片機(jī)上,平均值濾波是最常用的,它基本能解決大多數(shù)的應(yīng)用
至少平均130次,然后再去掉最大和最小,數(shù)據(jù)位移一下,相對(duì)會(huì)好很多
10次就太少了
回復(fù)

使用道具 舉報(bào)

6#
ID:453974 發(fā)表于 2024-3-5 09:09 | 只看該作者
增加讀取時(shí)間,看看波動(dòng)大不大,如果大的話考慮來(lái)個(gè)電容濾波
回復(fù)

使用道具 舉報(bào)

7#
ID:41656 發(fā)表于 2024-3-5 11:28 | 只看該作者
沒(méi)有電路不好判斷。1、檢查電源是否穩(wěn)定是否有雜波,用示波器看看,G030的基準(zhǔn)就是電源電源不穩(wěn)定測(cè)量值自然會(huì)跳;2、檢查是否切換通道,切換通道時(shí)候要預(yù)留足夠的采樣時(shí)間;3、檢查前端電路是否穩(wěn)定是否有噪聲源;4、檢查測(cè)量信號(hào)
回復(fù)

使用道具 舉報(bào)

8#
ID:910742 發(fā)表于 2024-3-5 13:37 | 只看該作者
所謂波動(dòng)大不知大到什么程度?g030的adc還是可以的,這是間隔0.1秒轉(zhuǎn)換一次7號(hào)堿性電池的結(jié)果,可以參考下( 64Mhz,adc分頻=2,采樣時(shí)間=1.5,Vref直連Vdd)
1959
1958
1958
1959
1958
1958
1959
1959
1959
1958
1959
1958
1959
1960
1958
1959
1959
1958
1958
1958
1958
1959
1958
回復(fù)

使用道具 舉報(bào)

9#
ID:1107043 發(fā)表于 2024-3-5 14:16 | 只看該作者
Y_G_G 發(fā)表于 2024-3-4 21:01
ADC引腳有個(gè)104的電容就行了,加太大電容影響"真實(shí)"數(shù)據(jù)
ADC的結(jié)果一定是抖動(dòng)的,像萬(wàn)用表這種也是加了濾波 ...

很遺憾,均值濾波這個(gè)方法,我測(cè)試了一下沒(méi)有區(qū)別,還是一樣的波動(dòng)
回復(fù)

使用道具 舉報(bào)

10#
ID:1107043 發(fā)表于 2024-3-5 14:23 | 只看該作者
aidianzi 發(fā)表于 2024-3-5 11:28
沒(méi)有電路不好判斷。1、檢查電源是否穩(wěn)定是否有雜波,用示波器看看,G030的基準(zhǔn)就是電源電源不穩(wěn)定測(cè)量值自 ...

1,電源的話,已經(jīng)使用濾波器測(cè)過(guò)了,很平穩(wěn)。
2,這個(gè)芯片使用一個(gè)ADC,我采用的是連續(xù)轉(zhuǎn)換,當(dāng)一個(gè)通道裝換結(jié)束了,自動(dòng)切換到下一個(gè)通道轉(zhuǎn)換。
3,噪音的話,有一個(gè)風(fēng)扇,不過(guò)確實(shí)有一定的聲音,但是我讀取電源到芯片的卻很穩(wěn)定。
4,目前就是測(cè)量信號(hào)很不穩(wěn)定,
回復(fù)

使用道具 舉報(bào)

11#
ID:1048132 發(fā)表于 2024-3-5 15:40 | 只看該作者
多次采樣然后取平均試試看
回復(fù)

使用道具 舉報(bào)

12#
ID:1112216 發(fā)表于 2024-3-5 15:55 | 只看該作者
增加一級(jí)跟隨器,減少采樣對(duì)電壓的影響
回復(fù)

使用道具 舉報(bào)

13#
ID:401564 發(fā)表于 2024-3-5 16:20 | 只看該作者
c8t6 發(fā)表于 2024-3-5 14:16
很遺憾,均值濾波這個(gè)方法,我測(cè)試了一下沒(méi)有區(qū)別,還是一樣的波動(dòng)



static u32 adc_sum = 0;
u16 adc_avg = 0;
adc_sum +=ADC的數(shù)字量;
adc_avg = adc_sum >> 5;
adc_sum -= adc_avg;
更改右移位數(shù),就等于更改平均了,相對(duì)是比較平穩(wěn)
但這好處也只是相對(duì)的,平均次數(shù)越多,反應(yīng)也是越慢
回復(fù)

使用道具 舉報(bào)

14#
ID:1112237 發(fā)表于 2024-3-5 18:40 | 只看該作者
取多組數(shù)值求平均值
回復(fù)

使用道具 舉報(bào)

15#
ID:230500 發(fā)表于 2024-3-5 20:16 | 只看該作者
RC濾波不能省; 固定的一個(gè)穩(wěn)定值是不可能的, 內(nèi)部也是通過(guò)電容充放電逐次逼近式采集; 多采集幾次,再取平均算法 ,程序上采集速度越慢越穩(wěn)。
回復(fù)

使用道具 舉報(bào)

16#
ID:1059013 發(fā)表于 2024-3-5 20:35 | 只看該作者
模擬電壓本來(lái)就是量子化的,沒(méi)有波動(dòng)才不對(duì)
回復(fù)

使用道具 舉報(bào)

17#
ID:1107043 發(fā)表于 2024-3-6 11:06 | 只看該作者
fishafish 發(fā)表于 2024-3-5 20:35
模擬電壓本來(lái)就是量子化的,沒(méi)有波動(dòng)才不對(duì)

我了解,在理論上是無(wú)限趨向于穩(wěn)定,有波動(dòng)我也可以接受,但是他波動(dòng)在忽高忽低的,而且偏差在+-20mv這我就有點(diǎn)難受了
回復(fù)

使用道具 舉報(bào)

18#
ID:1107043 發(fā)表于 2024-3-6 11:08 | 只看該作者
lidawei1 發(fā)表于 2024-3-5 13:37
所謂波動(dòng)大不知大到什么程度?g030的adc還是可以的,這是間隔0.1秒轉(zhuǎn)換一次7號(hào)堿性電池的結(jié)果,可以參考下 ...

我的波動(dòng)大約是在20mv上下偏移
1562
1542
1572
1564
1555,這些之類的波動(dòng)
回復(fù)

使用道具 舉報(bào)

19#
ID:1107043 發(fā)表于 2024-3-6 11:09 | 只看該作者
eddy123 發(fā)表于 2024-3-5 15:40
多次采樣然后取平均試試看

目前就是這么測(cè)試的,還是有一些峰值的波動(dòng)出現(xiàn),不過(guò)還沒(méi)有在期望之內(nèi)
回復(fù)

使用道具 舉報(bào)

20#
ID:1107043 發(fā)表于 2024-3-6 11:17 | 只看該作者
Y_G_G 發(fā)表于 2024-3-5 16:20
static u32 adc_sum = 0;
u16 adc_avg = 0;
adc_sum +=ADC的數(shù)字量;

有點(diǎn)不太了解這個(gè)原理
回復(fù)

使用道具 舉報(bào)

21#
ID:401564 發(fā)表于 2024-3-6 12:50 | 只看該作者
c8t6 發(fā)表于 2024-3-6 11:17
有點(diǎn)不太了解這個(gè)原理

adc_sum +=ADC的數(shù)字量;//每次運(yùn)算都是把ADC的數(shù)字量累加
adc_avg = adc_sum >> 5;//位移就是除法運(yùn)算了,位移3位就是除以8,得到平均值
adc_sum -= adc_avg;//累加的這個(gè)變量每次都減去平均值,這樣做是不會(huì)溢出,每次運(yùn)算都有前面的數(shù)據(jù)參與
adc_avg 這個(gè)是最終的值
這個(gè)算法比先累加8次,再除以8,然后把累加變量清除,代碼更簡(jiǎn)單,顯示更平

回復(fù)

使用道具 舉報(bào)

22#
ID:910742 發(fā)表于 2024-3-6 13:35 | 只看該作者
c8t6 發(fā)表于 2024-3-6 11:08
我的波動(dòng)大約是在20mv上下偏移
1562
1542

波動(dòng)這么大肯定不能靠濾波的方法解決,可以先檢查一下電路是否有干擾,看看電源有沒(méi)有問(wèn)題,輸入的線盡量短,或者先短路輸入看看波動(dòng)多少。
回復(fù)

使用道具 舉報(bào)

23#
ID:170975 發(fā)表于 2024-3-6 15:23 | 只看該作者
很可能就原始信號(hào)的噪聲吧。
回復(fù)

使用道具 舉報(bào)

24#
ID:1107043 發(fā)表于 2024-3-6 16:44 | 只看該作者
Y_G_G 發(fā)表于 2024-3-6 12:50
adc_sum +=ADC的數(shù)字量;//每次運(yùn)算都是把ADC的數(shù)字量累加
adc_avg = adc_sum >> 5;//位移就是除法運(yùn)算了 ...

不用把他們先排序,然后在去最大最小值,然后除于個(gè)數(shù)么?
回復(fù)

使用道具 舉報(bào)

25#
ID:1107043 發(fā)表于 2024-3-6 16:45 | 只看該作者
Y_G_G 發(fā)表于 2024-3-6 12:50
adc_sum +=ADC的數(shù)字量;//每次運(yùn)算都是把ADC的數(shù)字量累加
adc_avg = adc_sum >> 5;//位移就是除法運(yùn)算了 ...
  1. NUM_SAMPLES = 10;
  2. while (1)
  3.     {
  4.                         
  5.                 uint32_t adc_values1[NUM_SAMPLES]={0};
  6.                 uint32_t adc_values2[NUM_SAMPLES]={0};
  7.                 uint32_t sum1 = 0;
  8.                 uint32_t sum2 = 0;

  9.                 uint32_t ADC_num7 = 0;
  10.                 uint32_t ADC_num0 = 0;
  11.                
  12.                  // 采集十次ADC1和ADC2的值
  13.                 for (int i = 0; i < NUM_SAMPLES; i++)
  14.                 {
  15.                         uint32_t A0;
  16.                         uint32_t A7;

  17.                         // 采集ADC1的值
  18.                         HAL_ADC_Start(&hadc1);
  19.                         while (HAL_ADC_PollForConversion(&hadc1, 100) != HAL_OK);
  20.                         A0 = HAL_ADC_GetValue(&hadc1);    //調(diào)整
  21.                         adc_values1[i] = (A0*3000)/4096;
  22.                         
  23.                         
  24.                         // 采集ADC2的值
  25.                         HAL_ADC_Start(&hadc1);
  26.                         while (HAL_ADC_PollForConversion(&hadc1, 100) != HAL_OK);
  27.                         A7 = HAL_ADC_GetValue(&hadc1);                        //采集
  28.                         adc_values2[i] = (A7*3000)/4096;
  29.                         
  30.                 }
  31.                
  32.                
  33.                
  34.                 bubble_sort(adc_values1,NUM_SAMPLES);
  35.                 bubble_sort(adc_values2,NUM_SAMPLES);
  36.                
  37.                 // 去掉ADC1數(shù)組中的最大值和最小值
  38.                 for (int i = 3; i < NUM_SAMPLES - 4; i++) {
  39.                         sum1 += adc_values1[i];
  40.                 }

  41.                 // 去掉ADC2數(shù)組中的最大值和最小值
  42.                 for (int i = 3; i < NUM_SAMPLES - 4; i++) {
  43.                         sum2 += adc_values2[i];
  44.                 }
  45.                
  46.                 // 計(jì)算打印平均值
  47.                 ADC_num0 = sum1 /4;
  48.                 ADC_num7 = sum2 /4;
  49.                
  50.                
  51.                 printf("\n電位器數(shù)值:%d \r\n",ADC_num0);
  52.                 printf("ADC采集數(shù)值:%d \r\n",ADC_num7);
  53.                 }
復(fù)制代碼
這是我目前的算法
回復(fù)

使用道具 舉報(bào)

26#
ID:910742 發(fā)表于 2024-3-6 18:23 | 只看該作者
c8t6 發(fā)表于 2024-3-6 16:45
這是我目前的算法

真要濾波的話設(shè)置256過(guò)采樣、右移位數(shù)8就行了,直接硬件256個(gè)數(shù)取平均,不需要什么算法。
不過(guò)覺(jué)得應(yīng)該查查是哪里出現(xiàn)的波動(dòng),短路輸入看看。
下面是輸入短路后的情況,沒(méi)有濾波,沒(méi)有過(guò)采樣。
0
1
1
1
2
0
1
1
1
0
0
0
0
0
1
0
0
0
0
0
0
0
1
回復(fù)

使用道具 舉報(bào)

27#
ID:1059013 發(fā)表于 2024-3-6 21:06 | 只看該作者
明顯分壓電阻太大?一般2k不會(huì)
回復(fù)

使用道具 舉報(bào)

28#
ID:401564 發(fā)表于 2024-3-6 23:21 | 只看該作者
c8t6 發(fā)表于 2024-3-6 16:44
不用把他們先排序,然后在去最大最小值,然后除于個(gè)數(shù)么?

電路沒(méi)有很大的干擾,就不需要
我這個(gè)基本只用于電源電壓和溫度之類的ADC,之前也有過(guò)去掉兩頭的數(shù)值,但實(shí)際上沒(méi)啥區(qū)別,為了代碼簡(jiǎn)單,就不用去最大和最小了
回復(fù)

使用道具 舉報(bào)

29#
ID:420836 發(fā)表于 2024-3-7 08:35 | 只看該作者
請(qǐng)先檢查參考電壓,確保電壓源穩(wěn)定且無(wú)噪聲。
回復(fù)

使用道具 舉報(bào)

30#
ID:1007896 發(fā)表于 2024-3-7 09:59 | 只看該作者
ADC來(lái)的數(shù)據(jù)變化太快,你可以用定時(shí)器每隔一段時(shí)間如100ms讀取一次數(shù)據(jù),然后再處理。
回復(fù)

使用道具 舉報(bào)

31#
ID:1074206 發(fā)表于 2024-3-7 10:36 | 只看該作者
增加硬件濾波或者軟件濾波,但是要考慮實(shí)施性
回復(fù)

使用道具 舉報(bào)

32#
ID:1107043 發(fā)表于 2024-3-7 13:56 | 只看該作者
lidawei1 發(fā)表于 2024-3-6 18:23
真要濾波的話設(shè)置256過(guò)采樣、右移位數(shù)8就行了,直接硬件256個(gè)數(shù)取平均,不需要什么算法。
不過(guò)覺(jué)得應(yīng)該 ...

我這個(gè)運(yùn)行步驟是
1;風(fēng)扇啟動(dòng)把高壓離子吹出來(lái)。進(jìn)過(guò)鋼網(wǎng);
2;鋼網(wǎng)采集離子,經(jīng)過(guò)放大電路放大得到電壓;
3;把得到的電壓進(jìn)行ADC轉(zhuǎn)化;
4:通過(guò)ADC判斷是否在范圍,不在范圍則改變PWM;
5:PWM改變高壓的電壓,從而也影響到鋼網(wǎng)采集的離子:
回復(fù)

使用道具 舉報(bào)

33#
ID:1107043 發(fā)表于 2024-3-7 13:58 | 只看該作者
kk17328 發(fā)表于 2024-3-7 10:36
增加硬件濾波或者軟件濾波,但是要考慮實(shí)施性

后續(xù)的升級(jí)是需要的,F(xiàn)在第一版本,只要確保在范圍內(nèi)即可。大約是上下浮動(dòng)10mv左右
回復(fù)

使用道具 舉報(bào)

34#
ID:1107043 發(fā)表于 2024-3-7 13:59 | 只看該作者
Y_G_G 發(fā)表于 2024-3-6 23:21
電路沒(méi)有很大的干擾,就不需要
我這個(gè)基本只用于電源電壓和溫度之類的ADC,之前也有過(guò)去掉兩頭的數(shù)值,但實(shí) ...

我這個(gè)的話,我使用示波器查看查看了曲線,會(huì)有一小段的起伏不定的峰值
回復(fù)

使用道具 舉報(bào)

35#
ID:1107043 發(fā)表于 2024-3-7 14:01 | 只看該作者
yaofuming 發(fā)表于 2024-3-7 09:59
ADC來(lái)的數(shù)據(jù)變化太快,你可以用定時(shí)器每隔一段時(shí)間如100ms讀取一次數(shù)據(jù),然后再處理。

嘗試過(guò)了。我給了固定不變的值;讀取的是比較穩(wěn)定。但是在代碼中去調(diào)節(jié)的話,就會(huì)有波動(dòng)
回復(fù)

使用道具 舉報(bào)

36#
ID:401564 發(fā)表于 2024-3-7 16:57 | 只看該作者
c8t6 發(fā)表于 2024-3-7 13:56
我這個(gè)運(yùn)行步驟是
1;風(fēng)扇啟動(dòng)把高壓離子吹出來(lái)。進(jìn)過(guò)鋼網(wǎng);
2;鋼網(wǎng)采集離子,經(jīng)過(guò)放大電路放大得到電 ...

感覺(jué)這東西就跟采集空氣中的PM2.5一樣,所采集到的數(shù)據(jù)是做不到非常穩(wěn)定的值的,它本身就不是穩(wěn)定的值
你可以嘗試256次平均值看一下效果
回復(fù)

使用道具 舉報(bào)

37#
ID:1107043 發(fā)表于 2024-3-8 08:22 | 只看該作者
Y_G_G 發(fā)表于 2024-3-7 16:57
感覺(jué)這東西就跟采集空氣中的PM2.5一樣,所采集到的數(shù)據(jù)是做不到非常穩(wěn)定的值的,它本身就不是穩(wěn)定的值
你 ...

好的。我嘗試一下
回復(fù)

使用道具 舉報(bào)

38#
ID:361553 發(fā)表于 2024-3-8 10:05 | 只看該作者
加運(yùn)放
回復(fù)

使用道具 舉報(bào)

39#
ID:828160 發(fā)表于 2024-3-8 15:53 | 只看該作者
一分鐘讀一次,就不抖了。
回復(fù)

使用道具 舉報(bào)

40#
ID:883242 發(fā)表于 2024-3-9 00:38 | 只看該作者
c8t6 發(fā)表于 2024-3-7 13:59
我這個(gè)的話,我使用示波器查看查看了擼嵊幸恍《蔚鈉鴟歡ǖ姆逯?/blockquote>

那就是傳感器的問(wèn)題了,別找ADC麻煩了,想想怎么把數(shù)據(jù)編成你想要的結(jié)果好了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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