当前文档版本为 v0.3.0,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

ADC

1 功能概述

本例程演示演示 ADC Driver 的基本功能与使用方法。

2 环境准备

  • 硬件设备与线材:

    • PAN271x EVB 核心板底板各一块

    • JLink 仿真器(用于烧录例程程序)

    • USB-TypeC 线一条(用于底板供电和查看串口打印 Log)

    • 杜邦线数根或跳线帽数个(用于连接各个硬件设备)

  • 硬件接线:

    • 将 EVB 核心板插到底板上

    • 连接串口转USB调试模块:

      • 使用 USB-TypeC 线,将 PC USB 插口与 EVB 底板 USB->UART 插口相连

      • 使用杜邦线或跳线帽将 EVB 底板 J8 排针对 (P06 & TXD) 和 J9 排针对 (P05 & RXD) 分别短接起来

    • 连接 Jlink,使用杜邦线将 JLink 仿真器的:

      • SWD_CLK 引脚与 EVB 底板的 P00 排针相连

      • SWD_DAT 引脚与 EVB 底板的 P01 排针相连

      • SWD_GND 引脚与 EVB 底板的 GND 排针相连

3 编译和烧录

例程位置:<PAN271x-DK>\01_SDK\samples\drivers\adc

双击 Keil Project 文件打开工程进行编译烧录。

本节介绍ADC例程的主要流程、核心代码及常用API说明,帮助用户快速理解和移植。

4 编译和烧录

4.1 主要流程代码(main.c节选)

int main(void)
{
    platform_init();
    LOG("\nCPU @ %dHz\n", SystemCoreClock);
    ADC_Init();
    while(1)
    {
        systick_delay_ms(300);
        LOG("Vbat Voltage: %d mV\n", ADC_GetVbatVoltMv());        // 获取Vbat电压值

        systick_delay_ms(300);
        LOG("External Channel Code: %d\n", ADC_GetCodeByVbat(P1, GPIO_Pin_3));    // 获取外部通道Code值,使用Vbat作为参考电压

        systick_delay_ms(300);
        LOG("External Channel Voltage: %d mV\n", ADC_GetVoltByVbat(P1, GPIO_Pin_3));  // 获取外部通道电压值,使用Vbat作为参考电压
    }
}

4.2 主要API说明

  • ADC_Init():初始化ADC模块,设置默认值和ADC校准值。

  • ADC_GetVbatVoltMv():获取Vbat电压(单位:mV)。

VDD档位电压采集说明

这里的“VDD档位”指 ADC 以芯片供电电压 VDD(也常被称为 VBAT)作为参考电压 对外部通道进行采样。相关API如下:

  • ADC_GetCodeByVbat(port, pin):在 VDD 作为参考电压时,采集指定外部通道并返回 Code。函数内部会将对应 GPIO 临时配置为模拟输入,采样完成后恢复为数字模式;并结合 OTP 校准参数 adc_vbat_k/b 对结果做增益/偏移补偿。

  • ADC_GetVoltByVbat(port, pin):获取指定外部通道电压(单位:mV)。其内部流程为:先调用 ADC_GetCodeByVbat() 获取 Code,再调用 ADC_GetVbatVoltMv() 获取当前 VDD,最后按比例换算为 mV。

使用示例:

uint16_t code = ADC_GetCodeByVbat(P1, GPIO_Pin_3);
uint16_t volt = ADC_GetVoltByVbat(P1, GPIO_Pin_3);

VBG档位电压采集说明

ADC支持以内部带隙基准(VBG)作为参考电压进行采集,适用于高精度测量场景。相关API如下:

  • ADC_GetVoltByVbg(port, pin):VBG作为参考电压时,获取外部通道的电压值(单位:mV)。

使用示例:

uint16_t volt = ADC_GetVoltByVbg(P1, GPIO_Pin_3); // 获取P1.3通道的电压值,参考电压为VBG

4.3 串口输出示例

CPU @ 48000000Hz
Vbat Voltage: 3300 mV
External Channel Code: 1234
External Channel Voltage: 1100 mV

4.4 典型应用说明

  • 通过修改ADC_GetCodeByVbatADC_GetVoltByVbat的引脚参数,可采集不同引脚的模拟信号。

  • 若需采集温度或其他内部信号,请参考SDK中ADC相关API文档及头文件注释。

5 ADC校准值说明(otp_adc_trim_data)

ADC驱动内部使用otp_adc_trim_data结构体存储校准参数,包括ADC在不同参考电压(Vbat/VBG)下的系数k、b等。其作用如下:

  • 校准值来源

    • 从芯片OTP区域读取(由工厂烧录),每块芯片ADC校准值都不同。otp_adc_trim_data结构体默认值为全0,在debug阶段,可以给出临时的校准值,在烧录otp的时候可以再注释掉:

    // ADC临时校准值
    static OTP_AdcTrimData_T otp_adc_trim_data = {
        .adc_cal_vbat_k = 11529,
        .adc_cal_vbat_b = 192,
    #if ADC_VDD_VOL_ENABLE
        .adc_vbat_k = 9955,
        .adc_vbat_b = 178,
    #endif
    };
    
  • 主要成员含义

    • adc_cal_vbat_k / adc_cal_vbat_b:VBG作参考电压时,通过1/4Vdd计算Vbat的k、b。

    • adc_vbat_k / adc_vbat_b:Vbat作参考电压时,外部通道电压的k、b。

    • adc_vbg_ref_cal_volt / adc_vbg_kb:VBG档位下分档的参考电压和k、b。

  • 实际应用建议

    • 推荐使用OTP烧录的校准值以获得更高精度,若无OTP校准则默认值也可满足临时调试需求。