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

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

欢迎大家来到IT世界,在知识的湖畔探索吧!

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); //停止转换

欢迎大家来到IT世界,在知识的湖畔探索吧!

Copy

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

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

(2)编程实现

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

2. 中断方式

欢迎大家来到IT世界,在知识的湖畔探索吧!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);//中断

Copy

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

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

(2)编程实现:

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

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

主循环中判断此标志位,注意需要调用 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); 

Copy

欢迎大家来到IT世界,在知识的湖畔探索吧!

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

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

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

(2)编程实现:

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

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

4. 定时器触发+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)

Copy

(2)CubeMX配置TIM8与ADC1:

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

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

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

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

(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 }

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/101741.html

(0)
上一篇 2024年 12月 31日 上午8:05
下一篇 2024年 12月 31日 上午9:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信