STM8学习笔记---NTC热敏电阻的使用

发布者:Changsheng520最新更新时间:2021-10-31 来源: eefocus关键字:STM8  NTC  热敏电阻 手机看文章 扫描二维码
随时随地手机看文章

温度采集是产品开发过程中必不可少的,读取温度的方法有很多种,有专用温度采集芯片,温度传感器,热敏电阻等,各种方法来获取温度。今天总结一下使用热敏电阻来采集温度。


先看看热敏电阻的概念

也就是将温度变化转换为电阻阻值变化,通过通过阻值大小就能间接地判断到当前温度值。而读取电阻值实际应用中是很不方便的。如果将电阻值转换为电压值,然后通过单片机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  NTC  热敏电阻 引用地址:STM8学习笔记---NTC热敏电阻的使用

上一篇:STM8学习笔记---PWM互补波形输出
下一篇:STM8单片机串口发送引脚和接收引脚分开使用

推荐阅读最新更新时间:2024-11-09 23:45

STM8S学习笔记之四(STM8 time1)
这几天一直纠结于使用STM8库还是用底层寄存器写程序,用了用IAR和库的搭配,方便时肯定的,但是呢,鉴于我现在工作使用的就是STM32的单片机+STM32库,考虑再三,我还是用底层吧,这样两个就可以互补了,既不会太依赖于库,又对寄存器的操作有更深的了解。。只是都是相通的,是的,相通的。。 以下是从技术手册上粘贴的: TIM1由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。 本章中使用i来代表1、2、3、4,分别对应于四个不同的捕获/比较通道。 高级控制定时器适用于许多不同的用途: ●基本的定时 ●测量输入信号的脉冲宽度(输入捕获) ●产生输出波形(输出比较
[单片机]
STM8的学习—LED
无论学习什么都要先从简单的东西入手,驱动小灯都会成为学习者的第一课,让小灯闪烁,通过配置IO口的状态,让IO口隔间隔的输出高低电平,间隔时间为ms级的否则认的肉眼难以设别小灯的亮灭! 程序如下: #include iostm8s105c6.h unsigned int i; //时钟初始化 void CLK_Init(void) { CLK_CKDIVR = 0x00; } //GPIO初始化 void GPIO_Init(void) { PD_DDR|=0x01; //PD0输出,其余保持原功能 PD_CR1|=0x01; //对应位设置为推挽输出 PD_CR2|=0x00; //输出最
[单片机]
STM8芯片应用注意事项
以下是笔者将ST的Custom_HID例程修改为 自定义USB设备 例程时总结出来的,因为笔者也是刚刚学USB开发不久,某些方面理解错误在所难免,请各位大虾指正。 一、usb_desc.c文件 根据你程序使用的通信方式修改。usb_desc.h文件中定义要根据usb_desc.c文件中的数组的大小;ConfigDescriptor 下添加需要处理的端点;根据需要添加或删除报告描述符(主要用于HID)和CDC接口描述符(主要用于实现USB转串口)等。具体方法可以下载个 电脑圈圈 使用D12编写的例子。 二、Usb_conf.h文件: 1、修改需要处理那些中断 CNTR_CTRM 处理数据正确传输后控制,比如说响应主机
[单片机]
STM8学习笔记三----按键实验
今天做按键的实验。青风的源码中按键的引脚定义似乎有错,和开发板原理图中的不一致。 正确的引脚定义应该是: #define KEY3_PIN GPIO_PIN_3 #define KEY2_PIN GPIO_PIN_4 #define KEY1_PIN GPIO_PIN_0 #define KEY3_PORT GPIOE #define KEY2_PORT GPIOE #define KEY1_PORT GPIOI 我编写的main主函数代码: #include stm8s.h #include stm8s_clk.h #include led.h #include ke
[单片机]
模拟串口--基于STM8普通IO口的模拟串口驱动程序
标准串口通讯数据的格式为:起始位(1) + 数据位(8) + 校验位(1) + 停止位(1) 串口通讯另外一个重要的的部分是设置波特率,波特率就是1秒钟内串口所传输的Bit(位)数。 关于采样频率:为了较小读取或者发送串行数据的误差,我们采取了在N(我用的是4次)次中断中,取固定位置的读取的数据。 我以stm8中9600波特率计算的过程为例:(1秒钟传输9600位) 可以计算出传输1位所需要的时间 T1 = 1/9600 约为104us 由此可知,发送一位数据,定时器中断的时间间隔应为 104/4 = 26us(4倍采样频率) stm8 内部晶振频率为16M,我采用8分频也就是2M,故MCU震荡周期为 1/
[单片机]
STM8串口接收中断无法进入问题(STM8L051/101F3)
前言 最近弄了一块STM8L051/101F3开发板,打算简单玩一玩。在我IO和定时器都没问题后我开始配置串口UART时发现接收中断始终无法进入,发送中断都是没问题的,之后我就开始了为期两天的问题排查,几乎排查所有可能的问题点。 STM8L051/101F3开发板 代码 我这里的MCU是STM8L051F3,使用的STM8库开发,代码如下仅供参考: main.c #include stm8l15x.h void Clock_Config(void) { CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1); //系统时钟分频器 CLK_SYSCLKSourceSwitchCmd(
[单片机]
<font color='red'>STM8</font>串口接收中断无法进入问题(STM8L051/101F3)
STM8单片机】---时钟配置小感悟
今天闲着没事,在博客中想总结一下之前工作时用到的STM8时钟代码,本来觉的很简单,随便写写就完事了。这一细看让我慌了一下,还是有没有搞懂的地方。经过一个下午的努力,并且在好朋友的帮助下,终于稍微理清了一些头绪,且记下来,不对了日后再做补充。 首先上STM8单片机的时钟树图片。 这个图是时钟树的上半部分截图。从图中可以清楚的看到STM8的时钟树相对比STM32还是简单了很多。时钟来源有3种,外部晶振、内部RC 16MHz、内部RC 128KHz。CPU的运行CLK来自Fmaster,可以进行128/64/32/16/8/4/2/1分频,也就是最快等于Fmaster。如果是来自内部RC的16MHz则可以首先进行一次预分频HSI
[单片机]
【<font color='red'>STM8</font>单片机】---时钟配置小感悟

推荐帖子

利用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/无线
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved