AD7606是一款采样率最高200ksps、8通道、16位AD芯片,可使用8080并口、按字节并口、SPI串行等方式读取AD转换的原始数据。
实验时使用的是安富莱的AD7606模块。
各引脚的作用:
OS2/OS1/OS2 : 组合状态选择过采样模式。
000表示无过采样,最大200Ksps采样速率。过采样倍率越高,ADC转换时间越长,可得到的最大采样频率就越低。
CVA,CVB (输入): 启动AD转换的控制信号。CVA决定1-4通道,CVB决定5-8通道,此实验中使STM32的某个引脚输出频率为200kHz,占空比为50%的PWM,启动AD转换。
RAGE(输入) : 量程范围选择。0表示正负5V, 1表示正负10V.
RD (输入): 读信号,控制RD以控制数据在8080并口输出。RD输入一个下降沿,就在8080并口输出下一个通道的数据。
RST (输入): 复位信号,在上电后都要复位,高电平复位。
BUSY (输出): 忙信号,当CVA,CVB的信号启动AD转换,BUSY变为高,当转换完成后BUSY变为低,随后可通过控制RD将本次转换结果数据输出在8080并口。
CS (输入): 片选信号,低电平有效,只使用单片AD7606的话可一直保持低电平。
FRST(输出) : 第1个通道样本的指示信号,不使用
VIO : 通信接口电平,一般单片机IO电平都为3.3V
DB0-DB15 : 8080数据总线。
总结一下整个数据采集过程:
STM32的CONVST输出频率为200kHz的PWM,当产生上升沿时,AD7606采样保持器保持8个通道的电平,进行AD转换,同时BUSY信号变为高电平,当AD转换完成时,BUSY信号从高电平变为低电平,之后我们就可以开始获取数据了,先在RD产生一个下降沿,DB0~DB15输出通道1的数据,再在RD产生一个下降沿,DB0~DB15输出通道2的数据,以此类推,直至8个通道数据依次输出,从而完成8个通道数据的采集。
在实验中测试发现:8个通道的原始数据通过STM32的FSMC采集耗时大约0.61us,而AD芯片完成8个通道的转换耗时大约4us(手册上的数据),所以我们可以在每次转换开始时(BUSY信号上升沿后)进行数据采集,这样我们每次采集的数据都是上次转换的结果。当我们数据采集完成后,AD芯片的本次转换还未完成,所以不会对数据产生影响(搜索手册中 CONVST时序—转换期间读取)。
本次实验中将AD7606配置为无过采样,通过BUSY触发STM32F407ZG的外部中断引脚,在中断回调函数中,使用STM32的FSMC通过8080并口读取8个通道的采样数据。
由于我们对AD7606只进行读操作,与在FSMC的应用中控制ROM(只读)的情况比较接近。
从时序图上看也比较类似:
所以我们直接将NOE连接至AD7606的RD。
NEx可连接至AD7606的CS,但此次实验中只用了一片AD芯片,所以我们直接使AD7606的CS保持低电平。
NWE是写操作信号,不需要。
D[15:0]连接至DB0~DB15。
要使我们能够顺利读取AD7606的数据,还需设置ADDSET、DATAST这两个值设置NOE的高低电平宽度。
在AD7606的手册中要求RD高电平脉冲最短宽度为15ns,低电平最短宽度为21ns(当VIO为3.3V时)。
在时钟数中可以看到HCLK频率为168MHz,即HCLK周期约为5.95ns,所以我们将ADDSET设置为3(大于15ns),DATAST设置为4(大于21ns)。
所以我们在STM32CubeMX中,配置FSMC:
到此为止,STM32CubeMX中的FSMC部分配置都完成了,点击生成代码。
在fsmc.c中:
可以看到AddressSetupTime被设置为了3,DataSetupTime被设置为了4,剩下的4个值都是默认值,在我们设置的FSMC模式下是没有影响的(详情在STM32F4XX中文参考手册的表198),但是以防万一把这4个值都改成了0。
初步实验FSMC
①设置OS0、OS1、OS2、RANGE
②RESET下降沿复位AD7606
③CS设置为低电平
④在CONVSTA、CONVSTB输入一个下降沿,使AD7606开始AD转换
⑤延时一段时间,使用FSMC读取:
具体为什么是0x6C000000我也不知道= =。
/* AD7606 FSMC总线地址,只能读,无需写 */
#define AD7606_RESULT() *(__IO uint16_t *)0x6C000000
int16_t RawData[8];
RawData[0]=AD7606_RESULT();
RawData[1]=AD7606_RESULT();
RawData[2]=AD7606_RESULT();
RawData[3]=AD7606_RESULT();
RawData[4]=AD7606_RESULT();
RawData[5]=AD7606_RESULT();
RawData[6]=AD7606_RESULT();
RawData[7]=AD7606_RESULT();
此时一切顺利的话已经可以读取到原始数据了。
为了使采样率达到200ksps,我们在PC6输出一个频率为200kHz的PWM方波,将PC8连接至AD7606的CONVSTA、CONVSTB。
将PG8设置为外部中断触发模式
在main.c中 重定义HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)外部中断回调函数。
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//if(GPIO_Pin == BUSY_Pin)
{
RawData[0]=AD7606_RESULT();
RawData[1]=AD7606_RESULT();
RawData[2]=AD7606_RESULT();
RawData[3]=AD7606_RESULT();
RawData[4]=AD7606_RESULT();
RawData[5]=AD7606_RESULT();
RawData[6]=AD7606_RESULT();
RawData[7]=AD7606_RESULT();
}
}
/* USER CODE END 4 */
了解了8080并口的读取方式,了解了FSMC的应用流程,大致了解了AD7606的工作原理。