ADC简介
cubeMX配置
ADCs_Common_Settings
Mode
:ADC 模式
ADC_Settings
:- Data Alignment:数据对齐Right alignment 右对齐
- Scan Conversion Mode:扫描模式
- Continuous Conversion Mode:连续转换 / 单次转换
- DiscontinuousConvMode:间断模式
ADC_Regular_ConversionMode
:- Enable Regular Conversions:使能规则组转换。
- Number Of Conversion:ADC转换通道数目,有几个写几个就行。
- External Trigger Conversion Source: 外部触发选择。
- Rank:Channel ADC转换通道,Sampling Time 采样周期选择
ADC_Injected_ConversionMode
:是否使能注入转换。注入通道只有在规则通道存在时才会出现。WatchDog
:是否使能模拟看门狗中断。当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断。
- ADC时钟分频为6 / 8
keil使用
cubeMX自动生成hadcx结构体
- 初始化ADC
在进入循环前、ADC初始化之后进行ADC校准。
HAL_ADCEx_Calibration_Start(&hadc1); //ADC校准
HAL_ADC_Start_IT(&hadc1); //开启ADC转换
- 轮询的方式(一般为单通道)
- 开启ADC
HAL_ADC_Start()
- 等待ADC转换结束
HAL_ADC_PollForConversion()
- 获取ADC转换值
HAL_ADC_GetValue()
- 停止ADC
HAL_ADC_Stop()
- 开启ADC
- 中断的方式
- 先在main.c中定义一个保存ADC值的变量修饰为const volatile uint32_t。
- 然后,在回调函数中读取ADC的值,所以需要extern那个定义在mian.c里的变量。
extern __IO uint32_t ADC_ConvertedValue; void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { ADC_ConvertedValue = HAL_ADC_GetValue(hadc); }
- 开启ADC和中断
HAL_ADC_Start_IT()
- 结束ADC和中断
HAL_ADC_Stop_IT()
-
DMA方式
- 开启ADC和DMA
// // HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length)
- 停止DMA
HAL_ADC_Stop_DMA()
HAL库
Handler
typedef struct __ADC_HandleTypeDef
{
ADC_TypeDef *Instance; /*!< Register base address */
ADC_InitTypeDef Init; /*!< ADC required parameters */
DMA_HandleTypeDef *DMA_Handle; /*!< Pointer DMA Handler */
HAL_LockTypeDef Lock; /*!< ADC locking object */
__IO uint32_t State; /*!< ADC communication state (bitmap of ADC states) */
__IO uint32_t ErrorCode; /*!< ADC Error code */
void (* ConvCpltCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC conversion complete callback */
void (* ConvHalfCpltCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC conversion DMA half-transfer callback */
void (* LevelOutOfWindowCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC analog watchdog 1 callback */
void (* ErrorCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC error callback */
void (* InjectedConvCpltCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC group injected conversion complete callback */ /*!< ADC end of sampling callback */
void (* MspInitCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC Msp Init callback */
void (* MspDeInitCallback)(struct __ADC_HandleTypeDef *hadc); /*!< ADC Msp DeInit callback */
}ADC_HandleTypeDef;
ADC状态控制函数
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout);
HAL_StatusTypeDef HAL_ADC_PollForEvent(ADC_HandleTypeDef* hadc, uint32_t EventType, uint32_t Timeout);
HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig);
HAL_StatusTypeDef HAL_ADC_AnalogWDGConfig(ADC_HandleTypeDef* hadc, ADC_AnalogWDGConfTypeDef* AnalogWDGConfig);
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc);
uint32_t HAL_ADC_GetState(ADC_HandleTypeDef* hadc);
void ADC_StabilizationTime(uint32_t DelayUs);
uint32_t HAL_ADC_GetError(ADC_HandleTypeDef *hadc);
ADC DMA控制函数
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);
HAL_StatusTypeDef HAL_ADC_Stop_DMA(ADC_HandleTypeDef* hadc);
void ADC_DMAConvCplt(DMA_HandleTypeDef *hdma);
void ADC_DMAHalfConvCplt(DMA_HandleTypeDef *hdma);
void ADC_DMAError(DMA_HandleTypeDef *hdma);
ADC中断控制函数
HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc);
HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc);
回调函数
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc);
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc);
void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc);
void HAL_ADC_ErrorCallback(ADC_HandleTypeDef *hadc);
HAL_StatusTypeDef HAL_ADC_RegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID, pADC_CallbackTypeDef pCallback);
HAL_StatusTypeDef HAL_ADC_UnRegisterCallback(ADC_HandleTypeDef *hadc, HAL_ADC_CallbackIDTypeDef CallbackID);
------ BY Flier
2023.10.5