带内部参考电压(VREFINT)校正的STM32 DMA 内置温度采集

笔者今天来介绍一下STM32ADC内置温度的采集,重点是通过内置参考电压来避免ADC参考电压VDDA对温度ADC采集的影响。
1、STM32ADC简介

  stm32F4系列ADC,逐次趋近型AD、12位、多达19个通道16个外部通道2个内部源通道1个Vbat通道

  了解ADC原理的都知道,ADC需要一个参考电压,而STM23的参考电压是VDDA。
在这里插入图片描述
  VDDA有可能随着供电电压发生改变(比如其他器件瞬时电流较大,导致供电电压拉低&#

  • 9
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
STM32ADC模块中,先测量温度通道后再测量参考电压通道需要进行一些额外的配置。在使用HAL库进行编程时,可以按照以下步骤进行配置: 1. 首先,你需要在CubeMX中开启ADC模块,并选择温度传感器参考电压通道作为ADC的输入通道。 2. 然后,在生成代码时,选择使用HAL库进行代码生成。 3. 在代码中,你需要包含stm32f4xx_hal_adc.h头文件,并定义ADC_HandleTypeDef类型的结构体变量。例如: ``` ADC_HandleTypeDef hadc; ``` 4. 接下来,你需要进行ADC的初始化配置。这可以通过HAL_ADC_Init函数来实现。在初始化时,需要设置ADC的采样分辨率、采样周期等参数。例如: ``` hadc.Instance = ADC1; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.ScanConvMode = DISABLE; hadc.Init.ContinuousConvMode = DISABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.NbrOfDiscConversion = 0; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.NbrOfConversion = 2; // 转换2次 hadc.Init.DMAContinuousRequests = DISABLE; hadc.Init.EOCSelection = ADC_EOC_SEQ_CONV; ``` 这里,我们将ADC的转换次数设置为2次,并将转换模式设置为序列转换模式。 5. 然后,你需要配置ADC的通道和触发源。这可以通过HAL_ADC_ConfigChannel函数来实现。例如: ``` ADC_ChannelConfTypeDef sConfig; sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; HAL_ADC_ConfigChannel(&hadc, &sConfig); sConfig.Channel = ADC_CHANNEL_VREFINT; sConfig.Rank = 2; HAL_ADC_ConfigChannel(&hadc, &sConfig); ``` 这里,我们将温度传感器参考电压通道分别配置为ADC的第1和第2个通道。 6. 接下来,你需要设置ADC的转换顺序。这可以通过HAL_ADC_ConfigChannel函数中的Rank参数来实现。例如: ``` sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES; HAL_ADC_ConfigChannel(&hadc, &sConfig); sConfig.Channel = ADC_CHANNEL_VREFINT; sConfig.Rank = 2; HAL_ADC_ConfigChannel(&hadc, &sConfig); ``` 这里,我们将温度传感器参考电压通道的转换顺序分别设置为1和2。 7. 最后,你可以通过HAL_ADC_Start函数来启动ADC的转换,并通过HAL_ADC_GetValue函数来读取转换结果。例如: ``` HAL_ADC_Start(&hadc); HAL_ADC_PollForConversion(&hadc, 100); temp = HAL_ADC_GetValue(&hadc); // 读取温度传感器的转换结果 HAL_ADC_PollForConversion(&hadc, 100); vref = HAL_ADC_GetValue(&hadc); // 读取参考电压通道的转换结果 ``` 这里,我们使用了轮询方式来等待转换完成,并将温度传感器参考电压通道的转换结果分别存储在temp和vref变量中。 总之,通过以上步骤,你可以使用HAL库实现先测量温度通道后再测量参考电压通道的ADC转换。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张一西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值