Skip to content

ADC 模块

stc8g1k08a芯片,内置了1个ADC模块,用于测量模拟信号。相关的数据手册位于: STC8G数据手册 的第 579 页。

ADC简介

ADC(Analog-to-Digital Converter)是模拟-数字转换器,用于将模拟信号转换为数字信号。STC8G系列单片机内置了10位高精度ADC模块1个,可以同时测量多个通道的信号,可以用于测量模拟电压、电流等信号。

ADC模块寄存器

  • ADC_CONTR: ADC控制寄存器.
  • ADCCFG: ADC配置寄存器.
  • ADC_RES: ADC转换结果高8位.
  • ADC_RESL: ADC转换结果低8位.

一. ADC模块同步转换方法

1.1 ADC模块同步转换方法简介

  • 配置模块的的输入引脚.
  • 配置模块的ADC通道.
  • 配置模块的ADC触发源.
  • 启动模块的ADC转换.
  • 读取模块的ADC转换结果.

1.2 ADC模块同步转换方法代码

ADC模块同步转换ADC模块同步转换

初始化ADC模块

c
// ADC相关寄存器定义
#define ADC_POWER 0x80   // ADC电源控制位
#define ADC_START 0x40    // ADC启动控制位
#define ADC_FLAG 0x20     // ADC完成标志位

// 初始化(p581)
void adc_init(void) {

    //将ADC引脚设置为高阻输入
    P3M0 &= ~(1 << 3);   // 设置P33(ADC11)为高阻输入
    P3M1 |= 1 << 3;

    ADCCFG = 0x2F;      // 设置ADC时钟为系统时钟/2/16,右对齐输出
    ADC_CONTR = ADC_POWER | 0x03; // 开启ADC电源,选择通道5(P33)
    Delay_us(100);       // 等待ADC稳定
}

在这个初始化的过程中,包括: 引脚的模式的定义, ADC的配置, 以及ADC的电源启动(并不是开始转换).

ADC_CONTR寄存器用于控制ADC的启动和停止,以及设置ADC的通道和触发源.

ADC_CONTR

ADCCFG寄存器用于配置ADC的时钟和输出格式. ADCCFG

启动ADC转换并读取结果

c
unsigned int adc_Read() {
    ADC_CONTR |= ADC_START;          // 启动ADC转换
    while(!(ADC_CONTR & ADC_FLAG));  // 等待转换完成(若卡死,改用延时法)
    ADC_CONTR &= ~ADC_FLAG;         // 清除标志位
    return (ADC_RES << 8) | ADC_RESL; // 合并10位结果
}

注意: 在返回结果时 return (ADC_RES << 8) | ADC_RESL; ADC_RES为高8位,ADC_RESL为低8位。这种返回的原理,就是上图中 RESFMT=1的情况,因为我们设置了ADCCFG = 0x2F; ,也就是 RESFMT=1