温度采集是产品开发过程中必不可少的,读取温度的方法有很多种,有专用温度采集芯片,温度传感器,热敏电阻等,各种方法来获取温度。今天总结一下使用热敏电阻来采集温度。
先看看热敏电阻的概念
也就是将温度变化转换为电阻阻值变化,通过通过阻值大小就能间接地判断到当前温度值。而读取电阻值实际应用中是很不方便的。如果将电阻值转换为电压值,然后通过单片机AD采样功能,读取电压值。这样相当于间接的读取到了温度值。
下面总结一下用STM8单片机,通过NTC热敏电阻读取温度值得方法。
首先看看热敏电阻的样子
选用的是5K阻值的NTC热敏电阻,它的阻值和温度对照表如下:
通过一个固定电阻和NTC热敏电阻串联分压,然后将两个电阻中间节点接入到单片机AD采样口。
ADC口接单片机AD采样口,通过AD采样功能,读取采样的电压值,然后将电压值、电阻值、温度值三个对应起来,这样就能通过电压值得变化来反应出温度的变化。
原理图中的ADC口接单片机PD6口,也就是模拟输入6口,PD5口作为串口输出口,输出读取到的采样值。硬件上电路比较简单,只需要一个最小系统,然后外部一个5K固定电阻和NTC热敏电阻就行了。下面看一下代码的实现:
首先将PD6口设置为ADC功能,通过中断读取ADC采样值。
#include "adc.h"
#include "main.h"
u16 DATAH = 0; //ADC转换值高8位
u16 DATAL = 0; //ADC转换值低8位
_Bool ADC_flag = 0; //ADC转换成功标志
//AD通道引脚初始化
void ADC_GPIO_Init( void )
{
PD_DDR &= ~( 1 << 6 ); //PD6 设置为输入 AIN6
PD_CR1 &= ~( 1 << 6 ); //PD6 设置为悬空输入
}
//ADC输入通道初始化入口参数表示通道选择
void ADC_CH_Init( u8 ch )
{
char l = 0;
ADC_CR1 = 0x00; //fADC = fMASTER/2, 8Mhz 单次转换,禁止转换
ADC_CSR = ch + 1; //控制状态寄存器 选择要 AD输入通道 如:PD2(AIN3)
ADC_CR2 = 0x00; //默认左对齐 读数据时先读高在读低
ADC_TDRL = ( 1 << ( ch + 1 ) ); //禁止相应通道 施密特触发功能 1左移ch+1位
ADC_CR1 |= 0x01; //使能ADC并开始转换
ADC_CSR |= 0x20; //EOCIE 使能转换结束中断 EOC中断使能
for( l = 0; l < 100; l++ ); //延时,保证ADC模块的上电完成 至少7us
ADC_CR1 = ADC_CR1 | 0x01; //再次将CR1寄存器的最低位置1 使能ADC 并开始转换
}
//采集PD6电压值 AIN6
u16 ReadVol_CH6( void )
{
u16 voltage = 0;
ADC_CH_Init( 5 );
if( ADC_flag )
{
ADC_flag = 0;
voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据 0--1024
//ADC_CR1 = ADC_CR1 | 0x01; //再次将CR1寄存器的最低位置1 启动下一次转换
};
return voltage;
}
//AD中断服务函数 中断号22
#pragma vector = 24 // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void ADC_Handle( void )
{
ADC_CSR &= ~0x80; // 转换结束标志位清零 EOC
//默认左对齐 读数据时先读高高8位 再读低8位
DATAH = ADC_DRH; // 读出ADC结果的高8位
DATAL = ADC_DRL; // 读出ADC结果的低8位
ADC_flag = 1; // ADC中断标志 置1
}
接下来将PD5口设置为串口发送功能:
#include "uart.h"
#include "main.h"
//在Library Options中将Printf formatter改成Large
//重新定向putchar函数,使支持printf函数
int putchar( int ch )
{
while( !( UART1_SR & 0X80 ) ); //循环发送,直到发送完毕
UART1_DR = ( u8 ) ch;
return ch;
}
//串口只用发送口,不用接收口
void Uart1_IO_Init( void )
{
PD_DDR |= ( 1 << 5 ); //输出模式 TXD
PD_CR1 |= ( 1 << 5 ); //推挽输出
}
//波特率最大可以设置为38400
void Uart1_Init( unsigned int baudrate )
{
unsigned int baud;
baud = 16000000 / baudrate;
Uart1_IO_Init();
UART1_CR1 = 0; //禁止发送和接收
UART1_CR2 = 0; //8 bit
UART1_CR3 = 0; //1 stop
UART1_BRR2 = ( unsigned char )( ( baud & 0xf000 ) >> 8 ) | ( ( unsigned char )( baud & 0x000f ) );
UART1_BRR1 = ( ( unsigned char )( ( baud & 0x0ff0 ) >> 4 ) );
// UART1_CR2_bit.REN = 1; //接收使能
UART1_CR2_bit.TEN = 1; //发送使能
// UART1_CR2_bit.RIEN = 1; //接收中断使能
}
串口只用到了发送功能,所以串口只需要初始化发送口和设置波特率就行。此处putchar(),函数是用于将printf()打印功能重映射到串口1。
下面看主函数代码
void main( void )
{
__asm( "sim" ); //禁止中断
SysClkInit();
delay_init( 16 );
Uart1_IO_Init();
Uart1_Init( 9600 );
ADC_GPIO_Init();
__asm( "rim" ); //开启中断
while( 1 )
{
val_ch6 = ReadVol_CH6();
printf( "%drn", val_ch6);
delay_ms( 200 );
}
}
主函数中每隔0.2s读取一次电压值,并通过串口发送出来。
下面通过串口波形显示软件看看采样的温度曲线。
通过曲线可以看到,温度刚开始时发生了波动,然后就趋于稳定,稳定后的采样值为500。STM8单片机的AD采样分辨率为10位,也就是采样最大值为2^10=1024,单片机为5V供电,也就是5V对应的采样值为1024,那么采样值500对应的电压值就为 500/1024*5=2.44V
可以计算出NTC当前电阻值为4.77K,通过NTC阻值和温度对照表可以看出4.77K对应的温度值在26℃左右。说明当前测量的温度值为26℃。为了方便显示温度,可以将采样的电压值和温度值做成一个表格存储在单片机中,这样每次采样到数据后,通过查表就能得到温度值了。
上一篇:STM8学习笔记---PWM互补波形输出
下一篇:STM8单片机串口发送引脚和接收引脚分开使用
推荐阅读最新更新时间:2024-11-09 23:45
推荐帖子
- 利用TMS320F2806控制AD5420
- 想请问一下有哪位高手使用过AD5420输出4-20mA的电流么,我使用的是AD5420的评估板,使用他们的软件输出控制是可以的,但是利用2806上的SPI去输出对应的控制信号始终没有电流输出,手册上说了是可以用SPI直接发送数据的,发出的数据和时序检查了都没有什么问题,想请问一下有哪位大大遇见过这样的问题么?利用TMS320F2806控制AD5420
- wangcen 微控制器 MCU
- DSP集成开发环境:CCS及DSP_BIOS的原理
- DSP集成开发环境:CCS及DSP_BIOS的原理DSP集成开发环境:CCS及DSP_BIOS的原理学习了,谢谢!谢谢谢谢谢谢学习了,谢谢!!!支持一个~~~
- 莫妮卡 微控制器 MCU
- 重新上传-2006届优秀毕业论文选
- 有多篇论文可供参考,PDF格式文件,原文件比较大,9M多,我在10月份上传时论坛限制附件的大小,分卷压缩了5卷,下载很不方便。现在网站调整了附件的大小,可以重新上传一个完整的文件了,需要朋友一次性就能下载了。11月28日重新上传。------------------------------------------------------------------------------附件是PDF格式的文件,需要用PDF阅读器才能打开啊,可到这下载一个袖珍版的阅读器,因是PDF文件中文版的
- 忙忙草 单片机
- 关于TIM1计数器
- 我想对TIM1的计数器进行如下:1、配置两对带死区的互补对称的PWM(TIM1_CH1和TIM1_CH1N,TIM1_CH2和TIM1_CH2N),配置计数模式为向上计数;2、再配置两路PWM(TIM1_CH3和TIM1_CH4),配置技术模式为中央对齐1计数模式;请问针对同一个TIM1计数器,这样设置两种计数模式可以吗?求高手解答,谢谢。关于TIM1计数器
- 506977544 stm32/stm8
- 2003—2013年赛前元器件清单与赛题对比
- 2003—2013年赛前元器件清单与赛题对比(对比强烈)2003—2013年赛前元器件清单与赛题对比http://wenku.baidu.com/view/982473eb27d3240c8447efe5http://wenku.baidu.com/view/982473eb27d3240c8447efe5
- xiayuandong 电子竞赛
- GPRS与4G网络:技术差异与应用选择
- 在移动通信的发展历程中,GPRS(GeneralPacketRadioService)和4G(Fourth-Generation)技术都扮演着举足轻重的角色。虽然两者都旨在提供无线数据传输服务,但在数据传输速率、延迟和覆盖范围等方面,它们之间存在显著的差异。数据传输速率:GPRS的传输速率相对较慢,最高只能达到每秒40千位的下载速度和20千位的上传速度。而4G技术包括LTE(Long-TermEvolution)和WiMAX(WorldwideInteroperabilit
- 成都亿佰特 RF/无线
设计资源 培训 开发板 精华推荐
- LTM8042EV 演示板、32V、1A 模块升压 LED 驱动器
- LTC3895EFE 高效 140V 至 24V 降压转换器的典型应用电路
- SPC560P-DISP、SPC56P-发现套件,用于 SPC56 P 系列 - 带有 SPC560P50L5 MCU
- CLOCK_12
- IP6505快充电路板-支持华为三星等快充协议-为手机充电宝充电
- NSI45030AT1G 单串LED恒流LED驱动器的典型应用
- 使用 Analog Devices 的 ADR363A 的参考设计
- DEMO9S08RG60E,MC9S08RG60 S08RG、RC、RD 或 RE 系列微控制器的演示板
- LT8495EFE 450kHz、宽输入范围 12V 输出 SEPIC 转换器的典型应用电路
- ov7670
- Molex紧凑型Type-C连接器 为您的设计节约宝贵空间!下载好礼送!
- 提交创意【免费赢取600元DIY物料】,参赛冲击万元大奖!2022得捷创新设计大赛火热报名中
- 下载有礼|精华课件汇编:泰克半导体器件的表征及可靠性研究交流会暨吉时利测试测量年度研讨会
- TI 嵌入式产品研讨会视频曝光,下载有礼!
- 泰克MDO3000系列示波器结合MDO3PWR功率分析模块 立即询价享春季好礼!
- 有奖直播预报名|与英飞凌一同探寻网络摄像机的黑科技
- 如何读懂牛掰的USB Tybe-C新闻稿!
- EEWorld邀你来拆解(第四期):热门充电宝大拆解
- TI 技术大咖带你领略独一无二的MCU世界 推荐、抢楼全有礼!
- 有奖直播:AC/DC 在 ATX 及 Server 电源解決方案及应用 报名开始啦!