分享

STM32CubeMX AD7606 FSMC 使用FSMC完成对8080并口的数据读取

 goodwangLib 2019-12-30

AD7606部分

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时序—转换期间读取)。

 

FSMC部分

本次实验中将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的工作原理。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多