基于FPGA控制ADC0832雙通道采樣+電壓電流采樣+LCD屏幕顯示
- 前言
- 一、芯片手冊閱讀
- 1.SPI通信時序
- 二、仿真分析
- 三、代碼分析
- 總結
- 視頻演示
前言
定制
要求使用ADC0832芯片進行ADC采樣。其中電壓采樣以及電流采樣是固定電路,是硬件設計,跟軟件沒沒關系。本質上是進行了兩路的電壓信號采集。
引用:ADC0832模塊說明
一、芯片手冊閱讀
1.SPI通信時序
確定SPI相關信息:
第一個空閑狀態下CLK和DI的狀態,圖上顯示CLK默認為低電平,上升沿設置數據,下降沿讀取數據。DI空閑狀態下為高電平。
CS正常拉低。
DOUT數據輸出15個bit,本身這個ADC是8位,因此輸出的數據就是8bit的,但是這個芯片本身有一個驗證的功能吧相當于。分別把這個8位數據輸出兩次,先從高位輸出到低位,再從低位輸出到高位,其中低位是共用的。如果兩個8位數據一致,則輸出。否則認為ADC采樣有問題。
數據構成相關說明:
跟一般的SPI AD采樣的過程的區別就是前3個bit是進行設置。第四個脈沖的下降沿進行輸出數據,但是用第五個的脈沖的上升沿讀取數據更加合理,所以一共需要3+1+15個脈沖,也就是19個脈沖。
這個就是對前三個比特說明:第一個比特必須為高,目的是告訴ADC要開始讀取了。其次后面兩個比特是進行采樣通道的設置,10就是用通道0,11就是用通道1.其他就是差分輸入了,我用不到。
二、仿真分析
通過改通道10或者11就實現兩個通道的切換了。
仿真只做了一種通道,后面實際上板是兩個通道來回采樣,實現了兩個通道的采樣。
三、代碼分析
主要就是狀態機的輪轉
//state goalways @(posedge sys_clk or negedge rst_n)beginif(!rst_n)beginstate<=IDLE;adc_data1_temp<=16'd0;adc_data2_temp<=16'd0;CH_SET<=1'b0;lcd_flag<=1'b0;endelse begincase(state)IDLE:beginstate<=WAIT;lcd_flag<=1'b0;CH_SET<=~CH_SET;endWAIT:beginif(wait_count==WAIT_max)beginstate<=START;endelse beginstate<=WAIT;endendSTART:beginstate<=SET;endSET:beginif(clk_count==8'd3)beginstate<=READ_DATA;endelse beginstate<=SET;endendREAD_DATA:beginif(clk_count==8'd19)beginstate<=OVER;endelse beginstate<=READ_DATA;endendOVER:beginstate<=SAVE_DATA;endSAVE_DATA:beginstate<=IDLE;lcd_flag<=1'b1;if((adc_data1==adc_data2) && CH_SET==1'b1)beginadc_data1_temp<= ((adc_data1 * 3300) >> 4'd8);endelse if((adc_data1==adc_data2) && CH_SET==1'b0)beginadc_data2_temp<= ((adc_data1 * 3300) >> 4'd8);endelse beginadc_data1_temp<=adc_data1_temp;adc_data2_temp<=adc_data2_temp;endenddefault:state<=IDLE;endcaseendend
總結
視頻演示
基于FPGA控制ADC0832雙通道采樣+電壓電流采樣+LCD屏幕顯示