训练题——ADC读取温度
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读取温度的更多相关文章
- X-NUCA 2017 web专题赛训练题 阳光总在风雨后和default wp
0X0.前言 X-NUCA 2017来了,想起2016 web专题赛,题目都打不开,希望这次主办方能够搞好点吧!还没开赛,依照惯例会有赛前指导,放一些训练题让CTFer们好感受一下题目. 题目有一大 ...
- PAT乙级真题及训练题 1025. 反转链表 (25)
PAT乙级真题及训练题 1025. 反转链表 (25) 感觉几个世纪没打代码了,真是坏习惯,调了两小时把反转链表调出来了,心情舒畅. 这道题的步骤 数据输入,数组纪录下一结点及储存值 创建链表并储存上 ...
- 日常 java+雅思+训练题1
今天主要学了一些类似c中的一些语句,java也是一样类似的,只有一些点需要稍微注意一下,一些语句是新增的需要知道. 完完全全新学的知识就是class和instance的区别.如何创建实例.数据的封装. ...
- java基础集合经典训练题
第一题:要求产生10个随机的字符串,每一个字符串互相不重复,每一个字符串中组成的字符(a-zA-Z0-9)也不相同,每个字符串长度为10; 分析:*1.看到这个题目,或许你脑海中会想到很多方法,比如判 ...
- 2016huas暑假集训训练题 G-Who's in the Middle
题目链接:http://acm.hust.edu.cn/vjudge/contest/121192#problem/G 此题大意是给定一个数n 然后有n个数 要求求出其中位数 刚开始以为是按数学中的 ...
- 2016HUAS暑假集训训练题 G - Oil Deposits
Description The GeoSurvComp geologic survey company is responsible for detecting underground oil dep ...
- c语言训练题:关于张三李四王五说谎的问题(此处用javascript实现)
(第一篇博文) 今天在一个交流群里见他们无聊,然后找到之前收藏的一些c语言题目放出去想让他们做,结果反倒是自己不会做,于是花了很多时间去想. 原题:张三说李四在说谎,李四说王五在说谎,王五说张三和李四 ...
- 中南大学2018年ACM暑期集训前期训练题集(入门题) X: 又一道简单题
简直智障,上一题V题,样例输出里面的“Case:”不要输出,到了这题又是要输出的了 #include<iostream> using namespace std; int num[1000 ...
- 中南大学2018年ACM暑期集训前期训练题集(入门题) J : A Simple Problem
毒瘤哇!为什么要用long long 啊!!!这个题没有加法操作啊,为什么会爆int啊!!!! 思路: http://www.cnblogs.com/buerdepepeqi/p/9048130.ht ...
- 树状数组训练题1:弱弱的战壕(vijos1066)
题目链接:弱弱的战壕 这道题似乎是vijos上能找到的最简单的树状数组题了. 原来,我有一个错误的思想,我的设计是维护两个树状数组,一个是横坐标,一个是纵坐标,然后读入每个点的坐标,扔进对应的树状数组 ...
随机推荐
- VS2010查看DLL导出函数的方法
在window下查看动态库的导出函数可以用vs自带的Dependenc工具:对于VC6.0,VC所带的Depends软件,在VC6安装目录下的tools文件夹里面,可以直接运行. VS2010中没有了 ...
- TCP三次握手四次挥手内容及步骤
TCP特性 1.工作在传输层 2.面向连接的协议 3.全双工协议 4.半关闭 5.错误检查 6.将数据打包成段,排序 7.确认机制 8.数据恢复.重传 9.流量控制.滑动窗口 10.拥塞控制,慢启动和 ...
- pands 编码知识
一,pandas功能 1,基于numpy , 分析结构化数据. 二,常用基础知识编码练习 包括数据类型,数据操作,比如索引,分片 ,分组聚合 ,排序 过滤等等数分常见操作代码 # coding=utf ...
- WPF-UI框架MahApps.Metro使用教程
参考教程:https://www.shuzhiduo.com/A/xl561ZaoJr/ 一,MahApps.Metro安装 1,项目中引用"MahApps.Metro.dll"[ ...
- oracle数据库安装出现的问题
根据相关安装教程,安装好oracle后,使用plsql连接时,不能成功连接时: 1.检查相关的环境变量等是否配置正确 2.认真看清楚 oracle客户端的相关配置 3.出现这个问题(我的是没有选择当前 ...
- js获取字符串中含有某个字符个数
得到字符串含有某个字符的个数 /** * 获取字符串中某字符的个数 * @param str 字符串 * @param char char为某字符 * @returns String */ const ...
- FPGA 原理、结构、开发流程简述
简介本文主要介绍了博主在阅读天野英晴主编的<FPGA 原理和结构>一书时的读书笔记,方便更好的了解和入门 FPGA.本博客图片均来自于参考文献 [1]. FPGA 特性和粒度FPGA 是一 ...
- css 卡片hover效果
.card { height: 430px; width: 100%; background:#ffffff; border:1px solid #eaeefb; border-radius:5px; ...
- return chain.filter(exchange); 这句啥意思
答:继续往后执行过滤器,如果不调用这句代码,请求就不会发给控制器了,如果当前执行的过滤器后面还有过滤器,执行那个过滤器,如果没有,就执行控制器. 那我此时想一个请求取消token校验,得在这里加吗? ...
- hooks组件中,使用防抖节流的方法。
在类组件中,使用节流函数可以在componentDidMount中定义. 而在hooks函数中,该怎么定义呢,我们一起看看. 要使用useCallback包起来,返回一个记忆的缓存函数,这样才能达到节 ...