STM32基于SPI和AD7192的数据采集
在開發(fā)臭氧發(fā)生器的時(shí),我們需要一個(gè)高分辨率的AD采集,于是選擇了AD7192,選擇這款A(yù)DC的原因比較簡單。首先它是24位的符合我們的精度要求;其次它自帶時(shí)鐘,便于節(jié)省空間;第三它有4路單端或2路差分輸入,與我們需要三路采集相符。
1、AD7192簡介
AD7192是一款適合高精密測量應(yīng)用的低噪聲完整模擬前端,內(nèi)置一個(gè)低噪聲、 24 位Σ-Δ型模數(shù)轉(zhuǎn)換器 (ADC)。片內(nèi)低噪聲增益級意味著可直接輸入小信號(hào)。
AD7192可配置為兩路差分輸入或四路偽差分輸入。片內(nèi)通道序列器可以使能多個(gè)通道,AD7192 按順序在各使能通道上執(zhí)行轉(zhuǎn)換,這可以簡化與器件的通信。 片內(nèi) 4.92 MHz時(shí)鐘可以用作 ADC 的時(shí)鐘源; 或者也可以使用外部時(shí)鐘或晶振。 該器件的輸出數(shù)據(jù)速率可在 4.7 Hz 至 4.8 kHz 的范圍內(nèi)變化。
AD7192提供兩種數(shù)字濾波器選項(xiàng)。 濾波器的選擇會(huì)影響以編程輸出數(shù)據(jù)速率工作時(shí)的均方根噪聲和無噪聲分辨率、建立時(shí)間以及 50 Hz/60 Hz 抑制。 針對要求所有轉(zhuǎn)換均需建立的應(yīng)用, AD7192 具有零延遲特性。
其功能結(jié)構(gòu)圖如下:
2、硬件設(shè)計(jì)
AD7192的串行接口包含四個(gè)信號(hào):CS、DIN、SCLK 和DOUT/RDY。所以我們采用標(biāo)準(zhǔn)的SPI接口來實(shí)現(xiàn)AD7192的數(shù)據(jù)操作。具體的硬件設(shè)計(jì)圖如下:
4路輸入分別通過運(yùn)算放大器做前端處理,然后以標(biāo)準(zhǔn)信號(hào)輸入到AD7192,數(shù)字輸入輸出則接到MCU的SPI接口。
3、軟件設(shè)計(jì)
AD7192內(nèi)部具有多個(gè)寄存器,對AD7192的操作就是通過這些片內(nèi)寄存器進(jìn)行控制和數(shù)據(jù)寄存器/數(shù)據(jù)寄存器加狀態(tài)信息配置。這些寄存器包括:通信寄存器、狀態(tài)寄存器、模式寄存器、配置寄存器、ID寄存器、GPOCON寄存器、失調(diào)寄存器以及滿量程寄存器。其中通信寄存器和狀態(tài)寄存器共享地址,讀操作時(shí)針對的是狀態(tài)寄存器,寫操作時(shí)針對的是通訊寄存器。對任何寄存器的操作都是從寫通訊寄存器開始。
(1)、AD7192初始化
在使用AD719前先對其實(shí)先初始化。首先是軟件復(fù)位,連續(xù)寫入40個(gè)1就可對AD7192實(shí)現(xiàn)復(fù)位。復(fù)位完成后,對零點(diǎn)和量程進(jìn)行較準(zhǔn)。而后讀取各寄存器狀態(tài)。具體實(shí)現(xiàn)代碼如下:
/*AD7192初始化配置*/ void AD7192Initialization(void (*ReadWriteForAd7192)(uint8_t *,uint8_t *,uint16_t ),void (*ChipSelected)(bool),uint16_t (*GetReadyInput)(void)) {AD7192SoftwareReset(ReadWriteForAd7192,ChipSelected);AD7192InternalZeroScaleCalibration(ReadWriteForAd7192,ChipSelected,GetReadyInput);AD7192InternalFullScaleCalibration(ReadWriteForAd7192,ChipSelected,GetReadyInput);/*讀取并存儲(chǔ)全部寄存器的值*/ReadAD7192Register(REG_COM_STA, 8, AD7192Registers, REG_COM_STA,ReadWriteForAd7192,ChipSelected);AD7192InternalZeroScaleCalibration(ReadWriteForAd7192,ChipSelected,GetReadyInput);AD7192InternalFullScaleCalibration(ReadWriteForAd7192,ChipSelected,GetReadyInput); }零點(diǎn)和量程校準(zhǔn)包括內(nèi)部校準(zhǔn)和外部校準(zhǔn),我們這里使用內(nèi)部校準(zhǔn)。
(2)、讀取轉(zhuǎn)換數(shù)據(jù)
讀取轉(zhuǎn)換的結(jié)果有2中方式:單次獲取和連續(xù)獲取。單次轉(zhuǎn)換模式下,AD7192 在完成轉(zhuǎn)換后處于關(guān)斷模式。 將模式寄存器中的MD2、MD1和MD0分別設(shè)置為0、0、1,便可啟動(dòng)單次轉(zhuǎn)換,此時(shí)AD7192將上電,執(zhí)行單次轉(zhuǎn)換,然后返回關(guān)斷模式。時(shí)序圖如下所示:
單次轉(zhuǎn)換數(shù)據(jù)獲取具體實(shí)現(xiàn)代碼如下:
uint32_t GetStartSingleConvertionValue(uint32_t Channels,void (*ReadWriteForAd7192)(uint8_t *,uint8_t *,uint16_t ),void (*ChipSelected)(bool),uint16_t (*GetReadyInput)(void)) {uint32_t dataCode=0;AD7192StartSingleConvertion(Channels,ReadWriteForAd7192,ChipSelected);dataCode = AD7192ReadConvertingData(ReadWriteForAd7192,ChipSelected,GetReadyInput);dataCode =dataCode & 0x00FFFFFF;ReadAD7192Register(REG_DATA, 1, AD7192Registers, REG_DATA,ReadWriteForAd7192,ChipSelected);return dataCode; }連續(xù)轉(zhuǎn)換模式是上電后的默認(rèn)轉(zhuǎn)換模式。AD7192連續(xù)轉(zhuǎn)換,每次完成轉(zhuǎn)換后,狀態(tài)寄存器中的RDY位變?yōu)榈碗娖健H绻鸆S為低電平,則完成一次轉(zhuǎn)換時(shí),DOUT/RDY 線路也會(huì)變?yōu)榈碗娖健H粢x取轉(zhuǎn)換結(jié)果,用戶需要寫入通信寄存器,指示下一操作為讀取數(shù)據(jù)寄存器。從數(shù)據(jù)寄存器中讀取數(shù)據(jù)字后,DOUT/RDY變?yōu)楦唠娖健r(shí)序圖如下所示:
連續(xù)轉(zhuǎn)換數(shù)據(jù)獲取具體實(shí)現(xiàn)代碼如下:
void GettContinuousConvertionValue(uint32_t Channels,uint32_t *dataCodes,int number,void (*ReadWriteForAd7192)(uint8_t *,uint8_t *,uint16_t ),void (*ChipSelected)(bool),uint16_t (*GetReadyInput)(void)) {uint32_t dataCode=0;AD7192StartContinuousConvertion(Channels,ReadWriteForAd7192,ChipSelected);for(int i=0;i<number;i++){dataCode = AD7192ReadConvertingData(ReadWriteForAd7192,ChipSelected,GetReadyInput);dataCode =dataCode & 0x00FFFFFF;dataCodes[i]=dataCode;} }(3)、讀取內(nèi)部溫度
AD7192內(nèi)置一個(gè)溫度傳感器。利用配置寄存器中的CH2位可以選擇溫度傳感器。如果CH2位設(shè)置為1,就會(huì)使能溫度傳感器。使用溫度傳感器并選擇雙極性模式時(shí),如果溫度為0K,器件應(yīng)返回0x800000碼。為使傳感器發(fā)揮最佳性能,需要執(zhí)行單點(diǎn)校準(zhǔn)。因此,應(yīng)記錄25°C 時(shí)的轉(zhuǎn)換結(jié)果并計(jì)算靈敏度。 靈敏度約為2815碼 /°C。溫度傳感器的計(jì)算公式為 :
溫度 (K) = ( 轉(zhuǎn)換結(jié)果 – 0x800000)/2815 K
溫度 (°C) = 溫度 (K) – 273
單點(diǎn)校準(zhǔn)之后,內(nèi)部溫度傳感器的精度典型值為 ±2°C。具體的實(shí)現(xiàn)代碼如下:
/*讀取內(nèi)部溫度數(shù)據(jù),返回?cái)z氏度溫度*/ float GetTemperatureValue(void (*ReadWriteForAd7192)(uint8_t *,uint8_t *,uint16_t ),void (*ChipSelected)(bool),uint16_t (*GetReadyInput)(void)) {uint32_t temperatureCode=0;float temp = 0.0;AD7192Registers[REG_MODE] = 0;AD7192Registers[REG_CONF] = 0;AD7192Registers[REG_MODE] = MODE_SING|DAT_STA_DIS|INCLK_MCLK2EN|SINC_4|ENPAR_EN|CLK_DIV_DIS|SINGLECYCLE_DIS|REJ60_DIS|0x080; // ?AD7192Registers[REG_MODE] = MODE_CONT|DAT_STA_DIS|INCLK_MCLK2TRI|SINC_4|ENPAR_DIS|CLK_DIV_DIS|SINGLECYCLE_DIS|REJ60_DIS|0x060;WriteAD7192Register(REG_MODE, 1, AD7192Registers,ReadWriteForAd7192,ChipSelected);AD7192Registers[REG_CONF] = CHOP_DIS|REF_IN1|TEMP|BURN_DIS|REFDET_DIS|BUF_DIS|UB_BI|GAIN_1;WriteAD7192Register(REG_CONF, 1, AD7192Registers,ReadWriteForAd7192,ChipSelected);temperatureCode = AD7192ReadConvertingData(ReadWriteForAd7192,ChipSelected,GetReadyInput);temp = (temperatureCode-0x800000)/2815.0-273;return temp; }歡迎關(guān)注:
總結(jié)
以上是生活随笔為你收集整理的STM32基于SPI和AD7192的数据采集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一文读懂Git工作流
- 下一篇: FreeRTOS学习及移植笔记之一:开始