stm32学习(二)|ADC电压采集&DMA
利用ADC通道采集外部传感器数值,ADC通道选择依据实际查询芯片手册可得,相关配置利用Cubemx完成。
ADC参数配置
-
首先选择需要使用的ADC通道,并设置对应的引脚ADC_IN0X.
-
ADC参数设置(Paremeter setting)
- Mode : Independent mode,只使用一个ADC通道
- Clock Prescaler,Resolution采用默认,因为时钟在一开始已经配置好了。
- Date Alignment: 右对齐
- Sacan Conversion mode:如果是多通道,使能
- Continuous conversion mode:使能,自动连续转换
- DiscontinuousConvMode :与上面对应,二者选一个
- DMA:使能,转换的数据直接通过DMA传输到储存空间,常用搭配;
- End Of Conversion Selection :默认不用管
- Number Of Conversion :依据使用的通道数量选择;
- Rank: 不同通道的排序
-
使能中断(NVIC Settings)
- 使用ADC中断
-
DMA设置
-
add:添加DMA,其中数据方向需要注意,一般是外设到内存;
Stm32 F4具有两个DMA控制器,每个DMA控制器具有8个数据流,即对应8个外设请求。在实现DMA传输之前,DMA 控制器会通过配置寄存器选择对应的通道作为该数据流的目标外设。F4系列的DMA请求映射如图
因此这里选择DMA2。
-
Mode:circular,连续传输模式
-
Data Wdith:这里提供了Byte,Halfword 以及Word选项,其中一个字节8位,stm32是32位,所以一个word对应32位,所以Half Word对应16位,这里的选择主要根据传输数据的大小,因为利用ADC采集数据,其精度为12位,所以这里的Data Width采用Half Word即可。
-
代码修改
这里主要说一些几个关键的代码
-
由于DMA采用连续传输模式,因此ADC采集到的数据会不断传输至储存器中,这里设置一个数组:
uint32_t ADC_Value[100];
ADC采集到的数据不断的储存到ADC_Value中,这个过程有DMA控制,不需要cpu参与,读取数组中的值就可以得到采集的数据,ADC_Value[0]为Rank1通道采集到的数据,这个Rank可以在Cube里面设置。
-
关于DMA的优先级,Cube配置的时候可以设置为四级,优先级高的先传输,但是当所有的优先级一样时,按照rank编号来。
-
开启ADC_DMA转换
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef * hadc, uint32_t * pData, uint32_t Length)
Enables ADC, starts conversion of regular group and transfers result through DMA.
-
中断回调函数
HAL_ADC_ConvCpltCallback()
-
一般设计时默认ADC输入电压0~3.3V,ADC精度12位,ADC电压转换公式为:
\[Y=(3.3*X)/2^{12} \]