STM32 ContinuousConvMode和DiscontinuousConvMode的组合方式

本文介绍了ContinuousConvMode和DiscontinuousConvMode两种ADC转换模式的配置意义,并详细解释了如何利用内部参考电压进行ADC外部参考电压的校准计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ContinuousConvMode ,DiscontinuousConvMode这两个参数,乍一看只需要一个就好了,只要决定是不是连续转换就可以了。但实际上这两个参数是为了配置出更多的模式。经过查阅资料配置含义如下:
在这里插入图片描述
内部参考电压当adc的外部参考电压不准时,可以考虑使用内部参考电压进行校准:
公式:Vref = (1.2 / (adc_vref / 4095 * 3.3)) * 3.3。其中adc_vref为adc内部参考电压通道的数值。
实际电压 = Vref * Vch / 4095。(Vch是通道采集的adc的值)

### STM32 ADC 配置与 VBAT 电压监测 #### 一、STM32 中 ADC 的基本配置 在 STM32 微控制器中,通过 HAL 库或者 CubeMX 工具可以方便地完成 ADC 的初始化配置。以下是关于 ADC 基础配置的关键参数说明: - **RANK**: 定义了模拟信号采集及转换的顺序[^1]。 - **Channel**: 表示用于 ADC 转换的具体通道号。 - **Sampling Time (采样时间)**: 设置每个通道的采样周期长度。其计算公式如下: \[ T_{\text{CONV}} = \text{采样周期} + 12.5 \quad [\text{单位:ADC 时钟周期}] \] 这意味着总转换时间为采样时间固定开销之。 - **Injected Conversion Mode (注入通道模式)**: 此功能允许优先处理某些特定的 ADC 请求,在常规转换之前执行这些请求。 #### 二、VBAT 电压监测原理 为了测量电池电压(通常称为 `VBAT`),需要将其分压至适合 ADC 输入范围内的数值。大多数情况下,STM32 的 ADC 输入范围为 0 至 3.3V 或者 0 至 5V(具体取决于芯片型号)。如果实际电池电压高于此范围,则需设计简单的电阻分压电路来降低输入电压。 假设目标是检测最大值不超过 4.2V 的锂电池电压,可以选择两个阻值分别为 \( R_1 = 10kΩ \) \( R_2 = 20kΩ \) 的串联电阻构成分压网络。此时,施加于 ADC 引脚上的电压可由下述关系得出: \[ V_{\text{in\_adc}} = V_{\text{bat}} \times \frac{R_2}{R_1 + R_2} \] 因此, \[ V_{\text{bat}} = V_{\text{in\_adc}} \times \left(\frac{R_1 + R_2}{R_2}\right) \] 对于上述例子中的电阻组合而言, \[ V_{\text{bat}} = V_{\text{in\_adc}} \times 3 \] 这意味着每读取一次 ADC 数字量并乘以比例因子即可还原原始电池电压。 #### 三、软件实现部分 下面展示一段基于 HAL 库编写的小程序片段用来获取经过分压后的 VBATT 数据,并进一步推算出真实电池电压水平。 ```c #include "stm32f1xx_hal.h" uint16_t adc_raw_value; float v_bat; void init_adc(void){ __HAL_RCC_ADC1_CLK_ENABLE(); // Enable clock for ADC1 ADC_HandleTypeDef hadc1; /* Configure the global features of the ADC */ hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = DISABLE; // Disable scan mode to read single channel only. hadc1.Init.ContinuousConvMode = ENABLE; // Continuous conversion enabled. hadc1.Init.DiscontinuousConvMode = DISABLE;// Not used here since continuous is set above. hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; // Software trigger selected. hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;// Data aligned on right side within register. hadc1.Init.NbrOfConversion = 1; // Number of conversions per sequence. if(HAL_ADC_Init(&hadc1)!= HAL_OK){ // Initialize ADC peripheral with parameters defined earlier. Error_Handler(); } ADC_ChannelConfTypeDef sConfig = {0}; /** Configure Regular Channel **/ sConfig.Channel = ADC_CHANNEL_17; // Internal temperature sensor or other internal channels may also be chosen depending upon requirement. sConfig.Rank = 1; // Rank must match NbrOfConversions value from Init structure. sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES5; // Set appropriate sampling time as needed by application requirements. if(HAL_ADC_ConfigChannel(&hadc1,&sConfig)!= HAL_OK){ Error_Handler(); } } int main(){ init_adc(); while(1){ HAL_ADC_Start(&hadc1); if(HAL_ADC_PollForConversion(&hadc1,10)== HAL_OK){ adc_raw_value = HAL_ADC_GetValue(&hadc1); // Assuming full scale voltage reference is 3.3 volts and resolution is 12 bits, float vin_adc = ((float)(adc_raw_value)/4096)*3.3*3; // Multiply factor according actual divider network ratio. printf("Battery Voltage:%f\n",vin_adc); }else{ Error_Handler(); } HAL_Delay(1000); // Delay one second before next reading cycle starts again. } } ``` #### 四、注意事项 当启用看门狗功能时,可以通过调用 `ADC_AnalogWatchdogThresholdsConfig()` 函数设定上下限阈值。一旦 ADC 测得的数据超出指定区间便会触发相应的中断服务例程(ISR),从而采取保护措施比如记录日志或将数据存储到外接 Flash 当中以防断电丢失重要资料[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值