欢迎大家来到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转换的模式,不扫描,连续转换。
(2)编程实现
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,在轮询的基础上,把中断勾选中,如图:
(2)编程实现:
编写中断回调函数,在里面设置一个标志位。
主循环中判断此标志位,注意需要调用 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,如下图:
(2)编程实现:
注: 如果没有转换,要注意时钟问题。
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转换。
ADC1配置如下:别忘了开启中断
(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