CubeMX配置ADC实现几种方式AD转换

描述

整理CubeMX配置ADC实现几种方式AD转换

(注 : 以STM32F429为例)

1. 轮询方式

HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc); //轮询模式,需放在循环中不断开启
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)       //获取转换结果
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)   /* 此函数只用于轮询模式,用于等待转换完成 */
HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc); //停止转换

(1)配置CumeMX,如下图,选择规则通道,设置好AD转换的模式,不扫描,连续转换。

adc

(2)编程实现

adc

** 2. 中断方式**

HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);//中断模式
 HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);
void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc);//中断

(1)配置CubuMX,在轮询的基础上,把中断勾选中,如图:

adc

(2)编程实现:

adc

编写中断回调函数,在里面设置一个标志位。

主循环中判断此标志位,注意需要调用 HAL_ADC_Start_IT。

3、DMA方式多通道转换

HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);//DMA模式
HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc);

(1)CubeMX配置,勾选多个通道,然后配置ADC,使能连续转换和扫描模式,使能DMA请求,配置Rank,如下图:

adcadc

(2)编程实现:

adc

注: 如果没有转换,要注意时钟问题。

  1. 定时器触发+ADC中断实现单通道AD采集

(1)首先要了解,ADC要好几种触发方式,如下,这里我采用TIM8的事件更新来触发AD转换。

#define ADC_EXTERNALTRIGCONV_T1_CC1    0x00000000U
#define ADC_EXTERNALTRIGCONV_T1_CC2    ((uint32_t)ADC_CR2_EXTSEL_0)
#define ADC_EXTERNALTRIGCONV_T1_CC3    ((uint32_t)ADC_CR2_EXTSEL_1)
#define ADC_EXTERNALTRIGCONV_T2_CC2    ((uint32_t)(ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0))
#define ADC_EXTERNALTRIGCONV_T2_CC3    ((uint32_t)ADC_CR2_EXTSEL_2)
#define ADC_EXTERNALTRIGCONV_T2_CC4    ((uint32_t)(ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_0))
#define ADC_EXTERNALTRIGCONV_T2_TRGO   ((uint32_t)(ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1))
#define ADC_EXTERNALTRIGCONV_T3_CC1    ((uint32_t)(ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0))
#define ADC_EXTERNALTRIGCONV_T3_TRGO   ((uint32_t)ADC_CR2_EXTSEL_3)
#define ADC_EXTERNALTRIGCONV_T4_CC4    ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_0))
#define ADC_EXTERNALTRIGCONV_T5_CC1    ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_1))
#define ADC_EXTERNALTRIGCONV_T5_CC2    ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_1 | ADC_CR2_EXTSEL_0))
#define ADC_EXTERNALTRIGCONV_T5_CC3    ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2))
#define ADC_EXTERNALTRIGCONV_T8_CC1    ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_0))
#define ADC_EXTERNALTRIGCONV_T8_TRGO   ((uint32_t)(ADC_CR2_EXTSEL_3 | ADC_CR2_EXTSEL_2 | ADC_CR2_EXTSEL_1))
#define ADC_EXTERNALTRIGCONV_Ext_IT11  ((uint32_t)ADC_CR2_EXTSEL)
#define ADC_SOFTWARE_START             ((uint32_t)ADC_CR2_EXTSEL + 1U)

(2)CubeMX配置TIM8与ADC1:

TIM8配置为1Hz,即1S触发一次AD转换。

adc

ADC1配置如下:别忘了开启中断

adc

(3)代码实现:实现的效果是1S打印一次AD转换的结果

1 //首先调用
2     HAL_ADC_Start_IT(&hadc1);
3     HAL_TIM_Base_Start(&htim8); 
4 
5 //编写AD转换完成处理函数
6 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
7 {
8     printf("%d\\r\\n",HAL_ADC_GetValue(&hadc1));
9 }
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分