久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4704|回復: 44
收起左側

單片機芯片讀取ADC的值,數值在抖動,怎么辦?

  [復制鏈接]
ID:1107043 發表于 2024-3-4 16:38 | 顯示全部樓層 |閱讀模式
各位大佬。我現在遇到了個問題。我現在使用的是STM32G030單片機芯片。我需要讀取一個引腳的ADC數值。我的期望是他可以比較穩定的在一個數值,波動范圍小一點。現在結果發現數波動較。目前我使用了過濾采集的數值。即連續讀取10個數,去2個最大2個最小,取剩下的平均值。可是還是不行。在暫時不改電路的基礎上(即在采集ADC的線路加電阻電容過濾.),各位大佬教教我!
回復

使用道具 舉報

ID:1110945 發表于 2024-3-4 19:33 | 顯示全部樓層
單片機的adc,都說是12位,其實能保證有效的精度只有8位,
好一點的能有10位有效精度,能到11位或以上精度的單片機非
常少。本來就是附加的功能,你的期望值不能太高。
你可以選擇帶16bit-adc功能的單片機呀,或者外加專門的adc芯
片。
回復

使用道具 舉報

ID:1059013 發表于 2024-3-4 20:16 | 顯示全部樓層
取樣等待時間太短的原因吧
回復

使用道具 舉報

ID:883242 發表于 2024-3-4 20:29 | 顯示全部樓層
那就多讀幾個數,直到滿意為止。
回復

使用道具 舉報

ID:401564 發表于 2024-3-4 21:01 | 顯示全部樓層
ADC引腳有個104的電容就行了,加太大電容影響"真實"數據
ADC的結果一定是抖動的,像萬用表這種也是加了濾波的
在單片機上,平均值濾波是最常用的,它基本能解決大多數的應用
至少平均130次,然后再去掉最大和最小,數據位移一下,相對會好很多
10次就太少了
回復

使用道具 舉報

ID:453974 發表于 2024-3-5 09:09 | 顯示全部樓層
增加讀取時間,看看波動大不大,如果大的話考慮來個電容濾波
回復

使用道具 舉報

ID:41656 發表于 2024-3-5 11:28 | 顯示全部樓層
沒有電路不好判斷。1、檢查電源是否穩定是否有雜波,用示波器看看,G030的基準就是電源電源不穩定測量值自然會跳;2、檢查是否切換通道,切換通道時候要預留足夠的采樣時間;3、檢查前端電路是否穩定是否有噪聲源;4、檢查測量信號
回復

使用道具 舉報

ID:910742 發表于 2024-3-5 13:37 | 顯示全部樓層
所謂波動大不知大到什么程度?g030的adc還是可以的,這是間隔0.1秒轉換一次7號堿性電池的結果,可以參考下( 64Mhz,adc分頻=2,采樣時間=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
回復

使用道具 舉報

ID:1107043 發表于 2024-3-5 14:16 | 顯示全部樓層
Y_G_G 發表于 2024-3-4 21:01
ADC引腳有個104的電容就行了,加太大電容影響"真實"數據
ADC的結果一定是抖動的,像萬用表這種也是加了濾波 ...

很遺憾,均值濾波這個方法,我測試了一下沒有區別,還是一樣的波動
回復

使用道具 舉報

ID:1107043 發表于 2024-3-5 14:23 | 顯示全部樓層
aidianzi 發表于 2024-3-5 11:28
沒有電路不好判斷。1、檢查電源是否穩定是否有雜波,用示波器看看,G030的基準就是電源電源不穩定測量值自 ...

1,電源的話,已經使用濾波器測過了,很平穩。
2,這個芯片使用一個ADC,我采用的是連續轉換,當一個通道裝換結束了,自動切換到下一個通道轉換。
3,噪音的話,有一個風扇,不過確實有一定的聲音,但是我讀取電源到芯片的卻很穩定。
4,目前就是測量信號很不穩定,
回復

使用道具 舉報

ID:1048132 發表于 2024-3-5 15:40 | 顯示全部樓層
多次采樣然后取平均試試看
回復

使用道具 舉報

ID:1112216 發表于 2024-3-5 15:55 | 顯示全部樓層
增加一級跟隨器,減少采樣對電壓的影響
回復

使用道具 舉報

ID:401564 發表于 2024-3-5 16:20 | 顯示全部樓層
c8t6 發表于 2024-3-5 14:16
很遺憾,均值濾波這個方法,我測試了一下沒有區別,還是一樣的波動



static u32 adc_sum = 0;
u16 adc_avg = 0;
adc_sum +=ADC的數字量;
adc_avg = adc_sum >> 5;
adc_sum -= adc_avg;
更改右移位數,就等于更改平均了,相對是比較平穩
但這好處也只是相對的,平均次數越多,反應也是越慢
回復

使用道具 舉報

ID:1112237 發表于 2024-3-5 18:40 | 顯示全部樓層
取多組數值求平均值
回復

使用道具 舉報

ID:230500 發表于 2024-3-5 20:16 | 顯示全部樓層
RC濾波不能省; 固定的一個穩定值是不可能的, 內部也是通過電容充放電逐次逼近式采集; 多采集幾次,再取平均算法 ,程序上采集速度越慢越穩。
回復

使用道具 舉報

ID:1059013 發表于 2024-3-5 20:35 | 顯示全部樓層
模擬電壓本來就是量子化的,沒有波動才不對
回復

使用道具 舉報

ID:1107043 發表于 2024-3-6 11:06 | 顯示全部樓層
fishafish 發表于 2024-3-5 20:35
模擬電壓本來就是量子化的,沒有波動才不對

我了解,在理論上是無限趨向于穩定,有波動我也可以接受,但是他波動在忽高忽低的,而且偏差在+-20mv這我就有點難受了
回復

使用道具 舉報

ID:1107043 發表于 2024-3-6 11:08 | 顯示全部樓層
lidawei1 發表于 2024-3-5 13:37
所謂波動大不知大到什么程度?g030的adc還是可以的,這是間隔0.1秒轉換一次7號堿性電池的結果,可以參考下 ...

我的波動大約是在20mv上下偏移
1562
1542
1572
1564
1555,這些之類的波動
回復

使用道具 舉報

ID:1107043 發表于 2024-3-6 11:09 | 顯示全部樓層
eddy123 發表于 2024-3-5 15:40
多次采樣然后取平均試試看

目前就是這么測試的,還是有一些峰值的波動出現,不過還沒有在期望之內
回復

使用道具 舉報

ID:1107043 發表于 2024-3-6 11:17 | 顯示全部樓層
Y_G_G 發表于 2024-3-5 16:20
static u32 adc_sum = 0;
u16 adc_avg = 0;
adc_sum +=ADC的數字量;

有點不太了解這個原理
回復

使用道具 舉報

ID:401564 發表于 2024-3-6 12:50 | 顯示全部樓層
c8t6 發表于 2024-3-6 11:17
有點不太了解這個原理

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

回復

使用道具 舉報

ID:910742 發表于 2024-3-6 13:35 | 顯示全部樓層
c8t6 發表于 2024-3-6 11:08
我的波動大約是在20mv上下偏移
1562
1542

波動這么大肯定不能靠濾波的方法解決,可以先檢查一下電路是否有干擾,看看電源有沒有問題,輸入的線盡量短,或者先短路輸入看看波動多少。
回復

使用道具 舉報

ID:170975 發表于 2024-3-6 15:23 | 顯示全部樓層
很可能就原始信號的噪聲吧。
回復

使用道具 舉報

ID:1107043 發表于 2024-3-6 16:44 | 顯示全部樓層
Y_G_G 發表于 2024-3-6 12:50
adc_sum +=ADC的數字量;//每次運算都是把ADC的數字量累加
adc_avg = adc_sum >> 5;//位移就是除法運算了 ...

不用把他們先排序,然后在去最大最小值,然后除于個數么?
回復

使用道具 舉報

ID:1107043 發表于 2024-3-6 16:45 | 顯示全部樓層
Y_G_G 發表于 2024-3-6 12:50
adc_sum +=ADC的數字量;//每次運算都是把ADC的數字量累加
adc_avg = adc_sum >> 5;//位移就是除法運算了 ...
  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);    //調整
  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數組中的最大值和最小值
  38.                 for (int i = 3; i < NUM_SAMPLES - 4; i++) {
  39.                         sum1 += adc_values1[i];
  40.                 }

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

使用道具 舉報

ID:910742 發表于 2024-3-6 18:23 | 顯示全部樓層
c8t6 發表于 2024-3-6 16:45
這是我目前的算法

真要濾波的話設置256過采樣、右移位數8就行了,直接硬件256個數取平均,不需要什么算法。
不過覺得應該查查是哪里出現的波動,短路輸入看看。
下面是輸入短路后的情況,沒有濾波,沒有過采樣。
0
1
1
1
2
0
1
1
1
0
0
0
0
0
1
0
0
0
0
0
0
0
1
回復

使用道具 舉報

ID:1059013 發表于 2024-3-6 21:06 | 顯示全部樓層
明顯分壓電阻太大?一般2k不會
回復

使用道具 舉報

ID:401564 發表于 2024-3-6 23:21 | 顯示全部樓層
c8t6 發表于 2024-3-6 16:44
不用把他們先排序,然后在去最大最小值,然后除于個數么?

電路沒有很大的干擾,就不需要
我這個基本只用于電源電壓和溫度之類的ADC,之前也有過去掉兩頭的數值,但實際上沒啥區別,為了代碼簡單,就不用去最大和最小了
回復

使用道具 舉報

ID:420836 發表于 2024-3-7 08:35 | 顯示全部樓層
請先檢查參考電壓,確保電壓源穩定且無噪聲。
回復

使用道具 舉報

ID:1007896 發表于 2024-3-7 09:59 | 顯示全部樓層
ADC來的數據變化太快,你可以用定時器每隔一段時間如100ms讀取一次數據,然后再處理。
回復

使用道具 舉報

ID:1074206 發表于 2024-3-7 10:36 | 顯示全部樓層
增加硬件濾波或者軟件濾波,但是要考慮實施性
回復

使用道具 舉報

ID:1107043 發表于 2024-3-7 13:56 | 顯示全部樓層
lidawei1 發表于 2024-3-6 18:23
真要濾波的話設置256過采樣、右移位數8就行了,直接硬件256個數取平均,不需要什么算法。
不過覺得應該 ...

我這個運行步驟是
1;風扇啟動把高壓離子吹出來。進過鋼網;
2;鋼網采集離子,經過放大電路放大得到電壓;
3;把得到的電壓進行ADC轉化;
4:通過ADC判斷是否在范圍,不在范圍則改變PWM;
5:PWM改變高壓的電壓,從而也影響到鋼網采集的離子:
回復

使用道具 舉報

ID:1107043 發表于 2024-3-7 13:58 | 顯示全部樓層
kk17328 發表于 2024-3-7 10:36
增加硬件濾波或者軟件濾波,但是要考慮實施性

后續的升級是需要的。現在第一版本,只要確保在范圍內即可。大約是上下浮動10mv左右
回復

使用道具 舉報

ID:1107043 發表于 2024-3-7 13:59 | 顯示全部樓層
Y_G_G 發表于 2024-3-6 23:21
電路沒有很大的干擾,就不需要
我這個基本只用于電源電壓和溫度之類的ADC,之前也有過去掉兩頭的數值,但實 ...

我這個的話,我使用示波器查看查看了曲線,會有一小段的起伏不定的峰值
回復

使用道具 舉報

ID:1107043 發表于 2024-3-7 14:01 | 顯示全部樓層
yaofuming 發表于 2024-3-7 09:59
ADC來的數據變化太快,你可以用定時器每隔一段時間如100ms讀取一次數據,然后再處理。

嘗試過了。我給了固定不變的值;讀取的是比較穩定。但是在代碼中去調節的話,就會有波動
回復

使用道具 舉報

ID:401564 發表于 2024-3-7 16:57 | 顯示全部樓層
c8t6 發表于 2024-3-7 13:56
我這個運行步驟是
1;風扇啟動把高壓離子吹出來。進過鋼網;
2;鋼網采集離子,經過放大電路放大得到電 ...

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

使用道具 舉報

ID:1107043 發表于 2024-3-8 08:22 | 顯示全部樓層
Y_G_G 發表于 2024-3-7 16:57
感覺這東西就跟采集空氣中的PM2.5一樣,所采集到的數據是做不到非常穩定的值的,它本身就不是穩定的值
你 ...

好的。我嘗試一下
回復

使用道具 舉報

ID:361553 發表于 2024-3-8 10:05 | 顯示全部樓層
加運放
回復

使用道具 舉報

ID:828160 發表于 2024-3-8 15:53 | 顯示全部樓層
一分鐘讀一次,就不抖了。
回復

使用道具 舉報

ID:883242 發表于 2024-3-9 00:38 | 顯示全部樓層
c8t6 發表于 2024-3-7 13:59
我這個的話,我使用示波器查看查看了擼嵊幸恍《蔚鈉鴟歡ǖ姆逯?/blockquote>

那就是傳感器的問題了,別找ADC麻煩了,想想怎么把數據編成你想要的結果好了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜av成人 | 国产在线观看一区二区三区 | 久久国产精品视频 | 亚洲精品一二区 | 久久天堂| 波波电影院一区二区三区 | 久久久久国产一区二区三区四区 | 欧美日韩综合视频 | 精品国产一区二区三区久久久久久 | 亚洲 欧美 日韩在线 | av先锋资源 | 伊人一二三 | 亚洲一区二区三区桃乃木香奈 | 国产高清免费视频 | 欧美极品在线视频 | 色www精品视频在线观看 | 国产成人午夜精品影院游乐网 | 在线国产一区 | 91精品国产综合久久精品 | 亚洲欧美视频一区 | 亚洲在线一区 | 日日骚av | 国产精品视频一二三区 | 国产精品精品视频 | 精品国产免费人成在线观看 | 国产精品日韩欧美一区二区三区 | 国产小视频在线 | 一区二区三区高清 | 欧美福利视频 | 日本xx视频免费观看 | 久热久草 | 男人视频网站 | 色综合天天天天做夜夜夜夜做 | 九九热这里 | 亚洲成人精品视频 | 狠狠入ady亚洲精品经典电影 | 精品视频免费 | 91免费小视频| 午夜寂寞影院在线观看 | 欧美一级二级在线观看 | 看av网|