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( "%d\r\n", 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℃。为了方便显示温度,可以将采样的电压值和温度值做成一个表格存储在单片机中,这样每次采样到数据后,通过查表就能得到温度值了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值