引言
NPI提了需求,需要驗(yàn)證使用友商SDADC芯片和MM32L0130微控制器集成的一個(gè)系統(tǒng)應(yīng)用方案。
本文參考 CN-0216 Precision Weigh Scale Design 方案對(duì)使用MM32L0130和HYS1254的應(yīng)用方案進(jìn)行驗(yàn)證,使用靈動(dòng)微電子MM32L0130
微控制器、健芯半導(dǎo)體的HYS1254
高精度24位分辨率的Sigma Delta ADC,以及圣邦微電子SGM8967-1
運(yùn)放前端,實(shí)現(xiàn)了高精度電子秤的方案,記錄了嘗試使用各種方法消除采樣值抖動(dòng)問(wèn)題,總結(jié)了目前驗(yàn)證過(guò)程中遇到的問(wèn)題。
只是比較遺憾,最終驗(yàn)證方案性能未達(dá)預(yù)期,有點(diǎn)小小的翻車(chē)。。。
電路設(shè)計(jì)
設(shè)計(jì)電子秤方案系統(tǒng),使用了搭載MM32L0136C7P
微控制器的EVB-L0136
開(kāi)發(fā)板,使用HYS1254
SDADC構(gòu)成的采樣電路采集來(lái)自壓力傳感器輸出的電信號(hào),實(shí)現(xiàn)測(cè)量壓力的功能,以演示高精度ADC的分辨率。如圖x所示。試想,能不能測(cè)量風(fēng)吹過(guò)的感覺(jué)呢?
figure-system-arch-diagram
圖x 電子秤原型系統(tǒng)框圖
設(shè)計(jì)稱(chēng)重信號(hào)采集電路,如圖x電路,使用了HYS1254
SDADC和SGM8967-1
運(yùn)放前端兩個(gè)主要的分立元件搭建而成。
figure-hys1254-schmatic
圖x HYS1254及采樣電路
根據(jù)HYS1254
手冊(cè)中的建議,在采樣電路中使用OPA350UA/2K5
向HYS1254
提供4.096V
的參考電壓ADC_VERF
,如圖x所示:
figure-OPA350UA-schmatic
圖x 使用OPA350UA/2K5的參考電壓源電路
最終搭建電路系統(tǒng)實(shí)物
軟件設(shè)計(jì)
采集HYS1254數(shù)據(jù)
根據(jù)HYS1254
數(shù)據(jù)手冊(cè)中對(duì)傳輸ADC采樣值的數(shù)字通信信號(hào)時(shí)序描述,如圖x所示。
figure-hys1254-signal-timing-seq
圖x HYS1254讀數(shù)信號(hào)時(shí)序圖
這里特別注意,MCU每次使用引腳中斷捕獲到DRDY的下降沿(一次ADC轉(zhuǎn)換完成)后,需要等一段時(shí)間,才能由MCU驅(qū)動(dòng)SCLK時(shí)鐘,從DOUT引腳串行捕獲ADC采樣結(jié)果的值。
使用GPIO模擬時(shí)序,實(shí)現(xiàn)讀取一次采樣值代碼如下:
/* read a sample value from hys1254. */
int32_t app_hys1254_read_adc_value_raw(void)
{
int32_t adc_val = 0;
/* wait to enter hys1254 data cycle. */
for (uint32_t delay = (CLOCK_SYS_FREQ / APP_ADC_CLK_FREQ)*2; delay > 0; delay--)
{
__NOP();
}
/* read data. */
for (uint32_t i = 24; i; i--)
{
adc_val < <= 1;
adc_val |= (GPIOB- >IDR & BOARD_ADC_SDA_PIN) != 0;
BOARD_ADC_SCK_PORT- >BSRR = BOARD_ADC_SCK_PIN;
__NOP();
BOARD_ADC_SCK_PORT- >BRR = BOARD_ADC_SCK_PIN;
__NOP();
}
if (0u != (adc_val & 0x800000))
{
adc_val |= 0xFF000000;
}
return adc_val;
}
這里根據(jù)HYS1254數(shù)據(jù)輸出的時(shí)序特征,使用外部中斷下降沿觸發(fā)的方式讀取HYS1254輸出的數(shù)據(jù)讀取,實(shí)現(xiàn)代碼如下:
/* prepare to read the hys1254. */
void app_hys1254_init(void)
{
/* init MCO to provide clock. */
CLOCK_MCO_1MHz();
/* init exti to get data. */
SYSCFG_SetExtIntMux(BOARD_SYSCFG_EXTIPORT, BOARD_SYSCFG_EXTI_LINE);
EXTI_EnableLineInterrupt(BOARD_EXTI_PORT, BOARD_EXTI_LINE, true);
EXTI_SetTriggerIn(BOARD_EXTI_PORT, BOARD_EXTI_LINE, EXTI_TriggerIn_FallingEdge);
NVIC_EnableIRQ(EXTI15_4_IRQn);
}
void EXTI15_4_IRQHandler(void)
{
uint32_t flags = EXTI_GetLineStatus(EXTI);
if ( 0u != ( flags & BOARD_EXTI_LINE ) ) /* interrupts. */
{
hys1254_adc_raw_fifo_buff[hys1254_adc_raw_fifo_index] = app_hys1254_read_adc_value_raw();
hys1254_adc_raw_fifo_index = (hys1254_adc_raw_fifo_index+1) % HYS1254_ADC_RAW_FIFO_LEN;
}
EXTI_ClearLineStatus(EXTI, flags);
}
其中,使用hys1254_adc_raw_fifo_buff[]
作為窗口緩沖區(qū),緩存最近若干個(gè)(由HYS1254_ADC_RAW_FIFO_LEN
指定)ADC的原始采樣結(jié)果。
軟件濾波算法
在直接使用采樣原始值作為結(jié)果輸出時(shí),發(fā)現(xiàn)壓力傳感器在未稱(chēng)重物的情況下,持續(xù)一段時(shí)間內(nèi),采集采樣電路輸出的ADC數(shù)值偏差過(guò)大,這里使用了滑動(dòng)窗口+中段數(shù)據(jù)均值濾波法來(lái)嘗試消除采樣值的抖動(dòng)問(wèn)題,實(shí)現(xiàn)原理為每采樣128次值后對(duì)這128次采樣值進(jìn)行升序排序,然后舍去前段和后段的數(shù)據(jù),取剩余的中間段的數(shù)據(jù)求平均值作為一次采樣結(jié)果。有代碼如下所示:
int32_t app_hys1254_get_adc_value_filted(int32_t * out_buff)
{
/* sequencilize. */
app_bubble_sort(out_buff, HYS1254_ADC_RAW_FIFO_LEN);
/* scoll the data into the filter window. */
int64_t sum_64 = 0;
for (uint32_t i = HYS1254_ADC_RAW_FIFO_LEN/4u; i < HYS1254_ADC_RAW_FIFO_LEN-(HYS1254_ADC_RAW_FIFO_LEN/4); i++)
{
sum_64 += out_buff[i];
}
sum_64 /= (HYS1254_ADC_RAW_FIFO_LEN/2u);
return (int32_t)sum_64;
}
換算壓力為ADC采樣值
實(shí)驗(yàn)中使用了HX711壓力傳感器套裝的壓力傳感器模塊。
關(guān)于壓力傳感器模塊,需要關(guān)注技術(shù)指標(biāo)為:量程、接線方式、供電電壓、輸出靈敏度。實(shí)驗(yàn)中,使用的是5kg量程傳感器,靈敏度1.0mV/V,供電電壓5V,對(duì)應(yīng)滿(mǎn)量程輸出電壓(輸出最大電壓值)= 靈敏度 * 供電電壓 = 5mV,即在傳感器托盤(pán)上放置5kg的重物對(duì)應(yīng)輸出5mV。傳感器的參數(shù)清單,如圖x所示。
figure-hx711-pressure-sensor-spec
圖x 壓力傳感器參數(shù)指標(biāo)清單
在軟件中,將HYS1254的采集值與最終的稱(chēng)重值成正比,在實(shí)際轉(zhuǎn)換為稱(chēng)重值時(shí),需要HYS1254采樣值除以一個(gè)系數(shù),而該系數(shù)將由試湊法,通過(guò)用標(biāo)準(zhǔn)砝碼進(jìn)行校驗(yàn)(俗稱(chēng)“去皮”),也可通過(guò)理論值進(jìn)行計(jì)算。在應(yīng)用工程中,已經(jīng)設(shè)計(jì)了轉(zhuǎn)換代碼。
volatile int32_t app_weight_base = 0;
volatile int32_t app_weight_current = 0;
volatile float adc_factor = 740;
int main(void)
{
...
while (1)
{
...
app_slcd_display((float)(app_weight_current- app_weight_base)/adc_factor);
}
}
其中,adc_factor
變量即為可調(diào)整的比例系數(shù),app_weight_base
為“去皮”的基準(zhǔn)采樣值。
實(shí)驗(yàn)過(guò)程
數(shù)據(jù)可視化
為直觀的分析和觀察實(shí)時(shí)采集到的HYS1254輸出的數(shù)據(jù),這里使用了FreeMaster軟件觀察MCU中記錄濾波前的全局變量app_hys1254_adc_raw_fifo_current[0]
和濾波后全局變量 app_hys1254_value_filted
,如圖x所示。
figure-sdadc-data-visualization-with-freemaster
圖x 對(duì)采樣數(shù)據(jù)進(jìn)行可視化
通過(guò)實(shí)驗(yàn)發(fā)現(xiàn),壓力傳感器相對(duì)靜止的狀態(tài)下,在同一狀態(tài)下連續(xù)一段時(shí)間內(nèi),觀察采集得到的各個(gè)24位采樣值之間的后13位一直在不斷波動(dòng),每次得到的采樣結(jié)果波動(dòng)過(guò)大,無(wú)法精確實(shí)現(xiàn)克單位級(jí)別細(xì)粒度的測(cè)量。
優(yōu)化電路
在分析ADC采樣值不穩(wěn)定的原因時(shí),意外碰到ADC模塊之間的物理連接線,發(fā)現(xiàn)數(shù)據(jù)可視化的界面受到了很明顯的影響,波形抖動(dòng)幅度甚至達(dá)到了5g砝碼對(duì)傳感器產(chǎn)生的影響。由此可判定電路之間的連接線對(duì)模擬信號(hào)影響頗大。在實(shí)驗(yàn)中采取的應(yīng)對(duì)措施是,縮短ADC采集電路與壓力傳感器之間的連線,將之前由杜邦線連接改為將壓力傳感器引出的線直接焊接在ADC采集電路板中,如圖x所示。
按照上述條件,進(jìn)行對(duì)比實(shí)驗(yàn),數(shù)據(jù)波動(dòng)有明顯改善。但是,數(shù)據(jù)波動(dòng)仍然明顯。
使用軟件濾波
實(shí)驗(yàn)中,使用MCU在向HYS1254
提供8MHz
的時(shí)鐘源,獲得20.833kHz
的采樣率,未使用濾波,和使用滑動(dòng)窗口+中段數(shù)據(jù)均值濾波后,有采樣波形,如圖x所示。
觀察數(shù)據(jù)發(fā)現(xiàn),使用軟件濾波算法前后所得到的數(shù)據(jù),通過(guò)比較采樣期間得到的最大最小值之間的差值可以發(fā)現(xiàn)數(shù)據(jù)波動(dòng)雖有改善但仍然有較大的波動(dòng),對(duì)最終的獲得精確稱(chēng)重效果無(wú)明顯改善,即24位采樣值中,在電子秤保持靜止?fàn)顟B(tài)下,數(shù)值波動(dòng)最大最小值在經(jīng)過(guò)濾波后的波動(dòng)差在 5689 ,即至少24位的采樣值其中的后13位(8192)在波動(dòng),未實(shí)現(xiàn)克單位級(jí)別的測(cè)量。
降低ADC的采樣速率
閱讀SDADC的數(shù)據(jù)手冊(cè)發(fā)現(xiàn),降低ADC采樣頻率至低速,有助于提高ADC轉(zhuǎn)換結(jié)果的準(zhǔn)確度。故在本實(shí)驗(yàn)中調(diào)整SDADC芯片的工作頻率,進(jìn)而降低ADC轉(zhuǎn)換的頻率。
在向HYS1254提供1MHz的時(shí)鐘源,獲得2.604kHz的采樣率后的采樣結(jié)果:
使用1MHz
的時(shí)鐘源獲得2.604kHz
的采樣率,相對(duì)于之前的實(shí)驗(yàn)結(jié)果可以看到,降低采樣率是可以在一定程度上減小波動(dòng),但采集出來(lái)的數(shù)據(jù)波動(dòng)仍然過(guò)大,未滿(mǎn)足穩(wěn)定測(cè)量1克單位級(jí)別細(xì)粒度的要求。
使用獨(dú)立的供電電源
進(jìn)一步分析系統(tǒng)噪聲可能來(lái)自于電源,因此分別使用DCDC充電器和電池作為整個(gè)系統(tǒng)的電源,驗(yàn)證電源對(duì)應(yīng)用系統(tǒng)中ADC采樣精度的影響。
- 使用使用手機(jī)電源適配器(MDY-08-ES,5V3A)供電。在向HYS1254提供1MHz的時(shí)鐘源,獲得2.604kHz的采樣率后的采樣結(jié)果:
- 使用干電池供電(3節(jié)南孚5號(hào)電池,4.5V供電),在向HYS1254提供1MHz的時(shí)鐘源,獲得2.604kHz的采樣率后的采樣結(jié)果:
按照上述條件,進(jìn)行了對(duì)比實(shí)驗(yàn),可以發(fā)現(xiàn)數(shù)據(jù)波動(dòng)改善不明顯。
再次調(diào)整濾波算法
在向HYS1254提供1MHz的時(shí)鐘源,獲得2.604kHz的采樣率。由每組采集128次增加到每組采集256次再進(jìn)行濾波,有采樣結(jié)果,如圖x所示。
由上述數(shù)據(jù)可知,增大每組的采樣次數(shù)到256次,再進(jìn)行中段數(shù)據(jù)均值濾波后,數(shù)值波動(dòng)最大最小值在經(jīng)過(guò)濾波后的波動(dòng)差在5689
,即至少24位的采樣值其中的后12位(4096)仍在波動(dòng),未能實(shí)現(xiàn)克單位級(jí)別的測(cè)量,未實(shí)現(xiàn)預(yù)期結(jié)果。
驗(yàn)證總結(jié)
本次驗(yàn)證實(shí)驗(yàn),發(fā)現(xiàn)使用以HYS1254為主要器件的分立元件構(gòu)成的SDADC采樣方案結(jié)果波動(dòng)過(guò)大,暫未實(shí)現(xiàn)1克細(xì)粒度的壓力測(cè)量,即在壓力傳感器相對(duì)靜止的狀態(tài)下連續(xù)一段時(shí)間采樣得到的各個(gè)24位采樣值之間相互的后13位一直在不斷波動(dòng)的,通過(guò)使用縮短模擬信號(hào)連接導(dǎo)線、使用軟件濾波、降低采樣率,以及使用獨(dú)立電源供電的方法嘗試優(yōu)化,均未明顯改善的測(cè)量結(jié)果。
本文對(duì)此次驗(yàn)證過(guò)程的梳理記錄總結(jié),為接下來(lái)進(jìn)一步的分析實(shí)驗(yàn)和定位問(wèn)題提供參考。
后續(xù)可能有一些新思路繼續(xù)改善靜態(tài)采樣數(shù)據(jù)波動(dòng)問(wèn)題:
- 進(jìn)一步使用理想信號(hào)源,搞不好本方案中用到的大路貨壓力傳感器也不是很靈敏。
- 優(yōu)化采樣電路設(shè)計(jì)。SDADC和分立的運(yùn)放前端配合,中間的模擬信號(hào)通路容易受到外界干擾。市面上常規(guī)的設(shè)計(jì)方案,絕大多數(shù)是將SDADC和AFE合并在一起。甚至可以將MCU和SDADC采樣電路合封在一起,最大化縮短信號(hào)鏈的物理傳輸路徑。另外,很多集成SDADC的SoC中同時(shí)也集成了硬件SINC濾波器模塊。
- 在軟件算法方面,考慮到MM32L0130的片上資源和算力有限,尚未進(jìn)行更多的數(shù)據(jù)濾波算法實(shí)現(xiàn),后期可設(shè)計(jì)通過(guò)二階或多階濾波,也可通過(guò)進(jìn)一步降低采樣率到
kHz
或Hz
級(jí)別,并將每組的采樣個(gè)數(shù)進(jìn)一步地增大,如增大到512或者是1024個(gè)采樣值作為一組值求平均,來(lái)嘗試獲取穩(wěn)定的數(shù)據(jù)。
-
微控制器
+關(guān)注
關(guān)注
48文章
7651瀏覽量
152120 -
驅(qū)動(dòng)器
+關(guān)注
關(guān)注
53文章
8272瀏覽量
147071 -
壓力傳感器
+關(guān)注
關(guān)注
35文章
2243瀏覽量
163589 -
ADC采樣
+關(guān)注
關(guān)注
0文章
134瀏覽量
12904 -
MCU芯片
+關(guān)注
關(guān)注
3文章
253瀏覽量
11629
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
無(wú)線吊秤,無(wú)線傳輸?shù)?b class='flag-5'>電子秤解決方案
使用MM32L0130 IRM實(shí)現(xiàn)紅外發(fā)碼
基于MM32L0130的低功耗電子時(shí)鐘設(shè)計(jì)方案相關(guān)資料分享
請(qǐng)問(wèn)有人使用IAR進(jìn)行過(guò)MM32L0130的開(kāi)發(fā)嗎?
靈動(dòng)微MM32L0130系列32位微控制器的詳細(xì)介紹
使用MM32L0130片上IRM模塊實(shí)現(xiàn)紅外發(fā)碼
MM32L0130 RTC日歷和鬧鐘
基于MM32L0130的低功耗電子時(shí)鐘設(shè)計(jì)
靈動(dòng)微電子低功耗單片機(jī)MM32L0130開(kāi)發(fā)板申請(qǐng)
![靈動(dòng)微<b class='flag-5'>電子</b>低功耗單片機(jī)<b class='flag-5'>MM32L0130</b>開(kāi)發(fā)板申請(qǐng)](https://file.elecfans.com//web2/M00/7D/5D/pYYBAGN7QZ2APBQtAAD3ItsYV8M868.jpg)
評(píng)論