0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

读取STM32芯片温度与当前供电电压

撞上电子 2023-11-20 08:00 次阅读

在做低功耗产品的时候读取芯片温度和当前电压是十分重要的一件事情。通过当前供电电压可以知晓电池电量是否低于水平值实现电池缺电报警。读取芯片温度也很重要,可以在使用内部振荡器的时候通过校准算法根据温度变化来实现实时校准芯片。如果不使用或尽量少使用外部元器件来实现这两个功能是摆在我们面前一个很重要的事情,遗憾的是现在网上的资料非常混乱,基本上直接使用总有点那么别扭。如何读取芯片电压?当然肯定是需要用ADC了。不过这个时候需要有一个参考电压作为比对,很多人提出在外面使用一组LDO实现参考电压,那样其实LDO本身也有一定能耗,在我们追求极致低消耗的时候也不适合。当然很多人说了为什么不使用PVD来做,那么我来说说,PVD本身是做电压曲线检测的,如果你要求低于2.5V就报警,你会发现如果你启动电压<2.5V的时候无法检测出来。所以还是自己做。还好STM32L0单片机在内部有一个核心电压,并且有一个寄存器VREFINT_CAL值可以用作基准参考从而计算出相当比较精准的电压。经过测量,误差还是基本满足电池供电检测的要求。如何读取芯片温度?在STM32L0下,只要读到当前电压,配合温度寄存器,就可以取得当前温度了。当前温度误差比较大,即使高精度采样,为了节省运算时间,误差还是有3度的误差,因此这个地方需要宽泛一些。

#include "stm32l0xx_ll_adc.h" //需要这个库实现公式计算//初始化void init_adc1(void){ ADC_ChannelConfTypeDef sConfig;
hadc.Instance = ADC1; hadc.Init.OversamplingMode = DISABLE; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV1; hadc.Init.Resolution = ADC_RESOLUTION_12B;//ADC_RESOLUTION_12B; hadc.Init.SamplingTime = ADC_SAMPLETIME_160CYCLES_5; //160.5cycles如果低于39.5cycles温度采样精准度不够 hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.ContinuousConvMode = DISABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc.Init.DMAContinuousRequests = DISABLE; hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED; hadc.Init.LowPowerAutoWait = DISABLE; hadc.Init.LowPowerFrequencyMode = DISABLE; hadc.Init.LowPowerAutoPowerOff = DISABLE; if (HAL_ADC_Init(&hadc) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); }/**Configure for the selected ADC regular channel to be converted. */ sConfig.Channel = ADC_CHANNEL_VREFINT; //初始化VREFINT_CAL参考电压 sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } sConfig.Channel = ADC_CHANNEL_TEMPSENSOR; //初始化芯片温度传感器 sConfig.Rank = ADC_RANK_CHANNEL_NUMBER; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); }}//读取adc1值uint16_t readchannel_adc1(uint32_t Channel){ ADC_ChannelConfTypeDef adcConf; uint16_t adcData = 0; /* wait the the Vrefint used by adc is set */ while (__HAL_PWR_GET_FLAG(PWR_FLAG_VREFINTRDY) == RESET) {};//启动CLK时钟 __HAL_RCC_ADC1_CLK_ENABLE();
/*calibrate ADC if any calibraiton hardware*/ HAL_ADCEx_Calibration_Start(&hadc, ADC_SINGLE_ENDED );
/* Deselects all channels*/ adcConf.Channel = ADC_CHANNEL_MASK; adcConf.Rank = ADC_RANK_NONE; HAL_ADC_ConfigChannel( &hadc, &adcConf);
/* configure adc channel */ adcConf.Channel = Channel; adcConf.Rank = ADC_RANK_CHANNEL_NUMBER; HAL_ADC_ConfigChannel( &hadc, &adcConf);

/* Start the conversion process */ HAL_ADC_Start(&hadc);
/* Wait for the end of conversion */ HAL_ADC_PollForConversion( &hadc, HAL_MAX_DELAY );
/* Get the converted value of regular channel */adcData+=HAL_ADC_GetValue(&hadc);
__HAL_ADC_DISABLE(&hadc);
__HAL_RCC_ADC1_CLK_DISABLE();
return adcData;}//具体调用代码void main(void){ init_adc1(); //完成初始化 uint16_tvdda_mV=__LL_ADC_CALC_VREFANALOG_VOLTAGE(readchannel_adc1(ADC_CHANNEL_VREFINT),LL_ADC_RESOLUTION_12B);//取得当前VDDA的电压,单位mV uint16_t temp_degress = __LL_ADC_CALC_TEMPERATURE(vdda_mV,readchannel_adc1(ADC_CHANNEL_TEMPSENSOR),LL_ADC_RESOLUTION_12B); //取得当前的温度,单位摄氏度}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    452

    文章

    50196

    浏览量

    420701
  • 电压
    +关注

    关注

    45

    文章

    5536

    浏览量

    115484
  • STM32
    +关注

    关注

    2264

    文章

    10854

    浏览量

    354241
收藏 人收藏

    评论

    相关推荐

    给INA116芯片供电时,供电电压采用正负3.3V可行吗?

    给INA116芯片供电时,供电电压采用正负3.3V可行么。技术手册上给的是4.5~18,但是我在测试某型号表时发现INA116供电
    发表于 09-03 06:06

    stm32读取boot引脚状态

    STM32微控制器中,Boot引脚(通常指的是BOOT0和BOOT1引脚)的状态决定了设备启动时的引导模式。这些引脚的状态在复位时被读取,并据此选择启动哪块存储器。比如,STM32F103系列
    的头像 发表于 08-22 09:48 940次阅读

    AMC1200进行采样电压,测试时发现给芯片供电,无输入电压时仍有纹波,为什么?

    AMC1200芯片进行采样电压,输入前端用电阻分压,测试时发现给芯片供电,无输入电压时仍有纹波;去掉
    发表于 08-20 06:37

    第六章-V1.5 STM32 ADC读取电压 ADC采样电压 STM32f103c8t6adc采集电压

    STM32智能小车 库函数开发。功能:循迹、避障、跟随、遥控、电池电压显示等。
    的头像 发表于 08-15 16:23 669次阅读
    第六章-V1.5 <b class='flag-5'>STM32</b> ADC<b class='flag-5'>读取</b><b class='flag-5'>电压</b> ADC采样<b class='flag-5'>电压</b> <b class='flag-5'>STM32</b>f103c8t6adc采集<b class='flag-5'>电压</b>

    ESP8285 ADC可以读取的最大电压是多少?

    到接近 0V,但在 0ºC 以下,电压将上升到 1.5V 或 2V。ADC引脚上的这种电压会损坏ESP8285芯片吗?我们不需要在低于0ºC的温度下进行测量,因此我们不介意始终
    发表于 07-08 06:55

    示波器如何读取电压

    示波器作为电子测量领域的重要工具,其主要功能之一是读取电路中的电压值。对于电子工程师和技术人员而言,准确地读取电压值是进行电路分析、故障诊断和优化的基础。本文旨在详细介绍示波器
    的头像 发表于 05-14 17:02 4492次阅读

    如何使用STM32读取LTC2983的温度值?

    使用STM32读取LTC2983的温度值 遇到了点问题 那个大佬用过 可以帮帮忙嘛
    发表于 04-11 07:21

    基于STM32U5片内温度传感器正确测算温度实战经验分享

    STM32 在内部都集成了一个温度传感器,STM32U5 也不例外。这个位于晶圆上的温度传感器虽然不太适合用来测量外部环境的温度,但是用于监
    的头像 发表于 02-22 17:27 3878次阅读
    基于<b class='flag-5'>STM32</b>U5片内<b class='flag-5'>温度</b>传感器正确测算<b class='flag-5'>温度</b>实战经验分享

    CYPRESS MCU CY8C5888FNI-LP214是否支持温度供电电压监控?

    CYPRESS MCU CY8C5888FNI-LP214是否支持温度供电电压监控?如果支持,如何实现?谢谢。
    发表于 02-21 07:57

    芯片的AD/DA口基准电压芯片供电电压的关系?

    速率,芯片在进行AD/DA转换时,用到一个基准电压,这个基准电压芯片供电电压是否有关联?而且
    发表于 01-14 00:40

    stm32f103c8t6读内部温度

    STM32F103C8T6是一款32位的Cortex-M3内核微控制器,它拥有丰富的外设资源和强大的计算能力,可以广泛应用于各种嵌入式系统中。其中一个重要的功能是能够使用内部传感器来读取芯片
    的头像 发表于 01-08 13:48 3222次阅读

    stm32怎么读取串口发来的指令

    读取串口发来的指令是嵌入式系统中一项常见的任务,特别是在与外部设备进行通信时。在STM32系列微控制器中,提供了多个串口接口(USART、UART等),可以用于读取和处理串口接收到的数据。下面将详细
    的头像 发表于 01-07 17:08 2562次阅读

    供电系统的供电质量电压指标

    供电系统的供电质量对于现代社会的正常运作具有至关重要的作用。在电力系统中,电压是衡量电能质量的重要指标之一。电压的质量直接影响到电力设备的安全运行和电力用户的正常工作。因此,对
    的头像 发表于 12-13 17:41 1161次阅读

    AD5144无法通过SPI读取和修改内部游标值怎么解决?

    STM32作为主控芯片发送读取、修改AD5144游标值的指令;而AD5144不返回相应游标值,而是返回STM32下发的指令。 VDD端由5.45V模拟
    发表于 12-05 08:00

    求助,求推荐低温度系数运放和电压芯片

    要在-20到40度的环境温度下,产生一个稳定的500-100mv左右的单一固定参考电压,用作系统标定。电压可驱动50欧姆负载。 要求温度系数越小越好,带宽不做要求,只要求精度。 初
    发表于 11-23 07:12