首页 > 编程知识 正文

ad9910中文手册,如何记笔记

时间:2023-05-05 11:49:34 阅读:46731 作者:1251

文章目录AD7606接线图AD7606SPI通信接口说明AD7606时序图AD7606时序图说明AD7606 STM32针配置AD7606程序模块出现的问题及总结

为了进行电路训练,需要选择测量速度快、精度高、速度快的外部ADC,所以选择了AD7606。

AD7606是8通道、双极输入、同步采样16位ADC。内置2.5V基准电压AD7606没有内部寄存器,需要直接使用引脚配置ADC的模式,因此AD7606的控制原理也很简单,但占用的I/O端口资源较多。

AD7606接线图AD7606 SPI的串行接口接线图:

AD7606 16位并行接线图:

从这两张图可以看出,除了必须连接的几条控制线之外,不同的是数据线的连接。 用于SPI串行通信的数据总线的数量可以是一条,而并行通信的数据总线的数量是16条。 对于I/O端口非常少的单片机,建议串行通信。 (注意:根据数据手册的需要,将芯片的6针SER连接到高电平,选择芯片以串行模式工作。)

根据AD7606SPI通信接口,AD7606必须使用单5V电源。

AD7606和MCU之间的通信接口级别由VIO引脚控制。 也就是说,VIO必须连接单片机的电源,可以是3.3V,也可以是5V。

OS2 OS1 OS2 :的组合状态选择过采样模式。

000表示无过采样,最高200Ksps的采样率。

0.1倍过采样,也就是说,意味着在硬件内部提取两个样本并进行平均

010倍过采样,这意味着在硬件内部提取4个样本并进行平均

011是指8倍过采样,也就是说,在硬件内部提取8个样本并进行平均

100是16倍过采样,也就是在硬件内部采集16个样本求平均

101是32倍过采样,也就是在硬件内部采集32个样本求平均

10是64倍过采样,也就是说在硬件内部采集64个样本求平均

(注:过采样倍率越高,ADC转换时间越长,得到的最大采样频率越低。 )

CVA、cvb :启动ad转换的控制信号。 CVA决定1-4频道,CVB决定5-8频道。 可以连接CVA和CVB并用同一引脚控制。 (如果要控制转换速率,请在PWM输出的模式中设置管脚以控制转换速率。)

RAGE :量程范围选择。 0表示正负5V,1表示正负10V。

RD : SPI总线时钟信号

RST :复位信号

BUSY :忙碌信号

CS :芯片选择信号

FRST :通道中样本的指示信号(可以不连接) ) ) ) ) ) ) ) )。

VIO :通信接口级别

DB7 :数据总线

DB15:接地

AD7606时序图图1图2

图3

(我个人认为,仅这三张图就可以完全在SPI总线上使用AD7606。)

AD7606的时序图1是整体的时序图,大部分逻辑是在使用AD7606之前复位。 复位信号在高电平时有效,并且时间至少为50ns。 之后,进行采样率和范围的构成,即OS0、OS1、OS2和RANGE引脚的构成,初始化几个引脚(也可以在GPIO构成时直接初始化)。 然后,发送启动信号,即使CVA、CVB最低降低25ns后再提高(启动信号的上升有效)。 然后,AD7606开始转换,BUSY信号线变高,BUSY信号线变低则表示转换完成。 转换完成后,只需拉下CS芯片选择信号线进行数据读取,读取完成后拉起CS芯片选择信号线即可。 (另一种是在转换时进行数据读取,由于对采样率的要求不是特别高,所以没有深入研究)

第二个是通过串行通信读取数据的时间框图,表示AD7606转换完成后,CS芯片选择信号下降后的操作。 转换完成后,CS切片选择信号下降,开始读取数据。 在16位8通道ADC上,为了一次读取一个字节,必须在一个通道上读取两次数据。 高位为高位,低位为低位,因此先读取MSB,后读取LSB。 数据需要SCLK下降沿有效。 16*8=128个SCLK读取后,ADC转换的数据全部读取完毕。 此后,能够提高CS芯片选择信号。 (串行通信FRSTDATA电缆可以不连接,所以不用这条脚)。

图3是1字节的读取。 也就是说,先提高时钟线,再降低时钟线,然后读取并提高当前值。 重复这个8次的话,就是1字节的读取。 (MSB的最高位为符号位,若为1则数据为负数,若为0则数据为正数)

用于配置AD7606 STM32端子的MCU为STM32F103ZET6,系统时钟为72MHz。

RANGE、OS0、OS1、OS2需要选择量程和速率时可以连接到单片机的端子,不需要时可以直接连接到接地或VCC。 RST、RD、CVA、CVB和CS必须设置为输出输出模式。 GPIO等级和模式默认即可。 (我在AD7606初始化时也初始化了IO端口。 )要将连接到DB7数据线的输入引脚置于输入模式,必须在内部设置上拉电阻。 BUSY信号针设置为外部中断、下降沿触发、一定要把中断使能。 (下降沿触发表示ADC转换结束。

AD7606程序模块

程序我也是根据提供的例程进行的修改。

我对所有需要调用的函数都进行了宏定义,以方便在程序中调用

#define OS0_1 HAL_GPIO_WritePin(OS0_GPIO_Port,OS0_Pin,GPIO_PIN_SET);//AD速率控制引脚#define OS0_0 HAL_GPIO_WritePin(OS0_GPIO_Port,OS0_Pin,GPIO_PIN_RESET);#define OS1_1 HAL_GPIO_WritePin(OS1_GPIO_Port,OS1_Pin,GPIO_PIN_SET);#define OS1_0 HAL_GPIO_WritePin(OS1_GPIO_Port,OS1_Pin,GPIO_PIN_RESET);#define OS2_1 HAL_GPIO_WritePin(OS2_GPIO_Port,OS2_Pin,GPIO_PIN_SET);#define OS2_0 HAL_GPIO_WritePin(OS2_GPIO_Port,OS2_Pin,GPIO_PIN_RESET);#define RAGE_1 HAL_GPIO_WritePin(RAGE_GPIO_Port,RAGE_Pin,GPIO_PIN_SET);//量程选择#define RAGE_0 HAL_GPIO_WritePin(RAGE_GPIO_Port,RAGE_Pin,GPIO_PIN_RESET);//0为+-5 1为+-10#define CVB_1 HAL_GPIO_WritePin(CVB_GPIO_Port,CVB_Pin,GPIO_PIN_SET);#define CVB_0 HAL_GPIO_WritePin(CVB_GPIO_Port,CVB_Pin,GPIO_PIN_RESET);#define CVA_1 HAL_GPIO_WritePin(CVA_GPIO_Port,CVA_Pin,GPIO_PIN_SET);//启动AD转换的控制信号#define CVA_0 HAL_GPIO_WritePin(CVA_GPIO_Port,CVA_Pin,GPIO_PIN_RESET);//CVA决定1-4通道 CVB决定5-8通道#define RD_1 HAL_GPIO_WritePin(RD_GPIO_Port,RD_Pin,GPIO_PIN_SET);//时钟线#define RD_0 HAL_GPIO_WritePin(RD_GPIO_Port,RD_Pin,GPIO_PIN_RESET);#define RST_1 HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_SET);//复位信号#define RST_0 HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_RESET);#define CS_1 HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET);//片选信号#define CS_0 HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET);#define More_Rst RST_1;RST_1;RST_1;RST_1;RST_1;RST_1;//持续最少25ns高电平复位信号#define Read_Dat HAL_GPIO_ReadPin(INPUT_GPIO_Port,INPUT_Pin)//读取数据引脚状态

对速度进行选择的函数

void AD7606_SetSpeed(uint8_t mode)//AD7606过采样选择{switch(mode){case 0: OS0_0 OS1_0 OS2_0;case 2: OS0_0 OS1_0 OS2_1;case 4: OS0_0 OS1_1 OS2_0;case 8: OS0_0 OS1_1 OS2_1;case 16: OS0_1 OS1_0 OS2_0;case 32: OS0_1 OS1_0 OS2_1;case 64: OS0_1 OS1_1 OS2_0;default: OS0_0 OS1_0 OS2_0;}}

量程进行选择的函数

void AD7606_SetRange(uint8_t range)//设置量程{if(range == 1){RAGE_1;}else RAGE_0;}

复位信号函数

void AD7606_Reset()//AD7606复位{RST_0;More_Rst;RST_0;}

初始化函数

void AD7606_Init()//AD7606初始化{AD7606_SetRange(0);AD7606_Speed_Set(0);AD7606_Reset();CVA_1;CVB_1;CS_1;AD7606_ReadData();}

起始信号函数

void AD7606_Init()//AD7606初始化{AD7606_SetRange(0);//设置采样量程AD7606_SetSpeed(0);//设置采样速度AD7606_Reset();CVA_1;CVB_1;CS_1;AD7606_ReadData();}

读单个字节函数

uint8_t AD7606_ReadByte(void)//读一个字节{uint8_t usData = 0;uint8_t i; for (i = 0; i < 8; i++){RD_0;AD7606_Delay();usData = usData << 1;if(Read_Dat){usData++;}RD_1;AD7606_Delay();}return usData;}

读八个通道数据函数(BUSY拉低后进中断,进中断后就开始读取数据)

void AD7606_ReadData()//读八个通道的数据{CS_0;for (uint8_t i = 0; i < 8; i++) { adc_now[i] = AD7606_ReadByte();adc_now[i] <<= 8;adc_now[i] = adc_now[i] | AD7606_ReadByte();}CS_1;AD7606_Start();//读取数据结束后立马开始下一次转换}

量程转换和数据处理函数

for(uint8_t i=0;i<8;i++){if(adc_now[i] >> 15 == 1)//判断最高位是否为1{fushu_flag = 1;//负数标志位置1}adc_now[i] &= 0x7fff;//将最高位屏蔽掉s_volt[i] = (adc_now[i] * 5.0) / 32767;//5V量程 将数据转换为电压if(fushu_flag == 1)//对正负数进行判断{fushu_flag = 0;s_volt[i] = -s_volt[i];}} 遇到的问题以及总结

在调试过程中我发现和AGND连接在一起的脚一直都在0XFFFC到0X0001之间浮动,转换成十进制数也就是在0的上下浮动,所以我刚开始一直以为是错误的,所以就一直在对着一个正确的程序找错误,直到后来我接往引脚上接了一个3.3V的电压,它返回回来的数据不再是这个范围内的值,并经过换算是一个正确的电压值。后来才知道这个浮动是正常的,是AGND和采样时有的一点干扰使他有一些小范围的浮动,对于ADC来说这些都是正常的。

在测量过程中,由于AD7606的模拟电压参考点是2.5V,所以我输入3.3V的电压经过换算后得到的电压值为0.8V,所以这个需要双极性输入测电压,也就是一个通道接地,另一个通道测待测点电压,之后待测点电压就是被测电压值与地的被测电压值之间的差值,也称伪差分输入,双极性输入。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。