Author:XuanYu

利用ADC测量单片机内部温度

废话不多说,直接开搞。

科普

先科普一下ADC(不是 AD carry!),ADC是模数转化器,就是模拟信号转换成数字信号的东西,通常的模数转换器是将一个输入电压信号转换为一个输出的数字信号。由于数字信号本身不具有实际意义,仅仅表示一个相对大小。故任何一个模数转换器都需要一个参考模拟量作为转换的标准,而输出的数字量则表示输入信号相对于参考电压的大小。 因此,模拟数字转换器会会将模拟信号转换为表示一定比例电压值的数字信号。

举个简单的例子,对于一般的单片机上的ADC,测量电压的范围也就是输入的模拟信号的范围是0-3.3V,而转化后的数字信号范围取决于ADC的位数,假如是12位的那就是0-2^12也就是0-4096,也就是说要是输入电压是1V的话,那转化的电压就是1/3.3*4096=1240。

ADC的主要作用就是读取输入到单片机的电压等物理量,当然也可以测温度,现在我们就来用单片机自带的温度传感器测温度吧!

配置

先用中断的方式使用ADC读取电压。

首先拿出我们的单片机(我用的是STM32f407ZGT6)然后放到一边

打开cubemx配置如下:





配置ADC这里可能不同的单片机温度传感器的位置不一样,要找到自己单片机的Temperature Sensor Channel并选中,同时勾选一下NVIC Settings里的那个Enabled下面的框,开启adc的全局中断。

这里配了一个串口,方便一会输出测量的温度,操作就是选一个串口然后把最上面的mode设置成Asynchronous就可以了。

最后再配置一下时钟树,前面应该有讲我就不赘述了。

然后生成工程,开始写代码。

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}

现在最上面加这段代码,然后再按照下图操作

在cubeide主界面,选中工程,然后点击项目->属性->C/C++构建->设置->MCU Settings



把下面的两个Use都选上

这样就可以直接调用printf函数通过串口输出了。

使用ADC

然后再写一个adc的中断函数

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
HAL_ADC_PollForConversion(&hadc1 ,10); //等待adc采样结束
light_value=HAL_ADC_GetValue(hadc); //读取adc采样的数值并赋值给light_value
v=light_value*3.3/4096;
tem=((light_value*3.3/4096-0.76)/0.0025)+25; //计算温度 // printf("light_value=%d\n",light_value );
}

这个是我的单片机的温度传感器的一个电气特性,就是说adc采集的电压和实际的温度是一个正比的关系,然后第三行的Avg_Slope是斜率,也就是2.5mV/°C 然后第四行是说25°时读取的电压大约为0.76,所以就可以根据这两个算出当读取的电压值为v0时,实际的温度是(v0-0.76)/0.0025+25。

最后主函数中不断开启ADC中断就可以了。代码如下

while (1)
{
HAL_ADC_Start_IT(&hadc1);
printf("get_value=%d,V=%f\r\n",light_value,v);
printf("temp=%f\r\n",tem); //把温度值打印出来
HAL_Delay(1000);
/* USER CODE END WHILE */ /* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

然后把程序烧到单片机里,连接串口调试助手结果如下:

输出的温度大概是18°左右,因为没有室温计所以没法比较误差,但是对比当时的天气预报显示的是20°(可能科协比较冷一点)也能反映这次测量大概是比较准的。

其他ADC调用方法

也可以用一种简单的查询阻塞的方式

这个配置起来就比较简单,和中断相比就不用勾选ADC的全局中断Enable了,其他的相同。

代码的话直接在主函数里写就行,

代码我就扔个图片就好。

最后还有一种方式通过DMA采集

这个博客建议大家看一看,挺实用的。

【STM32技巧】ADC模拟量采集的几种用法_小石头有大内涵的博客-CSDN博客_stm32模拟信号采集

关于DMA的配置也可以参考文章:https://blog.csdn.net/weixin_44584198/article/details/119453399

ADC是单片机里比较基础的也是最常用的东西了,希望大家都能认真学习,有问题先 csdn再找学长问,希望大家都能有所收获。

训练题——ADC读取温度的更多相关文章

  1. X-NUCA 2017 web专题赛训练题 阳光总在风雨后和default wp

     0X0.前言 X-NUCA 2017来了,想起2016 web专题赛,题目都打不开,希望这次主办方能够搞好点吧!还没开赛,依照惯例会有赛前指导,放一些训练题让CTFer们好感受一下题目. 题目有一大 ...

  2. PAT乙级真题及训练题 1025. 反转链表 (25)

    PAT乙级真题及训练题 1025. 反转链表 (25) 感觉几个世纪没打代码了,真是坏习惯,调了两小时把反转链表调出来了,心情舒畅. 这道题的步骤 数据输入,数组纪录下一结点及储存值 创建链表并储存上 ...

  3. 日常 java+雅思+训练题1

    今天主要学了一些类似c中的一些语句,java也是一样类似的,只有一些点需要稍微注意一下,一些语句是新增的需要知道. 完完全全新学的知识就是class和instance的区别.如何创建实例.数据的封装. ...

  4. java基础集合经典训练题

    第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...

  5. 2016huas暑假集训训练题 G-Who's in the Middle

    题目链接:http://acm.hust.edu.cn/vjudge/contest/121192#problem/G 此题大意是给定一个数n 然后有n个数 要求求出其中位数  刚开始以为是按数学中的 ...

  6. 2016HUAS暑假集训训练题 G - Oil Deposits

    Description The GeoSurvComp geologic survey company is responsible for detecting underground oil dep ...

  7. c语言训练题:关于张三李四王五说谎的问题(此处用javascript实现)

    (第一篇博文) 今天在一个交流群里见他们无聊,然后找到之前收藏的一些c语言题目放出去想让他们做,结果反倒是自己不会做,于是花了很多时间去想. 原题:张三说李四在说谎,李四说王五在说谎,王五说张三和李四 ...

  8. 中南大学2018年ACM暑期集训前期训练题集(入门题) X: 又一道简单题

    简直智障,上一题V题,样例输出里面的“Case:”不要输出,到了这题又是要输出的了 #include<iostream> using namespace std; int num[1000 ...

  9. 中南大学2018年ACM暑期集训前期训练题集(入门题) J : A Simple Problem

    毒瘤哇!为什么要用long long 啊!!!这个题没有加法操作啊,为什么会爆int啊!!!! 思路: http://www.cnblogs.com/buerdepepeqi/p/9048130.ht ...

  10. 树状数组训练题1:弱弱的战壕(vijos1066)

    题目链接:弱弱的战壕 这道题似乎是vijos上能找到的最简单的树状数组题了. 原来,我有一个错误的思想,我的设计是维护两个树状数组,一个是横坐标,一个是纵坐标,然后读入每个点的坐标,扔进对应的树状数组 ...

随机推荐

  1. java-文件IO常用操作对比

    文件IO中,常用的方法如下方代码中的readMethod1~8方法所示. 测试了2.5M读100次.100M读3次.250M读1次三种情况,耗时(单位:毫秒)如下: 2.5M读100次 2.5M读10 ...

  2. MySQL下载,安装,配置环境变量【0基础小白用】

    一,下载 选择社区版的,下载地址:https://dev.mysql.com/downloads/installer/  ,选择离线安装包 二,安装 1,双击安装包文件,这里选择服务模式,会安装在默认 ...

  3. CentOS7 设置防火墙、开放指定端口操作

    1, 查看防火墙状态: firewall-cmd --state systemctl status firewalld.service 2, 开启防火墙: systemctl start firewa ...

  4. vs code 提交代码弹框提示:请确保已在git中配置您的“user.name”和“user.email” ——解决方法

    修改完项目代码,准备提交到git上,结果提交失败,弹框提示:请确保已在Git中配置您的"user.name"和"user.email" 打开终端,配置运行一下命 ...

  5. 关于flex

    flex 是 flex-grow.flex-shrink.flex-basis 的缩写. flex 的默认值是以上三个属性值的组合.假设以上三个属性同样取默认值,则 flex 的默认值是 0 1 au ...

  6. springcloud(四) - 服务治理Hystrix

    功能介绍 调用下游服务,下游因为超时.异常等原因报错的时候.hystrix保证不会出现整体异常,避免雪崩.主要策略是服务的熔断.降级   应用场景 降级:异常.超时.熔断等情况发生后,不让客户端等待返 ...

  7. win10 校验MD5值

    CertUtil -hashfile C:\xxxxx\xxx.xxx MD5   // C:\xxxxx\xxx.xxx为文件路径

  8. 性能再升级,XMeter Cloud 专业版正式上线

    去年 8 月,EMQ 正式在全球市场推出了最简单.快速的 MQTT 负载和场景测试云服务--XMeter Cloud,用户无需部署即可进行 MQTT 测试,以更低的测试成本轻松打造具有竞争力的可靠物联 ...

  9. expect语言使用之自动切换账户或自动登录远程服务器

    资料来源: (1) https://baike.baidu.com/item/expect/4598715?fr=aladdin (2) https://blog.csdn.net/gsjthxy/a ...

  10. npm config set registry https://registry.npm.taobao.org