购买的AD7606模块 在淘宝上面购买的这款产品,让店家设置的是串行(SPI)、模拟梁输入范围是正负10V。 板子背面的焊盘选择
1、原理图 原理图参考安富莱的AD7606的 2.管脚的定义 2.1OS2,OS1,OS0 数据手册上面定义了这三个引脚的功能 这三个管脚组合控制过采样模式。
000 表示无过采样,最大 200Ksps 采样速率。 001 表示 2 倍过采样, 芯片内部转换需要采集 2 个样本求平均。 010 表示 4 倍过采样,芯片内部转换采集 4 个样本求平均。 011 表示 8 倍过采样, 芯片内部转换采集 8 个样本求平均。 100 表示 16 倍过采样, 芯片内部转换采集 16 个样本求平均。 101 表示 32 倍过采样, 芯片内部转换采集 32 个样本求平均。 110 表示 64 倍过采样, 芯片内部转换采集 64 个样本求平均。
过采样率越高,ADC转换的时间就越长,得到的采样频率就越低,对一些需要快速转换的场合不太适应。根据项目需要来进行选择采样率,这次项目默认000,即不过采样率。 2.2 CONVSTA/B 这两个引脚是选择模拟输入通道的,要对八路所有通道进行模拟输入转换,那就将这两个引脚短接在一起,并通过一个MCU引脚来控制,施加一个转换信号。其他的模拟输入转换可以分别控制STA或者STB来达到效果。 2.3 RANGE 模拟输入范围选择引脚,低电平选择范围是正负5V,高电平选择范围是正负10V。 2.4 ADRD : 芯片的读信号引脚。要是选择的是并行接口驱动,那这个引脚功能就是读取控制输入(RD),要是选择串行接口,即SPI通信,则作为时钟输入(SCLK)。在并行模式下,如果CS和RD均处于逻辑低电平,则会启用输出总线。在串行模式下,此引脚用作数据传输的串行时钟输入。CS下降沿使数据输出线路DourA和DouB脱离三态,并逐个输出转换结果的MSB。SCLK上升沿将随后的所有数据位逐个送至串行数据输出DouA和DouB。 2.5 ADRESET: 复位信号。当设置为逻辑高电平时,RESET上升沿复位AD7606/AD7606-6/AD7606-4。器件应该在上电后收到一个RESET脉冲。RESET高脉冲宽度典型值为50ns。如果在转换期间施加RESET脉冲,转换将中断。如果在读取期间施加RESET脉冲,输出寄存器的内容将复位至全0。 2.6 ADBUSY : 忙信号。CONVST A和CONVST B均达到上升沿之后,此引脚变为逻辑高电平,表示转换过程已开始。BUSY输出保持高电平,直到所有通道的转换过程完成为止。BUSY下降沿表示转换数据正被锁存至输出数据寄存器,经过时间t,之后便可供读取。在BUSY为 高电平时执行的数据读取操作应当在BUSY下降沿之前完成。当BUSY信号为高电平时,CONVST A或CONVST B的上升沿不起作用。
2.7 ADCS : 片选信号。此低电平有效逻辑输入使能数据帧传输。在并行模式下,如果CS和RD均处于逻辑低电平,则会使能输出总线DB[15:0],使转换结果输出在并行数据总线上。在串行模式下,利用Cs使能串行数据帧传输,并逐个输出串行输出数据的最高有效位(MSB)。 2.8 FRSTDATA 数字输出。FRSTDATA输出信号指示何时在并行、字节或串行接口上回读第-通道V1。当CS输入为高电平时,FRSTDATA输 出引脚处于三态。CS下降沿使FRSTDATA脱离三态。在并行模式下,与V1结果相对应的RD下降沿随后将FRSTDATA引脚设为高电平,表示输出数据总线可以提供V1的结果。在RD的下一个下降沿之后,FRSTDATA输出恢复逻辑低电平。在串行模式下,FRSTDATA在CS下降沿变为高.电平,因为此时将在DourA上输出V1的MSB。在CS 下降沿之后的第16个SCLK下降沿,它恢复低电平。 2.9 DB0-DB15 数据总线。
并行输出数据位DB6至DB0:
当PAR/SER/BYTE SEL = 0时,这些引脚充当三态并行数字输入/输出引脚。当PARCS和RD均处于低电平时,这些引脚用来输出转换结果的DB6至DB0。当PAR/SER/BYTE SEL = 1时,这些引脚应与AGND相连。当工作在并行字节接口模式时,DB[7:0]通 过2个RD操作输出16位转换结果。DB7(引脚24)为MSB,DB0为LSB。逻辑电源输入。此引脚的电源电压(2.3 V至5.25 V)决定逻辑接口的工作电压。此引脚的标称电源与主机接口电源相同。
并行输出数据位7(DB7)/串行接口数据输出引脚(DouA): 当PAR/SER/BYTE SEL = 0时,此引脚充当三态并行数字输入/输出引脚。当CS和RD均处于低电平时,此引脚用来输出转换结果的DB7。当PAR/SER/BYTE SEL= 1时,此引脚用作DouA,并输出串行转换数据,当工作在并行字节模式时,DB7为该字节的MSB。 并行输出数据位8(DB8)/串行接口数据输出引脚DO_B):
当PAR/SER/BYTESEL= 0时,此引脚充当三态并行数字输入/输出引脚。当CS和RD均处于低电平时,此引脚用来输出转换结果的DB8。当PAR/SER/BYTE SEL= 1时,此引脚用作Dou B,并输出串行转换数据。
并行输出数据位DB13至DB9:
当PAR/SER/BYTESEL= 0时,这些引脚充当三态并行数字输入/输出引脚。当CS和RD均处于低电平时,这些引脚用来输出转换结果的DB13至DB9。当PAR/SER/BYTESEL= 1时,这些引脚应与AGND相连。
并行输出数据位14 (DB14)/高字节使能(HBEN): 当PAR/SER/BYTE SEL = 0时,此引脚充当三态并行数字输出引脚。当CS和RD均处于低电平时,此引脚用来输出转换结果的DB14。当PAR/SER/BYTE SEL = 1且DB15/BYTESEL = 1时,AD7606/ AD7606-6/AD7606-4.工作在并行字节接口模式。在并行字节模式下,HBEN引脚用来选择是首先输出转换结果的高字节(MSB)还是低字节(LSB)。当HBEN= 1时,首先输出MSB,然后输出LSB。当HBEN= 0时,首先输出LSB,然后输出MSB。
并行输出数据位15(DB15)/并行字节模式选择(BYTESEL):
当PAR/SER/BYTE SEL = 0时,此引脚充当三态并行数字输出引脚。当CS和RD均处于低电平时,此引脚用来输出转换结果的DB15。当PAR/SER/BYTESEL= 1时,BYTE SEL引脚用来在串行接口模式与并行字节接口模式之间做出选择。当PAR/SER/BYTE SEL = 1且DB15/BYTE SEL = 0时,AD7606工作在串行接口模式。当PAR/SER/BYTE SEL = 1且DB15/BYTE SEL= 1时,AD7606工作在并行字节接口模式。 3. 时序图 3.1 转换时序 t5:
CONVST A 和 CONVST B 上升沿之间最大允许的延迟时间。一般是用一根控制线同时控制CONVST A 和 CONVST B,因此可以不用管这个时间。
t3 :
最短的 CONVST A/B 电平脉冲,最小值 25ns。
t4 :
BUSY 下降沿到 CS 下降沿设置时间,最小值 0ns,所以可以忽略。
tCYCLE: 并行模式,无过采样,转换后并读取数据的最大值是 5us,即最高支持的时钟速度是 20MHz 及其以上。
tCONV :
转换时间。
3.2 驱动时序 t8 :
CS 到 RD 的设置时间,最小值是 0ns,可以忽略。
t10 :
RD 读信号的低电平脉冲宽度,通信电压不同,时间不同。对于 STM32 来说,FMC 通信电平一般是3.3V,即最小值 21ns。
t11 :
RD 高电平脉冲宽度,最小值 15ns。
t9 :
CS 到 RD 保持时间,最小值 0ns,可以忽略。 4.配置过程 4.1 IO配置
void bsp_spi_InitAD7606(void)
{
AD7606_ConfigGPIO();
#ifdef HARD_SPI
AD7606_CfgSpiHard();
#endif
AD7606_RESET();
AD7606_CONVST_H;
}
static void AD7606_ConfigGPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_CS | RCC_RANGE | RCC_BUSY | RCC_RESET | RCC_CONVST, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Pin = PIN_RESET;
GPIO_Init(PORT_RESET, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = PIN_CONVST;
GPIO_Init(PORT_CONVST, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = PIN_RANGE;
GPIO_Init(PORT_RANGE, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = PIN_CS;
GPIO_Init(PORT_CS, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = PIN_BUSY;
GPIO_Init(PORT_BUSY, &GPIO_InitStructure);
}
配置SPI
void bsp_InitSPIBus(void)
{
#ifdef SOFT_SPI
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_SCK | RCC_MOSI | RCC_MISO, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_InitStructure.GPIO_Pin = PIN_SCK;
GPIO_Init(PORT_SCK, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = PIN_MOSI;
GPIO_Init(PORT_MOSI, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
GPIO_InitStructure.GPIO_Pin = PIN_MISO;
GPIO_Init(PORT_MISO, &GPIO_InitStructure);
#endif
}
uint8_t bsp_spiRead1(void)
{
#ifdef SOFT_SPI
uint8_t i;
uint8_t read = 0;
for (i = 0; i < 8; i++)
{
SCK_0();
bsp_spiDelay();
read = read << 1;
if (MISO_IS_HIGH())
{
read++;
}
SCK_1();
bsp_spiDelay();
}
return read;
#endif
}
4.3 过采样配置 过采样配置可以硬件上引脚全部接地,或者接MCU的引脚进行控制
void AD7606_SETOS(uint8_t osv)
{
switch(osv)
{
case 0:
AD7606OS0_L;
AD7606OS1_L;
AD7606OS2_L;
break;
case 1:
AD7606OS0_H;
AD7606OS1_L;
AD7606OS2_L;
break;
case 2:
AD7606OS0_L;
AD7606OS1_H;
AD7606OS2_L;
break;
case 3:
AD7606OS0_H;
AD7606OS1_H;
AD7606OS2_L;
break;
case 4:
AD7606OS0_L;
AD7606OS1_L;
AD7606OS2_H;
break;
case 5:
AD7606OS0_H;
AD7606OS1_L;
AD7606OS2_H;
break;
case 6:
AD7606OS0_L;
AD7606OS1_H;
AD7606OS2_H;
break;
}
}
4.4 复位函数
void AD7606_RESET(void)
{
AD7606_CS_H;
AD7606_RESET_L;
AD7606_RESET_H;
AD7606_RESET_H;
AD7606_RESET_H;
AD7606_RESET_H;
AD7606_RESET_L;
}
4.5 开启转换
void AD7606_STARTCONV(void)
{
AD7606_CONVST_L;
AD7606_CONVST_L;
AD7606_CONVST_L;
AD7606_CONVST_H;
}
4.7 读取AD转换器数据
void AD7606_Scan(void)
{
uint8_t i;
if (BUSY_IS_LOW())
{
AD7606_CS_L;
for (i = 0; i < 8; i++)
{
s_adc_now[i] = bsp_spiRead1();
s_adc_now[i] = s_adc_now[i] * 256 + bsp_spiRead1();
}
AD7606_CS_H;
AD7606_STARTCONV();
}
}
4.7 处理采样后的数据
void AD7606_Mak(void)
{
uint8_t i;
int16_t adc;
for (i = 0;i < 8; i++)
{
s_dat[i] = AD7606_ReadAdc(i);
adc = s_dat[i];
s_volt[i] = (adc * 10000) / 32767;
}
}
4.8 显示采样后的数据
void AD7606_Disp(void)
{
int16_t i;
int16_t iTemp;
for (i = 0; i < 8; i++)
{
iTemp = s_volt[i];
if (s_dat[i] < 0)
{
iTemp = -iTemp;
printf(" CH%d = %6d,0x%04X (-%d.%d%d%d V) \r\n", i+1, s_dat[i], (uint16_t)s_dat[i], iTemp /1000, (iTemp%1000)/100, (iTemp%100)/10,iTemp%10);
}
else
{
printf(" CH%d = %6d,0x%04X ( %d.%d%d%d V) \r\n", i+1, s_dat[i], s_dat[i] , iTemp /1000, (iTemp%1000)/100, (iTemp%100)/10,iTemp%10);
}
}
}
4.9 测试结果
|