|
出廠的AD7606模塊缺省是8080 并行接口。
如果用SPI接口模式,需要修改 R1 R2電阻配置。
并口模式跳線: R1 懸空(不貼),R2貼10K電阻
SPI接口模式跳線:R1 貼10K電阻, R2 懸空(不貼)
AD7606 的配置很簡單,它沒有內(nèi)部寄存器。量程范圍和過采樣參數(shù)是通過外部IO控制的。
采樣速率由MCU或DSP提供的脈沖頻率控制。
AD7606 必須使用單5V供電。
AD7606 和MCU之間的通信接口電平由VIO引腳控制。也就是說 VIO必須接單片機的電源,可以是3.3V也可以是5V。
【模塊引腳說明】
OS2 OS1 OS2 : 的組合狀態(tài)選擇過采樣模式。
000表示無過采樣,最大200Ksps采樣速率。
001表示2倍過采樣, 也就是硬件內(nèi)部采集2個樣本求平均
010表示4倍過采樣, 也就是硬件內(nèi)部采集4個樣本求平均
011表示8倍過采樣, 也就是硬件內(nèi)部采集8個樣本求平均
100表示16倍過采樣, 也就是硬件內(nèi)部采集16個樣本求平均
101表示32倍過采樣, 也就是硬件內(nèi)部采集32個樣本求平均
110表示64倍過采樣, 也就是硬件內(nèi)部采集64個樣本求平均
過采樣倍率越高,ADC轉(zhuǎn)換時間越長,可得到的最大采樣頻率就越低。
CVA,CVB : 啟動AD轉(zhuǎn)換的控制信號。CVA決定1-4通道,CVB決定5-8通道。
2個信號可以錯開短暫的時間。一般情況可以將CVA,CVB并聯(lián)在一起。
RAGE : 量程范圍選擇。0表示正負5V, 1表示正負10V.
RD : 讀信號
RST : 復位信號
BUSY : 忙信號
CS : 片選信號
FRST : 第1個通道樣本的指示信號
VIO : 通信接口電平
DB0-DB15 : 數(shù)據(jù)總線
【16位并行模式接線圖】 --- AD7606也支持8位總線模式,請參見AD7606數(shù)據(jù)手冊
AD7606模塊 MCU側(cè)
GND <----- 地
+5V <----- 5V電源
RAGE <----- 可接GPIO也可接固定電平
OS2 <----- 可接GPIO也可接固定電平
OS1 <----- 可接GPIO也可接固定電平
OS0 <----- 可接GPIO也可接固定電平
CVA <----- 接GPIO(輸出)用于啟動AD轉(zhuǎn)換 【推薦接具有PWM輸出能力的引腳】
CVB <---|
RD <----- 8080總線讀信號 NOE
RST <----- GPIO輸出 硬件復位AD606
BUSY -----> GPIO輸入 AD606正在轉(zhuǎn)換指示。【推薦接具有外部中斷能力的引腳】
CS <----- 8080總線片選 NCS
VIO <----- 單片機的電源
DB0-DB15 -----> 8080數(shù)據(jù)總線(16位)
FRST 可不接
【SPI接口模式接線圖】
AD7606模塊 MCU側(cè)
GND <----- 地
+5V <----- 5V電源
RAGE <----- 任意輸出GPIO,可接固定電平
OS2 <----- 任意輸出GPIO,可接固定電平
OS1 <----- 任意輸出GPIO,可接固定電平
OS0 <----- 任意輸出GPIO, 可接固定電平
CVA <----- 接GPIO(輸出)用于啟動AD轉(zhuǎn)換 【推薦接具有PWM輸出能力的引腳】
CVB <---|
RD/SCLK <----- SPI總線時鐘 SCK
RST <----- 任意輸出GPIO, 用于硬件復位AD606
BUSY -----> GPIO輸入, AD606正在轉(zhuǎn)換指示。【推薦接具有外部中斷能力的引腳】
CS <----- SPI總線片選 SCS
VIO <----- 單片機電源
DB7(DOUTA) -----> SPI總線數(shù)據(jù)線MISO
DB15 ------ GND
其他數(shù)據(jù)線: 可不接或接GND
FRST 可不接
【軟件定時采集的實現(xiàn)方案1】 --- 我們提供的 spi 的例子采用這種方案 見 bsp_spi_ad7606.c 文件
在定時器中斷服務程序中實現(xiàn):
定時器中斷ISR:
{
中斷入口;
讀取8個通道的采樣結果保存到RAM; ----> 讀取的其實是上次的采集結果,對于連續(xù)采集來說,是沒有關系的
啟動下次ADC采集;(翻轉(zhuǎn)CVA和CVB)
中斷返回;
}
定時器的頻率就是ADC采樣頻率。這種模式可以不連接 BUSY 口線。
【軟件定時采集的實現(xiàn)方案2】 --- 我們提供的 8080接口例子采用這種方案 見 bsp_ad7606.c 文件
配置CVA CVB 引腳為PWM輸出模式,周期設置為需要的采樣頻率; ---> 之后MCU將產(chǎn)生周期非常穩(wěn)定的AD轉(zhuǎn)換信號
將BUSY口線設置為中斷下降沿觸發(fā)模式;
外部中斷ISR
{
中斷入口;
讀取8個通道的采樣結果保存到RAM;
中斷返回;
}
【軟件定時采集的實現(xiàn)方案1和方案2的差異】
(1)方案1 可以少用 BUSY口線, 但是其他中斷服務程序或者主程序臨時關閉全局中斷時,可能導致ADC轉(zhuǎn)換周期存在輕微抖動。
(2)方案2 可以確保采集時鐘的穩(wěn)定性,因為它是MCU硬件產(chǎn)生的。但是需要多接一根 BUSY口線。
單片機源程序如下:
- #include "stm32f10x.h"
- #include <stdio.h>
- #include "bsp.h"
- #include "bsp_spi_ad7606.h"
- #include "bsp_timer.h"
- FIFO_T g_tAD; /* 定義一個交換緩沖區(qū),用于存儲AD采集數(shù)據(jù),并用于寫入SD卡 */
- void bsp_TIM4_Configuration(void);
- /*
- *********************************************************************************************************
- * 函 數(shù) 名: bsp_InitAD7606
- * 功能說明: 初始化AD7606 SPI口線
- * 形 參:無
- * 返 回 值: 無
- *********************************************************************************************************
- */
- void bsp_InitAD7606(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- SPI_InitTypeDef SPI_InitStructure;
-
- /* AD_SPI_CS_GPIO, AD_SPI_MOSI_GPIO, AD_SPI_MISO_GPIO, AD_SPI_DETECT_GPIO
- and AD_SPI_SCK_GPIO Periph clock enable */
- RCC_APB2PeriphClockCmd(AD_CS_GPIO_CLK | AD_SPI_MISO_GPIO_CLK | AD_SPI_SCK_GPIO_CLK
- , ENABLE);
-
- /* AD_SPI Periph clock enable */
- RCC_APB1PeriphClockCmd(AD_SPI_CLK, ENABLE);
-
- /* Configure AD_SPI pins: SCK */
- GPIO_InitStructure.GPIO_Pin = AD_SPI_SCK_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(AD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
-
- /* Configure AD_SPI pins: MISO */
- GPIO_InitStructure.GPIO_Pin = AD_SPI_MISO_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(AD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = AD_CS_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(AD_CS_GPIO_PORT, &GPIO_InitStructure);
-
- /* AD_SPI Config */
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
- //SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Rx;
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
- SPI_InitStructure.SPI_CRCPolynomial = 7;
- SPI_Init(AD_SPI, &SPI_InitStructure);
-
- SPI_Cmd(AD_SPI, ENABLE); /* AD_SPI enable */
-
- /* 配置其它的GPIO */
- /* 使能GPIO時鐘 */
- RCC_APB2PeriphClockCmd(AD_RESET_GPIO_CLK | AD_CONVST_GPIO_CLK | AD_OS0_GPIO_CLK
- | AD_OS1_GPIO_CLK | AD_OS2_GPIO_CLK, ENABLE);
- /* 配置RESET GPIO */
- GPIO_InitStructure.GPIO_Pin = AD_RESET_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(AD_RESET_GPIO_PORT, &GPIO_InitStructure);
-
- /* 配置CONVST GPIO */
- GPIO_InitStructure.GPIO_Pin = AD_CONVST_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(AD_CONVST_GPIO_PORT, &GPIO_InitStructure);
- /* 配置OS0-2 GPIO */
- GPIO_InitStructure.GPIO_Pin = AD_OS0_PIN;
- GPIO_Init(AD_OS0_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = AD_OS1_PIN;
- GPIO_Init(AD_OS1_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = AD_OS2_PIN;
- GPIO_Init(AD_OS2_GPIO_PORT, &GPIO_InitStructure);
- /* 設置過采樣模式 */
- ad7606_SetOS(0);
- /* 設置GPIO的初始狀態(tài) */
- ad7606_Reset(); /* 硬件復位復AD7606 */
-
- AD_CONVST_HIGH(); /* CONVST腳設置為高電平 */
- bsp_TIM4_Configuration(); /* 配置TIM2定時中斷 */
- }
- /*
- *********************************************************************************************************
- * 函 數(shù) 名: ad7606_Reset
- * 功能說明: 硬件復位AD7606
- * 形 參:無
- * 返 回 值: 無
- *********************************************************************************************************
- */
- void ad7606_Reset(void)
- {
- /* AD7606是高電平復位,要求最小脈寬50ns */
-
- AD_RESET_LOW();
-
- AD_RESET_HIGH();
- AD_RESET_HIGH();
- AD_RESET_HIGH();
- AD_RESET_HIGH();
-
- AD_RESET_LOW();
- }
- /*
- *********************************************************************************************************
- * 函 數(shù) 名: ad7606_SetOS
- * 功能說明: 設置過采樣模式(數(shù)字濾波,硬件求平均值)
- * 形 參:_ucMode : 0-6 0表示無過采樣,1表示2倍,2表示4倍,3表示8倍,4表示16倍
- * 5表示32倍,6表示64倍
- * 返 回 值: 無
- *********************************************************************************************************
- */
- void ad7606_SetOS(uint8_t _ucMode)
- {
- if (_ucMode == 1)
- {
- AD_OS2_0();
- AD_OS1_0();
- AD_OS0_1();
- }
- else if (_ucMode == 2)
- {
- AD_OS2_0();
- AD_OS1_1();
- AD_OS0_0();
- }
- else if (_ucMode == 3)
- {
- AD_OS2_0();
- AD_OS1_1();
- AD_OS0_1();
- }
- else if (_ucMode == 4)
- {
- AD_OS2_1();
- AD_OS1_0();
- AD_OS0_0();
- }
- else if (_ucMode == 5)
- {
- AD_OS2_1();
- AD_OS1_0();
- AD_OS0_1();
- }
- else if (_ucMode == 6)
- {
- AD_OS2_1();
- AD_OS1_1();
- AD_OS0_0();
- }
- else /* 按0處理 */
- {
- AD_OS2_0();
- AD_OS1_0();
- AD_OS0_0();
- }
- }
- /*
- *********************************************************************************************************
- * 函 數(shù) 名: ad7606_StartConv
- * 功能說明: 啟動AD7606的ADC轉(zhuǎn)換
- * 形 參:無
- * 返 回 值: 無
- *********************************************************************************************************
- */
- void ad7606_StartConv(void)
- {
- /* 上升沿開始轉(zhuǎn)換,低電平持續(xù)時間至少25ns */
- AD_CONVST_LOW();
- AD_CONVST_LOW();
- AD_CONVST_LOW(); /* 連續(xù)執(zhí)行2次,低電平約50ns */
-
- AD_CONVST_HIGH();
- }
- /*
- *********************************************************************************************************
- * 函 數(shù) 名: bsp_TIM4_Configuration
- * 功能說明: 配置TIM4定時器
- * 形 參:無
- * 返 回 值: 無
- *********************************************************************************************************
- */
- void bsp_TIM4_Configuration(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
-
- /* TIM2 clock enable */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
- /* Configure the NVIC Preemption Priority Bits[配置優(yōu)先級組] */
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
- /* Enable the TIM2 gloabal Interrupt [允許TIM2全局中斷]*/
- NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
-
- /*
- *********************************************************************************************************
- * 函 數(shù) 名: bsp_SET_TIM4_FREQ
- * 功能說明: 設置TIM4定時器頻率
- * 形 參:_ulFreq : 采樣頻率,單位Hz,
- * 返 回 值: 無
- *********************************************************************************************************
- */
- void bsp_SET_TIM4_FREQ(uint32_t _ulFreq)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- uint16_t usPrescaler;
- uint16_t usPeriod;
- TIM_DeInit(TIM4); /* 復位TIM2定時器 */
- /* TIM2 configuration
- TIM2CLK = 36 MHz
- */
- if (_ulFreq == 0)
- {
- return; /* 采樣頻率為0,停止采樣 */
- }
- else if (_ulFreq <= 100) /* 采樣頻率小于100Hz */
- {
- usPrescaler = 36000; /* TM2CLK = 72 000 000/36000 = 2000 */
- usPeriod = 2000 / _ulFreq;
- }
- else if (_ulFreq <= 200000) /* 采樣頻率 :100Hz - 200kHz */
- {
- usPrescaler = 36 - 1; /* TM2CLK = 36 000 000/36 = 2 000 000 */
- usPeriod = 2000000 / _ulFreq;
- }
- else /* 采樣頻率大于 200kHz */
- {
- return;
- }
-
- TIM_TimeBaseStructure.TIM_Period = usPeriod - 1; /* 計數(shù)周期 */
- TIM_TimeBaseStructure.TIM_Prescaler = usPrescaler; /* 分頻系數(shù) */
- TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; /* */
- TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //計數(shù)方向向上計數(shù)
- TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
- /* Clear TIM2 update pending flag[清除TIM2溢出中斷標志] */
- TIM_ClearFlag(TIM4, TIM_FLAG_Update);
- TIM_SetCounter(TIM4, 0);
- /* Enable TIM2 Update interrupt [TIM2溢出中斷允許]*/
- TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
- /* TIM2 enable counter [允許tim2計數(shù)]*/
- TIM_Cmd(TIM4, ENABLE);
- }
- /*
- *********************************************************************************************************
- * 函 數(shù) 名: ad7606_ReadBytes
- * 功能說明: 讀取AD7606的采樣結果
- * 形 參:
- * 返 回 值: 無
- *********************************************************************************************************
- */
- uint16_t ad7606_ReadBytes(void)
- {
- uint16_t usData = 0;
-
- /* Wait until the transmit buffer is empty */
- while (SPI_I2S_GetFlagStatus(AD_SPI, SPI_I2S_FLAG_TXE) == RESET)
- {
- }
-
- /* Send the byte */
- SPI_I2S_SendData(AD_SPI, 0xFFFF);
- /* Wait until a data is received */
- while (SPI_I2S_GetFlagStatus(AD_SPI, SPI_I2S_FLAG_RXNE) == RESET)
- {
- }
-
- /* Get the received data */
- usData = SPI_I2S_ReceiveData(AD_SPI);
- /* Return the shifted data */
- return usData;
- }
- /*
- *********************************************************************************************************
- * 函 數(shù) 名: ad7606_IRQSrc
- * 功能說明: 定時調(diào)用本函數(shù),用于讀取AD轉(zhuǎn)換器數(shù)據(jù)
- * 形 參:無
- * 返 回 值: 無
- *********************************************************************************************************
- */
- void ad7606_IRQSrc(void)
- {
- uint8_t i;
- uint16_t usReadValue;
- TIM_ClearFlag(TIM4, TIM_FLAG_Update);
- /* 讀取數(shù)據(jù)
- 示波器監(jiān)測,CS低電平持續(xù)時間 35us
- */
- AD_CS_LOW();
- for (i = 0; i < CH_NUM; i++)
- {
- usReadValue = ad7606_ReadBytes();
- if (g_tAD.usWrite < FIFO_SIZE)
- {
- g_tAD.usBuf[g_tAD.usWrite] = usReadValue;
- ++g_tAD.usWrite;
- }
- }
-
- AD_CS_HIGH();
- ad7606_StartConv();
- }
- /*
- *********************************************************************************************************
- * 函 數(shù) 名: GetAdcFormFifo
- * 功能說明: 從FIFO中讀取一個ADC值
- * 形 參:_usReadAdc : 存放ADC結果的變量指針
- * 返 回 值: 1 表示OK,0表示暫無數(shù)據(jù)
- *********************************************************************************************************
- */
- uint8_t GetAdcFormFifo(uint16_t *_usReadAdc)
- {
- uint16_t usWrite;
-
- DISABLE_INT();
- usWrite = g_tAD.usWrite;
- ENABLE_INT();
-
- if (usWrite != g_tAD.usRead)
- {
- *_usReadAdc = g_tAD.usBuf[g_tAD.usRead];
- DISABLE_INT();
- if (++g_tAD.usRead >= FIFO_SIZE)
- {
- g_tAD.usRead = 0;
- }
- ENABLE_INT();
- return 1;
- }
- return 0;
- }
- /*
- *********************************************************************************************************
- * 函 數(shù) 名: ad7606_StartRecord
- * 功能說明: 開始采集
- * 形 參:_ulFreq : 采樣頻率, 單位 HZ
- * 返 回 值: 無
- *********************************************************************************************************
- */
- void ad7606_StartRecord(uint32_t _ulFreq)
- {
- //ad7606_Reset(); /* 復位硬件 */
- ad7606_StartConv(); /* 啟動采樣,避免第1組數(shù)據(jù)全0的問題 */
- g_tAD.usRead = 0; /* 必須在開啟TIM2之前清0 */
- g_tAD.usWrite = 0;
- bsp_TIM4_Configuration(); /* 配置TIM2定時中斷 */
- bsp_SET_TIM4_FREQ(_ulFreq); /* 設置采樣頻率, 并使能TIM2定時采樣中斷 */
- }
- /*
- *********************************************************************************************************
- * 函 數(shù) 名: ad7606_StopRecord
- * 功能說明: 停止采集
- * 形 參:無
- * 返 回 值: 無
- *********************************************************************************************************
- */
- void ad7606_StopRecord(void)
- {
- /* TIM2 enable counter [允許tim2計數(shù)]*/
- TIM_Cmd(TIM4, DISABLE);
- }
- void TIM4_IRQHandler(void)
- {
- ad7606_IRQSrc();
- }
復制代碼 全部資料51hei下載地址:
AD7606數(shù)據(jù)采集模塊資料(2015-01-22).7z
(3.99 MB, 下載次數(shù): 35)
2022-1-6 04:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|