STM32 ADC --- 单通道采样
文章目录
需求:有多个通道需要进行ADC采样,实现每次采样只采样一个通道,且可以随时采样不同通道的功能。
cubeMX配置
这里我们想通过10通道和11通道分别进行ADC采样。需要注意的是:当ADC规则转换中配置的转换数大于1时,cubeMX会自动将扫描转换模式使能 。但这里我们实际需要扫描转换模式为关闭,这里可以等下在代码中修改。还有个需要注意的地方是结束转换的选择:单个通道完成转换时即触发EOC标志位
代码修改:
为了方便后续继续使用cubeMX生成代码不影响改动,我们采用重新初始化ADC的方式来实现需求:
c
void adc1_init(void) {
/* 配置ADC引脚 */
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/* 重新初始化ADC1 */
HAL_ADC_DeInit(&hadc1);
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = DISABLE; //ENABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DMAContinuousRequests = DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
if (HAL_ADC_Init(&hadc1) != HAL_OK){};
}
uint16_t adc_sample(ADC_HandleTypeDef *hadc, uint32_t adc_channel) {
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = adc_channel;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_56CYCLES;
HAL_ADC_ConfigChannel(hadc, &sConfig);
HAL_ADC_Start(hadc);
HAL_ADC_PollForConversion(hadc, 100); //等待转换完成
uint16_t value = HAL_ADC_GetValue(hadc);
return value;
}
通过adc1_init()
函数将ADC1重新初始化
- 将扫描转换模式修改为DISABLE
- 将转换通道数设置为1
- 后续还有其它引脚通道需要转换时在配置ADC引脚处添加相关的初始化即可
后续便可以通过adc_sample()
函数根据通道号进行ADC采样了,这里的采样方式为轮询等待模式。