在開發臭氧發生器的時,我們需要乙個高解析度的ad採集,於是選擇了ad7192,選擇這款adc的原因比較簡單。首先它是24位的符合我們的精度要求;其次它自帶時鐘,便於節省空間;第三它有4路單端或2路差分輸入,與我們需要三路採集相符。
ad7192是一款適合高精密測量應用的低雜訊完整模擬前端,內建乙個低雜訊、 24 位σ-δ型模數轉換器 (adc)。片內低雜訊增益級意味著可直接輸入小訊號。
ad7192可配置為兩路差分輸入或四路偽差分輸入。片內通道序列器可以使能多個通道,ad7192 按順序在各使能通道上執行轉換,這可以簡化與器件的通訊。 片內 4.92 mhz時鐘可以用作 adc 的時鐘源; 或者也可以使用外部時鐘或晶振。 該器件的輸出資料速率可在 4.7 hz 至 4.8 khz 的範圍內變化。
ad7192提供兩種數字濾波器選項。 濾波器的選擇會影響以程式設計輸出資料速率工作時的均方根雜訊和無雜訊解析度、建立時間以及 50 hz/60 hz 抑制。 針對要求所有轉換均需建立的應用, ad7192 具有零延遲特性。
其功能結構圖如下:
ad7192的序列介面包含四個訊號:cs、din、sclk 和dout/rdy。所以我們採用標準的spi介面來實現ad7192的資料操作。具體的硬體設計圖如下:
4路輸入分別通過運算放大器做前端處理,然後以標準訊號輸入到ad7192,數字輸入輸出則接到mcu的spi介面。
ad7192內部具有多個暫存器,對ad7192的操作就是通過這些片內暫存器進行控制和資料暫存器/資料暫存器加狀態資訊配置。這些暫存器包括:通訊暫存器、狀態暫存器、模式暫存器、配置暫存器、id暫存器、gpocon暫存器、失調暫存器以及滿量程暫存器。其中通訊暫存器和狀態暫存器共享位址,讀操作時針對的是狀態暫存器,寫操作時針對的是通訊暫存器。對任何暫存器的操作都是從寫通訊暫存器開始。
(1)、ad7192初始化
在使用ad719前先對其實先初始化。首先是軟體復位,連續寫入40個1就可對ad7192實現復位。復位完成後,對零點和量程進行較準。而後讀取各暫存器狀態。具體實現**如下:
/*ad7192初始化配置*/
void ad7192initialization(void (*readwriteforad7192)(uint8_t *,uint8_t *,uint16_t ),void (*chipselected)(bool),uint16_t (*getreadyinput)(void))
零點和量程校準包括內部校準和外部校準,我們這裡使用內部校準。
(2)、讀取轉換資料
讀取轉換的結果有2中方式:單次獲取和連續獲取。單次轉換模式下,ad7192 在完成轉換後處於關斷模式。 將模式暫存器中的md2、md1和md0分別設定為0、0、1,便可啟動單次轉換,此時ad7192將上電,執行單次轉換,然後返回關斷模式。時序圖如下所示:
單次轉換資料獲取具體實現**如下:
uint32_t getstartsingleconvertionvalue(uint32_t channels,void (*readwriteforad7192)(uint8_t *,uint8_t *,uint16_t ),void (*chipselected)(bool),uint16_t (*getreadyinput)(void))
連續轉換模式是上電後的預設轉換模式。ad7192連續轉換,每次完成轉換後,狀態暫存器中的rdy位變為低電平。如果cs為低電平,則完成一次轉換時,dout/rdy 線路也會變為低電平。若要讀取轉換結果,使用者需要寫入通訊暫存器,指示下一操作為讀取資料暫存器。從資料暫存器中讀取資料字後,dout/rdy變為高電平。時序圖如下所示:
連續轉換資料獲取具體實現**如下:
STM32基於SPI的顯示(OLED)
主函式實驗結果 總結本文使用spi 通訊的oled螢幕,晶元使用的是stm32f103zet6。oled模組整體來說比較簡單,就是加字模,調函式的過程。初學者可以好好看看裡面包含的函式,還是很有趣的。oled,即有機發光二極體。oled由於同時具備自發光,不需要光源 對比度高 厚度薄 視角廣 反應速...
STM32之間SPI通訊
這幾天實驗室比較忙,所以部落格這邊停了一下,繼續吧。繼串列埠中斷後,大家可以嘗試微控制器間串列埠通訊,這裡就不再多贅述。串列埠完了之後,我接著學的就是spi通訊了,作為hello moto公司推出的這種4線全雙工通訊,很節約pcb布局空間,但缺點就是沒有指定的流控制,沒有應答機制來確定訊號收到與否,...
STM32 快速上手SPI
基本的部分前文 stm32 spi 已經介紹過了,這裡只記怎麼用。stm32f103zet6的三個spi的引腳分別為 spi1在apb1時鐘下,spi2和spi3在apb2時鐘下。void spi i2s deinit spi typedef spix void spi init spi typed...