在做低功耗产品的时候读取芯片温度和当前电压是十分重要的一件事情。

通过当前供电电压可以知晓电池电量是否低于水平值实现电池缺电报警。

读取芯片温度也很重要,可以在使用内部振荡器的时候通过校准算法根据温度变化来实现实时校准芯片(另外文章有介绍)。

如果不使用或尽量少使用外部元器件来实现这两个功能是摆在我们面前一个很重要的事情,遗憾的是现在网上的资料非常混乱,基本上直接使用总有点那么别扭。

在这里hoowa告诉你测试有效的方法。

如何读取芯片电压:

当然肯定是需要用ADC了。不过这个时候需要有一个参考电压作为比对,很多人提出在外面使用一组LDO实现参考电压,那样其实LDO本身也有一定能耗,在我们追求极致低消耗的时候也不适合。

当然很多人说了为什么不使用PVD来做,那么我来说说,PVD本身是做电压曲线检测的,如果你要求低于2.5V就报警,你会发现如果你启动电压< 2.5V的时候无法检测出来。所以还是自己做把。

还好STM32L0单片机在内部有一个核心电压,并且有一个寄存器VREFINT_CAL值可以用作基准参考从而计算出相当比较精准的电压。经过hoowa测量,误差还是在0.0X V左右的基本满足电池供电检测的要求。

不过网上很多资料用参考值1.224作为核心电压量,其实这样不够精准,因为实际核心电压是有偏移的。而且就VREFINT_CAL这个寄存器,取出来以后要通过运算得到mV级电压情况。

但是运算公式原理很简单,通过VDDA接入实际电池供电,对比芯片核心相对稳定的1.2xV电压,实现检测当前实际输入电压,可惜的是网上公式很混乱。

还好!!还好的是,其实STM32L0 的HAL级库中已经存在运算公式宏了,直接用就好了。

如何读取芯片温度:

在STM32L0下,只要读到当前电压,配合温度寄存器,就可以取得当前温度了。当前温度误差比较大,即使高精度采样,为了节省运算时间,误差还是存在+ / - 3度的情况,因此这个地方需要宽泛一些。

好,废话少说上代码:

//请使用HAL级库啊,不对,反正STM32L0也没有STDLIB库
#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_t vdda_mV = __LL_ADC_CALC_VREFANALOG_VOLTAGE(readchannel_adc1(ADC_CHANNEL_VREFINT),LL_ADC_RESOLUTION_12B); //取得当前VDDA的电压,单位mVuint16_t temp_degress = __LL_ADC_CALC_TEMPERATURE(vdda_mV,readchannel_adc1(ADC_CHANNEL_TEMPSENSOR),LL_ADC_RESOLUTION_12B); //取得当前的温度,单位摄氏度
}

转载于:https://blog.51cto.com/5796396/2326418

STM32L0 读取芯片温度与当前供电电压 STM32L051C8T6相关推荐

  1. 使用STM32CubeMX求得CPU芯片温度

    继续完成后台网友询问: 如何使用STM32CubeMX设计代码框架,然后实现CPU内置温度传感器测量CPU芯片温度,然后以串口输出的形式输出芯片的温度值,数据更新周期1000ms. STM32Cube ...

  2. Android 系统(112)---Android系统读取 CPU温度(MTK平台)

    Android系统读取 CPU温度(MTK平台) 一.[MTK 平台]读取温度命令 1.查看类型是否是 CPU adb shell "cat /sys/class/thermal/therm ...

  3. STM32F103单片机读取芯片自身ID

      每一个STM32单片机出厂的时候都有全球唯一的ID,当在数据安全性比较高的地方,需要对每一个接入系统的芯片进行身份验证,那么这个芯片自身的ID号就可以作为它的身份信息. 产品唯一的身份标识非常适合 ...

  4. 基于FPGA的IIC读取LM74A温度值

    基于FPGA的IIC读取LM74A温度值 IIC总线概述 采用串行总线技术可以使系统的硬件设计大大简化.系统的体积减小.可靠性提高.同时,系统的更改和扩充极为容易.常用的串行扩展总线有: I2C (I ...

  5. 20210427瑞芯微RK3399在Android10下查看芯片温度

    20210427瑞芯微RK3399在Android10下查看芯片温度 2021/4/30 16:52 开发板:天启(t-firefly)AIO-3399J https://www.t-firefly. ...

  6. STM32CubeMX | HAL库的ADC多通道数据采集(轮训、DMA、DMA+TIM)、读取内部传感器温度

    STM32CubeMX | HAL库的ADC多通道数据采集(轮训.DMA.DMA+TIM).读取内部传感器温度 目录 STM32CubeMX | HAL库的ADC多通道数据采集(轮训.DMA.DMA+ ...

  7. imx6ul linux读取DS18B20温度

    imx6ul linux读取DS18B20温度 首先尝试加载模块 root@imx6ulevk:~# modprobe w1-gpio modprobe: FATAL: Module w1-gpio ...

  8. 【KV260】利用XADC生成芯片温度曲线图

    利用XADC生成芯片温度曲线图 一.打开Vivado,选择Open Hardware Manager 二.点击Open target,在弹出的窗口选择Auto Connect 三.选中SysMon,再 ...

  9. 芯片热阻系数学习 芯片温度

    1:以前一直没搞IC芯片的温度问题,今天在公司花了半天的时间(人笨,花的时间就长!)仔细学习了. 以下资料大部分摘自网络. 那最常用的二极管来说,若流过二极管的电流是1A,二极管压降0.5V,很容易算 ...

最新文章

  1. oralce rollup 小计合计_总计与小计–WITH ROLLUP
  2. 解决在Tomcat上手动部署WAR服务器不能自动解压的方法
  3. 似水流年,美丽清华园
  4. Could not find 'cudnn64_6.dll'
  5. kafka副本数据同步策略
  6. jqgrid 列表条件查询的几步关键操作
  7. 编程高手必学的内存知识02:深入理解栈
  8. ASP.NET Aries 4.0 开源发布:已完成基础功能优化重写
  9. glibc之pthread_mutex_t/pthread_cond_t实现原理(十七)
  10. MSP430之自动增益程控放大main备份
  11. mysql group by rowid_MySQL里面的group by问题浅析
  12. Roboware Studio 下载
  13. JavaCV 绘制多边形
  14. Alt属性和Title属性
  15. 分位数回归--基于R
  16. 死党教会我的编程”记忆大法“,安排!不看可别后悔
  17. 如何下载linux内核头文件,在Linux系统上安装Linux内核头文件的教程
  18. 1020:Anniversary Cake
  19. CSS通过blur实现高斯模糊
  20. python k线顶分型_顶分型和底分型的确认及K线包含处理

热门文章

  1. Octavia API接口慢问题排查引发的思考
  2. SpringCloud Alibaba Sentinel断路器介绍与控制台搭建
  3. 基于java的九宫格求解程序。以荷兰数学家设计的世界最难九宫格为例。
  4. spark BlockManager如何实现shuffle
  5. Python元组、数组、列表的区别
  6. RocketMQ高性能通信实现机制源码精读
  7. vuex mysql_Vue插件---Vuex(仓库,数据库)
  8. JVM优化系列-JVM G1 垃圾收集器
  9. Docker生产环境技术栈有哪些
  10. linux中断底半部机制