前言

本文介绍基于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 AD7606if(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

STM32F407控制AD7606 采用HAL库的TIM和SPI相关推荐

  1. 学习笔记(1)stm32h743和ADXL355的SPI通信,基于cubeMX和keil5MDK平台,采用HAL库编程,代码已模块化处理

    今天是一个特别的日子,为什么呢?哈哈,因为从大四做毕业设计的时候,接触CSDN,到现在一整年了,终于创作了我的第一篇博客,内心难念有些激动! 首先声明,我不是嵌入式领域的技术大牛,只是普通的研一新生, ...

  2. stm32f407单片机上通过HAL库实现can总线数据的收发

      最近在使用can总线,由于这个以前接触的比较少,所以调试代码的时候直接是下载的正点原子的例程,在这个基础上修改调试的.现在将调试中遇到的问题,总结一下,避免以后踩坑.目前写了一个查询方式的,一个中 ...

  3. STM32机器人控制开发教程No.3 使用遥控控制电机/舵机(基于HAL库)

    01 前言 本教程使用的机器人控制板拥有4个带编码器的电机接口,4个舵机接口,串口通信接口.SWD下载调试接口.航模遥控接口.USB5V输出接口以及方便与树莓派直接连接的40PIN接口等,板载资源丰富 ...

  4. stm32f4 hal 4位数码管_STM32裸机开发基础篇01开发环境搭建(HAL库)

    前言 众所周知,在32位单片机中,STM32占有重要市场份额,其社区活动频繁,网上相关资料也比较多,无论是学习入门,还是工作使用,都无疑是极好的选择,本节开始,我们将学习如何使用STM32,首先,我们 ...

  5. 【嵌入式基础】用C语言编程、寄存器实现LED流水灯程序;stm32CubeMX+Keil使用HAL库点亮流水灯

    本文主要介绍STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置步骤.利用C语言编程和寄存器点亮流水灯以及stm32CubeMX+Keil使用HAL库点灯 目录 一.STM3 ...

  6. ​用寄存器HAL库完成LED流水灯程序

    STM32的地址映射.寄存器映射原理以及GPIO端口的初始化设置三步骤 ​(一)STM32F103系列芯片的地址映射及寄存器映射原理 1.STM32F103C8T6简要介绍 ● STM32F103C8 ...

  7. 用寄存器HAL库完成LED流水灯程序以及通过MDK5模拟示波器观察波形

    文章目录 前言 一.相关寄存器配置介绍 1.相关寄存器配置介绍 二.使用寄存器点亮LED灯 1.工程模板的建立 2.配置GPIO端口 3.主要函数 4.编译生成HEX文件 5.电路搭建 三.STM32 ...

  8. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

  9. STM32串口中断接收HAL库超详解析

    之前一直用的固件库跑c8t6和zet6,现在有幸接触到stm32H743用到HAL库,学习嘛都是踩坑,csdn,然后...理解底层库的代码 本人有幸遇到了H7的串口中断接收只进去一次的Bug,于是马上 ...

最新文章

  1. 机器学习应用方向(二)~概念漂移(concept drift)
  2. 两不同网段主机直连通信过程的建立(3个实验详细分析)
  3. BugKuCTF WEB 本地包含
  4. Office2007打开文件提示“您尝试打开的文件xxx.xls的格式与文件扩展名指定的格式不一致”的解决办法...
  5. mysql 字符串某个位置_mysql 定位字符串的位置
  6. caffe测试单张图片
  7. 又拍云引领云CDN加速 或成互联网刚性需求
  8. html ajax get post,jQuery – AJAX get() 和 post() 方法 - jQuery 教程 - 自强学堂
  9. DSP6678使用NDK网口通信
  10. Android 电容屏和电阻屏
  11. VBA学习之一:基本知识
  12. 算法与数据结构学习资源大搜罗——良心推荐
  13. Thinkphp资源源码付费下载站网站源码
  14. java 日历签到功能_快速简单的实现在日历上签到的功能,不需要日历组件,带后端实现讲解...
  15. python股票分析系统代码_Python 代码学习,用于股票分析
  16. C语言调用jni中JNIEnv指针使用和理解
  17. 2008中国无线互联网细分领域排行榜
  18. 旁瓣对消原理_自适应旁瓣相消的原理
  19. kingcms php 排序 标签,KingCMS PHP版本的评论模块标签应该怎样写?
  20. 超级简单的大疆tello无人机视频实现(很少代码)

热门文章

  1. UNICODE字符集
  2. 终于用到DataGrid了,比较郁闷
  3. eclipse tomcat新建一个_Javaweb07-Eclipse自动创建动态web项目
  4. php数据趋势曲线,数据曲线图怎么做
  5. thinkphp 学习 (资料收集)
  6. Python -- post方式上传文件
  7. 求素数: 一般线性筛法 + 快速线性筛法
  8. find 命令搜索符号链接文件夹的方法
  9. undefined reference to
  10. Linux 系统如何查看硬盘UUID与修改