ADC转换
一、 ADC 轮询法:最直接的读取方式
/*操作步骤======
1、打开ADC1通道10
2、配置ADC
3、通道配置周期
======end*/
ADC 配置完成后(通常通过 STM32CubeMX 生成初始化代码),我们如何获取转换结果呢?最简单直接的方法就是轮询法 (Polling)。
1、打开ADC1通道10
2、配置ADC
(1)分辨率
12bit
决定 ADC 能分辨的最小电压变化,通常以位 (bits) 表示。STM32 的 ADC 通常支持 12 位、10 位、8 位或 6 位分辨率。(一般选12 bits)
分辨率高->精度高->转换时间长。
(2)数据对齐
Right Alignment
ADC 转换结果是一个数字值(如 12 位),但它存储在 16 位或 32 位的数据寄存器 (ADC_DR) 中。数据对齐方式决定了有效数据位在寄存器中的位置。(一般选右对齐)
右对齐(Right Alignment):有效数据位位于寄存器的低位 (LSB)。例如,12 位结果存储在 bit 11 到 bit 0。读取值即为 0-4095。
左对齐(Left Alignment):有效数据位位于寄存器的高位 (MSB)。例如,12 位结果存储在 bit 15 到 bit 4。这种方式在某些需要更高精度比例计算或与 8 位系统兼容时可能有用,但读取后通常需要右移 4 位。
(3)转换模式
Single Conversion Mode
定义 ADC 如何进行转换(轮询一般选单次转换,DMA选连续转换)
单次转换(Single Conversion Mode): 每次触发(软件或硬件)只进行一次转换,然后停止。需要再次触发才能进行下一次转换。常用于轮询法或简单的中断法。
连续转换(Continuous Conversion Mode ):首次触发后,ADC 会自动连续不断地进行转换,每次转换完成后立即开始下一次转换,直到手动停止。常用于配合 DMA 进行高速连续采样。
单次转换:每次触发只会转换一次。
连续转换:首次触发后会一直进行转换,直到手动结束。
3、通道配置周期
此模式选择最大周期(480 Cycles)。
(二)代码部分配置
(1)adc_task放入到调度器中。
注意:如果在cubeMX中配置ADC为连续转换模式,需要加HAL_ADC_Stop手动停止。
如果是单词转换模式,不需要HAL_ADC_Stop手动停止。
一、 ADC DMA + 定时处理:解放 CPU 的初步尝试
轮询法虽然简单,但 CPU 一直在忙着等待,效率太低。为了让 CPU 能在 ADC 转换的同时处理其他任务,我们可以请出强大的帮手——DMA (Direct Memory Access)。
使能DMA后因为是连续转换模式,所以会一直进行转换。周期性任务会周期进行数据(数据累加求平均值)输出。
(一)cubeMX配置
/*操作步骤======
1、配置ADC_DMA
2、配置ADC
======end*/
1、配置ADC_DMA
(1)配置DMA模式
DMA 传输模式(Mode):选择循环模式
Normal: 传输完指定长度的数据后停止。
Circular: 常用 传输到缓冲区末尾后自动回到缓冲区开头继续传输,形成环形缓冲区。这是 ADC 连续采样配合 DMA 的核心配置。
(2)配置数据宽度(外设 Peripheral / 内存 Memory)
注意:选用word的作用:一是为了使数据对齐,二是输入数据的参数使uint32
2、配置ADC
1、配置循环请求
配置ADC循环转化模式和DMA的循环请求
相当于ADC一直转化搬运。
(一)代码部分配置
/*代码