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即可。

代码修改

这里主要说一些几个关键的代码

  1. 由于DMA采用连续传输模式,因此ADC采集到的数据会不断传输至储存器中,这里设置一个数组:

    uint32_t ADC_Value[100];
    

    ADC采集到的数据不断的储存到ADC_Value中,这个过程有DMA控制,不需要cpu参与,读取数组中的值就可以得到采集的数据,ADC_Value[0]为Rank1通道采集到的数据,这个Rank可以在Cube里面设置。

  2. 关于DMA的优先级,Cube配置的时候可以设置为四级,优先级高的先传输,但是当所有的优先级一样时,按照rank编号来。

  3. 开启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.

  4. 中断回调函数

    HAL_ADC_ConvCpltCallback()
    
  5. 一般设计时默认ADC输入电压0~3.3V,ADC精度12位,ADC电压转换公式为:

    \[Y=(3.3*X)/2^{12} \]

参考资料

https://www.jianshu.com/p/ff6538b23342

http://t.csdn.cn/8Qcja

posted @ 2022-08-31 10:10  Phoenix-Tree  阅读(658)  评论(0编辑  收藏  举报