这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战
STM8单片机虽然是8为单片机,但是功能还是挺强大的,今天就来实现一下STM8单片机ADC的模拟看门狗功能。
官方介绍如下:
看门狗的功能大家都知道,而这个模拟看门狗又是什么东西呢?简单的说就是这个模拟看门狗可以实时监控ADC采样的数据,当采样的数据值小于设置的最小值或者大于设置的最大值时,单片机就会触发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 << 3 ); //PD3 设置为输入 电流
PD_CR1 &= ~( 1 << 3 ); //PD3 设置为悬空输入
}
void ADC_CH_Init( u8 ch )
{
char l = 0;
ADC_CR1 = 0x00; //fADC = fMASTER/2, 8Mhz 单次转换,禁止转换
ADC_CR1 |= ( 1 << 1 ); //开启连续转换模式
ADC_CSR = ch; //控制状态寄存器 选择要 AD输入通道 如:PD2(AIN3)
ADC_CR2 = 0x00; //默认左对齐 读数据时先读高在读低
ADC_TDRL = ( 1 << ch ); //禁止相应通道 施密特触发功能 1左移ch+1位
ADC_CR1 |= 0x01; //使能ADC并开始转换
//设置上限门槛值
ADC_HTRH = ( u8 )( 800 >> ( u8 )2 ); //存放10位数据的高8位
ADC_HTRL = ( u8 )800; //存放10位数据的低2位
//设置下限门槛值
ADC_LTRH = ( u8 )( 300 >> ( u8 )2 ); //存放10位数据的高8位
ADC_LTRL = ( u8 )300; //存放10位数据的低2位
ADC_CSR |= 0x10; // 使能看门狗中断
for( l = 0; l < 100; l++ ); //延时,保证ADC模块的上电完成 至少7us
ADC_CR1 = ADC_CR1 | 0x01; //再次将CR1寄存器的最低位置1 使能ADC 并开始转换
}
//采集PD2电压值
u16 ReadVol_CH3( void )
{
u16 voltage = 0;
while( ( ADC_CSR & 0x80 ) == 0 ); //等待转换结束
if( ADC_CSR & 0x80 )
{
ADC_CSR &= 0x7F;
DATAH = ADC_DRH; // 读出ADC结果的高8位
DATAL = ADC_DRL; // 读出ADC结果的低8位
voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据 0--1024
}
return voltage;
}
//AD中断服务函数 中断号22
#pragma vector = 24 // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void ADC_Handle( void )
{
ADC_CSR &= ~0x40;
}
在ADC_HTR寄存器中设置看门狗上限值,ADC_LTR寄存器设置看门狗下限值,然后将ADC_CSR寄存器中的AWDIE位设置为1,也就是使能模拟看门狗中断功能。ADC模拟看门狗中断程序的入口和ADC采样中断程序的入口是一个,在这里ADC使用的是查询方式,没有开启中断,所以触发中断的就只有模拟看门狗。进入中断后需要手动清除ADC_CSR寄存器中的AWD位,当发生了模拟看门狗中断后此位就会置1,需要通过软件来清0。
模拟看门狗在连续转换模式和单次转换模式下的使用基本是一模一样的。
在这里要特别注意的是,设置看门狗上下限寄存器的值时,高位寄存器存储的是10位数据的高8位,低位数据存储的是10位数据的低2位。这四个寄存器的设置要参考ST官方英文版的资料,不能参考官方中文版的资料,因为中文版资料中对这四个寄存器的介绍是错误的。