STM32F407控制AD7606 采用HAL库的TIM和SPI
前言
本文介紹基于STM32F407的AD7606 8通道同步采集控制方式,總體思路:PWM驅(qū)動AD7606完成模數(shù)轉(zhuǎn)換,AD7606轉(zhuǎn)換完成后其BUSY引腳給出下降沿,STM32捕獲外部中斷并在中斷服務(wù)程序中調(diào)用SPI串口讀取AD7606數(shù)據(jù),工程采用cubemx完成配置,基于HAL庫開發(fā)。
一、AD7606模數(shù)轉(zhuǎn)換芯片
主要用在電力采集、多相電機控制、儀器儀表等數(shù)據(jù)采集場景,提供最大200ksps的16bit八通道同步采集能力,雙極性模擬輸入可達正負10V,具備完整集成的數(shù)據(jù)采集解決方案,包括模擬輸入鉗位、1M歐模擬輸入阻抗、二階抗混疊模擬濾波、片內(nèi)基準源、數(shù)字濾波和和過采樣等。支持8080并口和SPI串口讀取數(shù)據(jù)。
根據(jù)AD7606說明書配置AD7606工作于SPI串口模式,并短接CONVA和CONVB,實現(xiàn)8通道同步轉(zhuǎn)換。
二、控制器和資源分配
主控STM32F407,所需資源如下:
- 一組串口,Usart1串口(PA9 PA10),打印采集數(shù)據(jù)
- 一組SPI,SPI2(MISO PC2 、MOSI PC3、 SCLK PB13),讀取AD7606轉(zhuǎn)換數(shù)據(jù)
- 一個定時器,TIM3(TIM3_CH1 PA6管腳),產(chǎn)生PWM,控制AD7606轉(zhuǎn)換頻率,即采樣率
- 三個GPIO,AD7606Rst(PA1)、AD7606Cs(PA2)、AD7606Irq(PA5)
硬件連線:
- SCLK --------------------------------------RD
- MISO --------------------------------------D7
- AD7606Cs--------------------------------CS
- AD7606Irq--------------------------------BUSY
- AD7606Rst-------------------------------RST
- TIM3_CH1 -------------------------------CONVA
三、cubemx工程配置
3.1 時鐘樹
配置SYSCLK=168MHz,外設(shè)時鐘42MHz
3.2 UART1
串口配置不是本文重點,現(xiàn)省略,參考其他資料。
3.3 GPIO
AD7606Rst(PA1)、AD7606Cs(PA2)配置成輸出模式,AD7606Irq(PA5)配置成外部中斷模式,下降沿觸發(fā),并開啟全局中斷。
3.4?TIM3
配置TIM3為PWM 輸出通道1,輸出98%占空比的脈沖去驅(qū)動AD7606,頻率配置為10kHz,(42MHz/42/100 = 10kHz? = 100us),占空比配置設(shè)置Pulse為98 (98/100 = 98%, 低電平持續(xù)時間2us, 需要大于25ns)和CH Polarity為高電平。根據(jù)AD7606的時序要求,配置占空比即可。
3.5 SPI
選擇全雙工模式,雖然只是用讀功能,但是不影響。關(guān)閉硬件NSS片選信號,配置SPI數(shù)據(jù)位16bit,MSBFirst,波特率一般可以大于10MHz,SPI的模式根據(jù)AD7606手冊應(yīng)該選擇為CPOL=High,CPHA=1Edge。數(shù)據(jù)量不大,一般不需要使用DMA,不需要用中斷。
3.6?生成HAL工程
生成HAL庫的開發(fā)工程,然后編寫AD7606的驅(qū)動和數(shù)據(jù)讀取。
四、AD7606應(yīng)用接口
配置好HAL庫工程后,還不能正確讀取數(shù)據(jù),需要增加AD7606的應(yīng)用層接口,主要包括AD7606的初始化、啟動、停止、復(fù)位和數(shù)據(jù)讀取等。
static void AD7606Reset(void) {/*! ___|-----|________ >= 50ns */AD7606Rst_Low();AD7606Rst_High();for(int i = 20; i > 0; i--){__NOP();//1000/168 ns = 5.85ns}AD7606Rst_Low(); }void AD7606Init(void) {AD7606Cs_High();AD7606Reset(); }void AD7606Start(void) {HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);//啟動AD7606轉(zhuǎn)換 }void AD7606Stop(void) {HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1);//停止AD7606轉(zhuǎn)換AD7606Cs_High(); }void AD7606BusyIrqCallback(uint16_t *ad7606Val,uint8_t ad7606Chl) {AD7606Cs_Low();HAL_SPI_Receive(&hspi2,(uint8_t *)ad7606Val,ad7606Chl,10000);//AD7606中斷中讀取AD7606Cs_High(); }void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//PA5 中斷 {if(GPIO_Pin == AD7606Irq_Pin){//read AD7606if(nums < SAMPLING_POINTS){AD7606BusyIrqCallback(ad7606Buff[nums],SAMPLING_CHANNEL);nums++;ad7606SamplingDoneFlag = 0;}else{ad7606SamplingDoneFlag = 1;}} }五、效果
由于AD7606返回的數(shù)據(jù)是二進制補碼的形式,還需要轉(zhuǎn)換成10進制,編寫了以下接口:
float AD7606ConvValue(uint16_t bin) {int _val;float adcValue;_val = bin&0x8000 ? (-((~bin+1)&0x7fff)) : bin;adcValue = 5.0*_val/32768.0;return adcValue; }上述函數(shù)接口是以AD7606片內(nèi)2.5V基準電壓源為例,設(shè)定的采樣范圍為正負5V,其他基準電壓源和正負10V采樣范圍可以針對修改即可。
最終的采樣結(jié)果如下,可以看到AD7606使用了過采樣技術(shù),干擾很小。
補充一個工程下載倉庫:https://gitee.com/eiri_jackmaster/ad7606_freertos_stm32f407
https://gitee.com/eiri_jackmaster/ad7606_stm32f407/tree/master
總結(jié)
以上是生活随笔為你收集整理的STM32F407控制AD7606 采用HAL库的TIM和SPI的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谷歌网络代理工具_谷歌更新了Dialog
- 下一篇: 友善之臂Mini2440NORflash