STM32F407控制AD7606 采用HAL库的TIM和SPI

前言

本文介绍基于STM32F407的AD7606 8通道同步采集控制方式,总体思路:PWM驱动AD7606完成模数转换,AD7606转换完成后其BUSY引脚给出下降沿,STM32捕获外部中断并在中断服务程序中调用SPI串口读取AD7606数据,工程采用cubemx完成配置,基于HAL库开发。

一、AD7606模数转换芯片

主要用在电力采集、多相电机控制、仪器仪表等数据采集场景,提供最大200ksps的16bit八通道同步采集能力,双极性模拟输入可达正负10V,具备完整集成的数据采集解决方案,包括模拟输入钳位、1M欧模拟输入阻抗、二阶抗混叠模拟滤波、片内基准源、数字滤波和和过采样等。支持8080并口和SPI串口读取数据。

根据AD7606说明书配置AD7606工作于SPI串口模式,并短接CONVA和CONVB,实现8通道同步转换。

二、控制器和资源分配

主控STM32F407,所需资源如下:

  • 一组串口,Usart1串口(PA9 PA10),打印采集数据
  • 一组SPI,SPI2(MISO PC2 、MOSI PC3、 SCLK PB13),读取AD7606转换数据
  • 一个定时器,TIM3(TIM3_CH1 PA6管脚),产生PWM,控制AD7606转换频率,即采样率
  • 三个GPIO,AD7606Rst(PA1)、AD7606Cs(PA2)、AD7606Irq(PA5)

硬件连线:

  • SCLK --------------------------------------RD
  • MISO --------------------------------------D7
  • AD7606Cs--------------------------------CS
  • AD7606Irq--------------------------------BUSY
  • AD7606Rst-------------------------------RST
  • TIM3_CH1 -------------------------------CONVA

三、cubemx工程配置

3.1 时钟树

配置SYSCLK=168MHz,外设时钟42MHz

3.2 UART1

串口配置不是本文重点,现省略,参考其他资料。

3.3 GPIO

AD7606Rst(PA1)、AD7606Cs(PA2)配置成输出模式,AD7606Irq(PA5)配置成外部中断模式,下降沿触发,并开启全局中断。

3.4 TIM3

配置TIM3为PWM 输出通道1,输出98%占空比的脉冲去驱动AD7606,频率配置为10kHz,(42MHz/42/100 = 10kHz  = 100us),占空比配置设置Pulse为98 (98/100 = 98%, 低电平持续时间2us, 需要大于25ns)和CH Polarity为高电平。根据AD7606的时序要求,配置占空比即可。

3.5 SPI

选择全双工模式,虽然只是用读功能,但是不影响。关闭硬件NSS片选信号,配置SPI数据位16bit,MSBFirst,波特率一般可以大于10MHz,SPI的模式根据AD7606手册应该选择为CPOL=High,CPHA=1Edge。数据量不大,一般不需要使用DMA,不需要用中断。

3.6 生成HAL工程

生成HAL库的开发工程,然后编写AD7606的驱动和数据读取。

四、AD7606应用接口

配置好HAL库工程后,还不能正确读取数据,需要增加AD7606的应用层接口,主要包括AD7606的初始化、启动、停止、复位和数据读取等。

static void AD7606Reset(void)
{
    /*! ___|-----|________  >= 50ns */
    AD7606Rst_Low();
    AD7606Rst_High();
    for(int i = 20; i > 0; i--){
        __NOP();//1000/168 ns = 5.85ns
    }
    AD7606Rst_Low();
}

void AD7606Init(void)
{
    AD7606Cs_High();
    AD7606Reset();
}

void AD7606Start(void)
{
    HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);//启动AD7606转换
}

void AD7606Stop(void)
{
    HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1);//停止AD7606转换
    AD7606Cs_High();
}

void AD7606BusyIrqCallback(uint16_t *ad7606Val,uint8_t ad7606Chl)
{
    AD7606Cs_Low();
    HAL_SPI_Receive(&hspi2,(uint8_t *)ad7606Val,ad7606Chl,10000);//AD7606中断中读取
    AD7606Cs_High();
}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)//PA5 中断
{
    if(GPIO_Pin == AD7606Irq_Pin){
        //read AD7606
        if(nums < SAMPLING_POINTS){
            AD7606BusyIrqCallback(ad7606Buff[nums],SAMPLING_CHANNEL);
            nums++;
            ad7606SamplingDoneFlag = 0;
        }
        else{
            ad7606SamplingDoneFlag = 1;
        }
    }
}

五、效果

由于AD7606返回的数据是二进制补码的形式,还需要转换成10进制,编写了以下接口:

float AD7606ConvValue(uint16_t bin)
{
    int _val;
    float adcValue;
    _val = bin&0x8000 ? (-((~bin+1)&0x7fff)) : bin;
    adcValue = 5.0*_val/32768.0;
    return adcValue;
}

上述函数接口是以AD7606片内2.5V基准电压源为例,设定的采样范围为正负5V,其他基准电压源和正负10V采样范围可以针对修改即可。

最终的采样结果如下,可以看到AD7606使用了过采样技术,干扰很小。

补充一个工程下载仓库:https://gitee.com/eiri_jackmaster/ad7606_freertos_stm32f407

https://gitee.com/eiri_jackmaster/ad7606_stm32f407/tree/master

版权声明:本文为CSDN博主「jianwang16」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010058695/article/details/112270329

生成海报
点赞 0

jianwang16

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

Keil MDK5 STM32F103C8T6开发环境配置

Windows下使用Keil MDK5进行stm32f103c8t6的开发和编译, 配合ST-LINK工具进行烧录, 使用原生(非HAL)的方式. 所需硬件 stm32f103系列开发板 stm32f103c8t6核心板 参数 ARM 32-b

基于STM32的室内环境监测系统

设计简介: 本设计是基于单片机的室内环境监测器,主要实现以下功能: 可实现LCD1602显示环境数据实时监测一氧化碳、甲烷、烟雾值空气质量大于各自限值报警,并通过TTS报警 标签&#x

Arduino与Proteus仿真实例-DHT11温度湿度传感器驱动仿真

DHT11温度湿度传感器驱动仿真 DHT11 是一款基本的超低成本数字温度和湿度传感器。 它使用电容式湿度传感器和热敏电阻来测量周围的空气,并在数据引脚上吐出数字信号(不需要模拟输入引脚)。 它使用起来相当简单,但需要仔细定时来抓取数据。

基于stm32f407的示波器

一.设计要求 二.整体思路 硬件部分主要负责电压的缩放以及垂直灵敏度的控制,因为stm32的大部分引脚最高输入电压为3.3v,而要求的电压需要50v,需要进行电压缩放。 软件部分主要负责方波的实现&#x