在STM32WBA55微控制器上执行ADC模数转换器采集电池电压的任务我分了几个步骤进行。
ADC理解、配置ADC模块、选择正确的通道、启动转换、读取转换结果以及可能需要的滤波或处理步骤。
一、ADC理解
STM32WBA55包含一个12位ADC模数转换器。
ADC具有多个通道,可以测量来自不同信号源的模拟信号,并将其转换为数字信号以供微控制器处理。
STM32WBA55的ADC还支持多种特性和功能,高精度、低功耗、硬件过采样等,可以满足多种应用场景的需求。
STM32WBA55的MCU供电电压为3.3V,且VREF+与VDDA相连,VREF-与地相连,ADC的输入电压范围通常为0V至3.3V,ADC模块的参考电压与MCU的供电电压一致,所以ADC的参考电压为3.3V。
ADC的特性:
ADC精度:
ADC连接示意
工作原理: ADC在模拟信号转化为数字信号需要经过采样、保持、量化和编码。采样和保持在采样保持电路中完成,而量化和编码步骤则在ADC中完成。
二、 配置ADC与硬件连接
连接引脚:
连接实物图:
使用STM32CubeMX通过调用HAL库来完成。主要的功能配置是选择ADC的通道号,端口,分辨率、采样时间、扫描模式等。
三.代码:
if (HAL_ADC_Start(&hadc4) != HAL_OK) { /* ADC conversion start error */ Error_Handler(); } /* Wait for ADC conversion completed */ if (HAL_ADC_PollForConversion(&hadc4, 10) != HAL_OK) { /* End Of Conversion flag not set on time */ Error_Handler(); } ADC_Data = HAL_ADC_GetValue(&hadc4); voltage=ADC_Data*3.3/4096; HAL_Delay(1000); printf(" Hello, World! \r\n"); printf(" www.eepw.com.cn\r\n"); printf(" ADC_Data = %5d\r\n",ADC_Data); printf(" voltage = %1.3fv\r\n",voltage); } 初始化: void MX_ADC4_Init(void) { /* USER CODE BEGIN ADC4_Init 0 */ /* USER CODE END ADC4_Init 0 */ ADC_ChannelConfTypeDef sConfig = {0}; /* USER CODE BEGIN ADC4_Init 1 */ /* USER CODE END ADC4_Init 1 */ /** Common config */ hadc4.Instance = ADC4; hadc4.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV4; hadc4.Init.Resolution = ADC_RESOLUTION_12B; hadc4.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc4.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc4.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hadc4.Init.LowPowerAutoPowerOff = DISABLE; hadc4.Init.LowPowerAutonomousDPD = ADC_LP_AUTONOMOUS_DPD_DISABLE; hadc4.Init.LowPowerAutoWait = DISABLE; hadc4.Init.ContinuousConvMode = DISABLE; hadc4.Init.NbrOfConversion = 1; hadc4.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc4.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc4.Init.DMAContinuousRequests = DISABLE; hadc4.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_LOW; hadc4.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN; hadc4.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_79CYCLES_5; hadc4.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_79CYCLES_5; hadc4.Init.OversamplingMode = ENABLE; hadc4.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16; hadc4.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_4; hadc4.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; if (HAL_ADC_Init(&hadc4) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_2; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1; if (HAL_ADC_ConfigChannel(&hadc4, &sConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN ADC4_Init 2 */ /* USER CODE END ADC4_Init 2 */ }
四、 输出结果: