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); //取得当前的温度,单位摄氏度}

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

    关注

    463

    文章

    54420

    浏览量

    469223
  • 电压
    +关注

    关注

    45

    文章

    5792

    浏览量

    122380
  • STM32
    +关注

    关注

    2313

    文章

    11195

    浏览量

    374608
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STA1052:多功能光盘读取芯片的技术剖析

    STA1052:多功能光盘读取芯片的技术剖析 在电子设备的海洋中,光盘读取技术一直是重要的组成部分。今天,我们就来深入了解一款名为STA1052的芯片,它在光盘
    的头像 发表于 04-16 14:05 84次阅读

    深入解析NCT7290:多功能电压温度监测芯片的强大魅力

    深入解析NCT7290:多功能电压温度监测芯片的强大魅力 在电子设计领域,一款性能卓越的监测芯片往往能为整个系统带来质的提升。NCT7290作为一款集多种功能于一身的
    的头像 发表于 04-11 14:30 106次阅读

    在昉·星光开发板上结合使用温度传感器控制风扇转速

    内,高电平保持的时长比,从而控制周期内的平均电压: 在本次课程中,我们先从温度传感器读取当前温度值,然后进过一定的转换,再设定PWM输
    发表于 03-11 08:10

    XZ61N 检测电压在小温度漂移的情况下保持极高的精度

    这系列芯片是使用 CMOS 技术开发的高精度、低功耗、小封装电压检测芯片。检测电压在小温度漂移的情况下保持极高的精度。输出配置是N-chan
    发表于 02-04 10:40

    ADC芯片温度计算出来的温度有时错的离谱,为什么?

    以下是库函数里关于温度计算的要点,芯片手册里也是这样描述的: 读取ADC参考电压1.5V时的温度传感器的测量
    发表于 01-22 06:39

    ESP32S3读取NTC热敏电阻阻值计算出当前环境温度

    本文介绍了热敏电阻模块的工作原理及应用,通过ESP32开发板ADC获取热敏电阻的电压推算出热敏电阻的阻值后进而推算出热敏电阻周围的温度值。
    的头像 发表于 01-05 17:16 833次阅读
    ESP32S3<b class='flag-5'>读取</b>NTC热敏电阻阻值计算出<b class='flag-5'>当前</b>环境<b class='flag-5'>温度</b>

    CW32温度传感器的应用

    ) Vref是当前 ADC 模块的参考电压,取值为 1.5V 或 2.5V。 T0是 8 位的初始校准温度值,记录在芯片的 FLASH 存储器中,其地址是 0x00012609,单
    发表于 12-15 08:18

    150V耐压GPS供电芯片ICH6203G#芯片

    供电芯片
    惠海小伟
    发布于 :2025年12月10日 11:22:25

    【EASY EAI Nano-TB(RV1126B)开发板试用】+2、读取芯片内部温度

    完成 3.读取芯片温度 输入以下信息: 如果让运行:\'sudo apt update\'则运行。 等待完成后,再次操作,读取温度
    发表于 11-20 21:09

    AD5628-1和ad5628-2是不同的供电电压吗?

    AD5628-1和ad5628-2是不同的供电电压吗?ad5628-2供电设计3V,设置内部的基准,refout引脚上没有电压,更新寄存器芯片
    发表于 09-09 07:27

    如何通过测试电源来确认它的供电电压是否充足?

    电源模块的供电电压也就输出电压,输出电压的变化幅度越小,则说明供电的电源模块越稳定,而一款能稳定输出的电源模块可以保障产品的安全性和稳定性,
    的头像 发表于 09-01 18:18 1356次阅读
    如何通过测试电源来确认它的<b class='flag-5'>供电</b><b class='flag-5'>电压</b>是否充足?

    STM32驱动ADS1256串口输出-AD转换

    文章介绍了如何使用STM32通过SPI接口初始化并驱动ADS1256高精度AD转换器,包括ADS1256的芯片特点、引脚说明、模块配置、程序初始化以及实验中的接线和现象。在实验中,通过读取各个通道的AD值并转换为
    的头像 发表于 07-01 14:59 2510次阅读
    <b class='flag-5'>STM32</b>驱动ADS1256串口输出-AD转换

    【RA4L1-SENSOR】+ RA4L1-SENSOR开发板之读取RA4L1 Sensor开发板芯片温度

    \\\\n\", string_die_temp, a); printf(\"RA4L1 Sensor开发板芯片当前温度是: %s 度\\\\r\\\\n\"
    发表于 06-13 15:29

    通过stm32控制AD9914遇到芯片问题

    控制程序,使用的usb5V供电,上电就很烫,这正常吗?如果给芯片写代码,初始化时候,如果控制了里面的寄存器CFR3,就会把供电电压拉低一半。控制其它寄存器CFR1或者CFR2与CFR4
    发表于 06-04 11:08

    零知开源——STM32F1驱动MAX31865读取三线PT100温度传感器

    本教程详细介绍了如何使用零知标准板(STM32F103RBT6)通过MAX31865模块读取三线制PT100铂电阻温度,并通过I2C OLED实时显示温度值和电阻值。教程内容包括硬件接
    的头像 发表于 05-23 18:05 3323次阅读
    零知开源——<b class='flag-5'>STM32</b>F1驱动MAX31865<b class='flag-5'>读取</b>三线PT100<b class='flag-5'>温度</b>传感器