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

news/2024/11/7 18:14:19/

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 *)0x6C000000int16_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的工作原理。


http://www.ppmy.cn/news/601480.html

相关文章

16、STM32——DMA详解

1、DMA简介 DMA(Direct Memory Access) :直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数据,但是不需要占用 CPU,即在传输数据的时候, CPU 可以干其他的事情,好像是多线程一样。数据…

stm32 DAC+DMA 输出100K正弦波杠杠的!!!

之前想用stm32的DAC输出正弦波,才用的方案是在死循环里面用for循环输出36点的电压值模拟成一个完整的正弦波。发现最多只能输出个20KHz的波形,在示波器下面能够看到明显的梯度。后来用DMAADC的模式发现可以上100K(不过频率有点飘)…

STM32 DMA详解

目录 1、综述 2、DMA事务 3、通道选择 4、仲裁器 5、DMA数据流 6、源、目标和传输模式 6.1、外设到存储器模式 6.2 存储器到外设模式 6.3 存储器到存储器模式 7、指针递增 8、循环模式 9、双缓冲模式 10、可编程数据宽度、封装/解封、字节顺序 11、单次传输和突发…

STM32:DMA

一、DMA简介: DMA,全称为:Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址复制空间复制到另外一个地址空间,当CPU初始化这个传输动作之后,传输动作本身是由DMA控制器来实现和完成的。DM…

STM32 DAC+TIMER+DMA输出正弦波

前段时间学习了STM32使用DAC模块输出正弦波的功能,在学习过程中遇到了一些问题,在此和各位分享。 DAC是数字/模拟转换模块的简称,STM32中的DAC是12位数字输入,这个就决定了其精度。STM32的DAC模块具有两个通道,可单独进…

STM32F103ZET6:CubeMX配置FSMC接口驱动SSD1963-7寸 TFTLCD

配置方法 FSMC接口驱动SSD1963-7寸 TFTLCD 芯片:STM32F103ZET6 引脚: LCD_RS----PF0(FSMC_A0) LCD_CS----PG12(FSMC_NE4) LCD_WR----PD5(FSMC_NWE) LCD_RD----PD4(FSMC_NOE) 时钟:系统时钟配置为72M 操作:通过杜邦线将液晶屏连接…

STM32的DMA

文章目录 DMA介绍F407的DMA有多少数据流与通道?F407的DMA如何判定DMA请求的优先级? DMA框图F407的DMA源和目的的可选项?F407DMA的主要特性源与目的的方向配置DMA必要性仲裁器F407每个数据流对应请求映射 DMA结构DMA相关寄存器DMA 中断状态寄存…

STM32之DMA

DMA介绍 DMA(Direct MemoryAccess,直接存储器访问)提供在外设与内存、存储器和存储器、外设与外设之间的高速数据传输使用。它允许不同速度的硬件装置来沟通,而不需要依赖于CPU,在这个时间中,CPU对于内存的工作来说就无法使用。 D…