有人使用STM32芯片做产品开发,需用到多个通道的ADC转换。大致需求是这样的:
有2个ADC通道需要每10ms启动一次转换,另外5个通道希望50ms启动一次转换。试问如何实现上述功能比较好。
这里不妨以STM32F302芯片为例,来介绍两种实现上述功能的大致方案以供参考。方案里涉及到ADC规则通道、注入通道的使用、DMA的使用、定时器的灵活使用,具备一定综合性。下面介绍以贴图为主,没法一点一滴做解释了。
第一种方案,我们使用ADC1模块的CH1到CH7连续的7个通通来做AD转换,其中CH6/CH7配置为注入通道【我将其戏称之为插队通道】,另外5个通道配置为规则通道。
其中,规则通道的触发选用TIM1的触发输出信号【TRGO】,注入通道的触发选择TIM1通道4的比较事件。我们将TIM1的计数模式选择向上单向计数模式,计数周期设置为10ms,并开启TIM1_CH4的PWM输出功能,周期也是10ms,这样就可以实现每10ms触发一次注入通道的转换动作。
另外,我们将RCR重复计数寄存器设置为4,即每溢出4+1次则产生一次定时器更新事件,并将其将做为TIM1的TRGO信号,这样就保证了每50ms触发一次规则通道的ADC动作。【注:RCR寄存器只有高级定时器才有】
规则通道的ADC结果通过DMA取走送到指定内存单元,DMA配置为Normal模式。
利用STM32CubeMx进行配置后,添加必要的用户代码。
两个数组分别存放规则通道和注入通道的转换结果。
开启TIM1以及通道4的PWM输出;
开启ADC规则通道/注入通道,只待触发信号。
在规则通道的DMA传输完成中断里重启ADC的转换。
编译运行查看结果【下表中分别为规则通道和注入通道结果】:
一路下来,只要各个环节都弄清楚、做到位了还是挺简单的。
当然,TIM1作为高级定时器有时可能有它用,没法用在这里。我们知道,STM32芯片的定时器往往较多,而且很多都可以产生ADC的触发事件,此时我们不妨稍加调整即可得出新方案。
比方还是开篇的应用需求和STM32F3芯片,我们可将规则通道和注入通道的触发事件分别调整为TIM6的触发输出和TIM15的触发输出,时间参数各种独立配置即可。
好,本示例就介绍到这里,文笔不佳,但求行文简捷。实现方案也不是唯一的,最终要结合具体应用场景和所选择的芯片型号。在此只希望能带给大家一些相关应用方面的启示或借鉴。
关键字:STM32 多通道 ADC
引用地址:
基于STM32多通道ADC综合应用示例
推荐阅读最新更新时间:2024-10-10 13:43
STM32启用Bootloader支持配置
1. 程序设置 在进入main()函数后的第一行增加FLASH偏移地址设置,如图: 2. 工程设置 Bootloader的占用空间为0x4000, 则将Start的值设置为0x8004000,将Size的值设置为:原来大小-0x4000,以STM32F103C8为例,其内存大小为0x10000,设置后为0x10000-0x4000=0xC000。 设置前: 设置后:
[单片机]
stm32专题十四:存储器介绍
存储器通常分为易失性存储器(RAM - random access memory)和非易失性存储器(ROM - read only memory) 易失性存储器 SRAM:Static Random Access Memory(静态随机存储器),基本的存储单元由SR锁存器组成,不需要定时刷新。 DRAM:Dynamic Random Access Memory(静态随机存储器),由电容和晶体管组成,结构非常简单。动态随机存储器 DRAM 的存储单元以电容的电荷来表示数据,有电荷代表 1,无电荷代表 0。但时间一长,代表 1 的电容会放电,代表 0 的电容会吸收电荷,因此它需要定期刷新操作。刷新操
[单片机]
STM32笔记之十四:基本问题,来讨论一下软件架构
网上大家都在讨论和学习,但是对于架构这个基本问题却没几个人讨论。个人认为有个好的架构是写好代码的基础,可以使后期的调式工作事半功倍!! 1、 架构组成:我的程序代码分为四种结构 a) 顺序执行代码 定义:按照顺序逐行执行的代码 优点:是思路简单,代码可靠不易被干扰。 缺点:占用资源 用途:只用来各种变量、函数的定义,硬件的初始化程序 位置:main.c的开始一直到main函数的while函数之前 b) 空闲执行代码 定义:在CPU空闲的时候才执行的代码 优点:不占用资源 缺点:执行的实时性不能保证 用途:非实时任务,调试信息输出
[单片机]
STM32实战四 定时器和按键
这一章编写定时器,包括定时器基类 Timer 和派生的通用定时器 GeneralTimer。基类对定时器参数进行封装,通用定时器封装一些定时应用,对应PLC的一些功能,包括: 1ms定时中断 100个32位数字时间继电器,最小1ms,最大0xffffffff,大约50天。 一个高精度回调函数,微秒级误差,最小定时间隔1ms。 按键抖动和干扰过滤,并产生按键上升沿和下降沿。 代码中有详细的说明,这里只解释几个知识点,其它文档介绍按键防抖和延时的时候一般都是死循环,官方文档也是这么用,如果有很多按键和延时就会一个一个等,效率很低。我这里用了另外一种高效的方法,就是模仿时间继电器,100个计数器同时工作,直到计数为0时执行对应操作,
[单片机]
基于STM32的四种波形发生器设计
(1) 可以实现四种波形:正弦波、方波、三角波、锯齿波; (2) 通过按键进行选择,频率可以调整; (3) LCD液晶显示; (4)设计出来之后用Proteus软件仿真出效果; 主要硬件设备:STM32F103单片机、DAC0832数模转换芯片、矩阵键盘、LCD12864液晶屏幕。 效果图 正弦波 方波 三角波 锯齿波 单片机源程序如下: #include stm32f10x.h #include sys.h #include delay.h #include 12864.h #include key4_4.h #include timer.h //LYF #define KE
[单片机]
非数学方法解析∑-Δ模数转换器(ADC)
引言 目前,有许多应用经常要求模数转换器具有高分辨率,而不是高精度,从而出现了对∑-Δ模数转换器的需求。为了了解∑-Δ转换器,人们必须深入了解频域中所涉及的复杂数学计算来钻研控制环路理论。但本文将让您了解一些非常重要的概念,如噪声整形、过采样和∑-Δ调制器背后使其区别于其它转换器架构的所有魔幻性能,尽可能避免数学复杂性,使您能够可视化感受事物的移动。 要了解∑-Δ模数转换器,首先需要了解噪声整形和过采样等基本概念。噪声整形可通过两种模拟来阐释。 什么是“噪声整形”?通用示例如下 比如说,某个商品的价格是9.9卢比,您购买该商品已有10天。下图是店主让您支付此商品的价格图。 不管是0.1或0.5,每天都会
[嵌入式]
STM8S_005_ADC采集单通道电压
Ⅰ、写在前面 和前面51系列的芯片相比,STM8S芯片的优势之一在于外设资源要丰富且功能要强大的多。因此,本文讲述STM8S的一项比较实用的功能:ADC采集电压。 在物联网的产品中,大多数传感器都使用了模数转换(ADC)这一功能。本文提供STM8S两种转换模式: Ø 单次软件触发 Ø 连续转换 本文将结合“STM8S参考手册”中ADC章节和软件源代码给大家讲述关于ADC相关的知识和用法。 为方便大家阅读,本文内容已经整理成PDF文件: http://pan.baidu.com/s/1i5uWhJR 作者:strongerHuang 版权所有,未经允许,禁止用于其它商业用途!!! Ⅱ、ADC基础知识 AD
[单片机]
STM32单片机GPIO的配置模式
1. 操作GPIO的意义 我们在学习单片机的时候,一般都是从操作GPIO开始的,很多单片机学习的教程第一课就是点亮发光二极管或者是流水灯。所以对于初学者而言,及时掌握单片机的GPIO口是一件具有里程碑意义的事情。今天以STM32单片机为例,简单看一下GPIO口。 2. STM32单片机GPIO的配置模式 STM32单片机的GPIO最有8组,分别为A,B,C,D,E,每组有0-15共16个。可以配置为8中模式: 3. 相关寄存器 配置GPIO相关的寄存器有如下几个: 1.端口配置低寄存器:(GPIOx_CRL) (x=A..E) 2.端口配置高寄存器:(GPIOx_CRH) (x=A..E) 3.端口输入数据寄存器:(GPI
[单片机]