引言
NPI提了需求,需要驗證使用友商SDADC芯片和MM32L0130微控制器集成的一個系統應用方案。
本文參考 CN-0216 Precision Weigh Scale Design 方案對使用MM32L0130和HYS1254的應用方案進行驗證,使用靈動微電子MM32L0130
微控制器、健芯半導體的HYS1254
高精度24位分辨率的Sigma Delta ADC,以及圣邦微電子SGM8967-1
運放前端,實現了高精度電子秤的方案,記錄了嘗試使用各種方法消除采樣值抖動問題,總結了目前驗證過程中遇到的問題。
只是比較遺憾,最終驗證方案性能未達預期,有點小小的翻車。。。
電路設計
設計電子秤方案系統,使用了搭載MM32L0136C7P
微控制器的EVB-L0136
開發板,使用HYS1254
SDADC構成的采樣電路采集來自壓力傳感器輸出的電信號,實現測量壓力的功能,以演示高精度ADC的分辨率。如圖x所示。試想,能不能測量風吹過的感覺呢?
figure-system-arch-diagram
圖x 電子秤原型系統框圖
設計稱重信號采集電路,如圖x電路,使用了HYS1254
SDADC和SGM8967-1
運放前端兩個主要的分立元件搭建而成。
figure-hys1254-schmatic
圖x HYS1254及采樣電路
根據HYS1254
手冊中的建議,在采樣電路中使用OPA350UA/2K5
向HYS1254
提供4.096V
的參考電壓ADC_VERF
,如圖x所示:
figure-OPA350UA-schmatic
圖x 使用OPA350UA/2K5的參考電壓源電路
最終搭建電路系統實物
軟件設計
采集HYS1254數據
根據HYS1254
數據手冊中對傳輸ADC采樣值的數字通信信號時序描述,如圖x所示。
figure-hys1254-signal-timing-seq
圖x HYS1254讀數信號時序圖
這里特別注意,MCU每次使用引腳中斷捕獲到DRDY的下降沿(一次ADC轉換完成)后,需要等一段時間,才能由MCU驅動SCLK時鐘,從DOUT引腳串行捕獲ADC采樣結果的值。
使用GPIO模擬時序,實現讀取一次采樣值代碼如下:
/* 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;
}
這里根據HYS1254數據輸出的時序特征,使用外部中斷下降沿觸發的方式讀取HYS1254輸出的數據讀取,實現代碼如下:
/* 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[]
作為窗口緩沖區,緩存最近若干個(由HYS1254_ADC_RAW_FIFO_LEN
指定)ADC的原始采樣結果。
軟件濾波算法
在直接使用采樣原始值作為結果輸出時,發現壓力傳感器在未稱重物的情況下,持續一段時間內,采集采樣電路輸出的ADC數值偏差過大,這里使用了滑動窗口+中段數據均值濾波法來嘗試消除采樣值的抖動問題,實現原理為每采樣128次值后對這128次采樣值進行升序排序,然后舍去前段和后段的數據,取剩余的中間段的數據求平均值作為一次采樣結果。有代碼如下所示:
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采樣值
實驗中使用了HX711壓力傳感器套裝的壓力傳感器模塊。
關于壓力傳感器模塊,需要關注技術指標為:量程、接線方式、供電電壓、輸出靈敏度。實驗中,使用的是5kg量程傳感器,靈敏度1.0mV/V,供電電壓5V,對應滿量程輸出電壓(輸出最大電壓值)= 靈敏度 * 供電電壓 = 5mV,即在傳感器托盤上放置5kg的重物對應輸出5mV。傳感器的參數清單,如圖x所示。
figure-hx711-pressure-sensor-spec
圖x 壓力傳感器參數指標清單
在軟件中,將HYS1254的采集值與最終的稱重值成正比,在實際轉換為稱重值時,需要HYS1254采樣值除以一個系數,而該系數將由試湊法,通過用標準砝碼進行校驗(俗稱“去皮”),也可通過理論值進行計算。在應用工程中,已經設計了轉換代碼。
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
變量即為可調整的比例系數,app_weight_base
為“去皮”的基準采樣值。
實驗過程
數據可視化
為直觀的分析和觀察實時采集到的HYS1254輸出的數據,這里使用了FreeMaster軟件觀察MCU中記錄濾波前的全局變量app_hys1254_adc_raw_fifo_current[0]
和濾波后全局變量 app_hys1254_value_filted
,如圖x所示。
figure-sdadc-data-visualization-with-freemaster
圖x 對采樣數據進行可視化
通過實驗發現,壓力傳感器相對靜止的狀態下,在同一狀態下連續一段時間內,觀察采集得到的各個24位采樣值之間的后13位一直在不斷波動,每次得到的采樣結果波動過大,無法精確實現克單位級別細粒度的測量。
優化電路
在分析ADC采樣值不穩定的原因時,意外碰到ADC模塊之間的物理連接線,發現數據可視化的界面受到了很明顯的影響,波形抖動幅度甚至達到了5g砝碼對傳感器產生的影響。由此可判定電路之間的連接線對模擬信號影響頗大。在實驗中采取的應對措施是,縮短ADC采集電路與壓力傳感器之間的連線,將之前由杜邦線連接改為將壓力傳感器引出的線直接焊接在ADC采集電路板中,如圖x所示。
按照上述條件,進行對比實驗,數據波動有明顯改善。但是,數據波動仍然明顯。
使用軟件濾波
實驗中,使用MCU在向HYS1254
提供8MHz
的時鐘源,獲得20.833kHz
的采樣率,未使用濾波,和使用滑動窗口+中段數據均值濾波后,有采樣波形,如圖x所示。
觀察數據發現,使用軟件濾波算法前后所得到的數據,通過比較采樣期間得到的最大最小值之間的差值可以發現數據波動雖有改善但仍然有較大的波動,對最終的獲得精確稱重效果無明顯改善,即24位采樣值中,在電子秤保持靜止狀態下,數值波動最大最小值在經過濾波后的波動差在 5689 ,即至少24位的采樣值其中的后13位(8192)在波動,未實現克單位級別的測量。
降低ADC的采樣速率
閱讀SDADC的數據手冊發現,降低ADC采樣頻率至低速,有助于提高ADC轉換結果的準確度。故在本實驗中調整SDADC芯片的工作頻率,進而降低ADC轉換的頻率。
在向HYS1254提供1MHz的時鐘源,獲得2.604kHz的采樣率后的采樣結果:
使用1MHz
的時鐘源獲得2.604kHz
的采樣率,相對于之前的實驗結果可以看到,降低采樣率是可以在一定程度上減小波動,但采集出來的數據波動仍然過大,未滿足穩定測量1克單位級別細粒度的要求。
使用獨立的供電電源
進一步分析系統噪聲可能來自于電源,因此分別使用DCDC充電器和電池作為整個系統的電源,驗證電源對應用系統中ADC采樣精度的影響。
- 使用使用手機電源適配器(MDY-08-ES,5V3A)供電。在向HYS1254提供1MHz的時鐘源,獲得2.604kHz的采樣率后的采樣結果:
- 使用干電池供電(3節南孚5號電池,4.5V供電),在向HYS1254提供1MHz的時鐘源,獲得2.604kHz的采樣率后的采樣結果:
按照上述條件,進行了對比實驗,可以發現數據波動改善不明顯。
再次調整濾波算法
在向HYS1254提供1MHz的時鐘源,獲得2.604kHz的采樣率。由每組采集128次增加到每組采集256次再進行濾波,有采樣結果,如圖x所示。
由上述數據可知,增大每組的采樣次數到256次,再進行中段數據均值濾波后,數值波動最大最小值在經過濾波后的波動差在5689
,即至少24位的采樣值其中的后12位(4096)仍在波動,未能實現克單位級別的測量,未實現預期結果。
驗證總結
本次驗證實驗,發現使用以HYS1254為主要器件的分立元件構成的SDADC采樣方案結果波動過大,暫未實現1克細粒度的壓力測量,即在壓力傳感器相對靜止的狀態下連續一段時間采樣得到的各個24位采樣值之間相互的后13位一直在不斷波動的,通過使用縮短模擬信號連接導線、使用軟件濾波、降低采樣率,以及使用獨立電源供電的方法嘗試優化,均未明顯改善的測量結果。
本文對此次驗證過程的梳理記錄總結,為接下來進一步的分析實驗和定位問題提供參考。
后續可能有一些新思路繼續改善靜態采樣數據波動問題:
- 進一步使用理想信號源,搞不好本方案中用到的大路貨壓力傳感器也不是很靈敏。
- 優化采樣電路設計。SDADC和分立的運放前端配合,中間的模擬信號通路容易受到外界干擾。市面上常規的設計方案,絕大多數是將SDADC和AFE合并在一起。甚至可以將MCU和SDADC采樣電路合封在一起,最大化縮短信號鏈的物理傳輸路徑。另外,很多集成SDADC的SoC中同時也集成了硬件SINC濾波器模塊。
- 在軟件算法方面,考慮到MM32L0130的片上資源和算力有限,尚未進行更多的數據濾波算法實現,后期可設計通過二階或多階濾波,也可通過進一步降低采樣率到
kHz
或Hz
級別,并將每組的采樣個數進一步地增大,如增大到512或者是1024個采樣值作為一組值求平均,來嘗試獲取穩定的數據。
-
微控制器
+關注
關注
48文章
7496瀏覽量
151085 -
驅動器
+關注
關注
52文章
8168瀏覽量
146052 -
壓力傳感器
+關注
關注
35文章
2161瀏覽量
163326 -
ADC采樣
+關注
關注
0文章
134瀏覽量
12832 -
MCU芯片
+關注
關注
3文章
248瀏覽量
11394
發布評論請先 登錄
相關推薦
評論