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_GetCodeByVbat和ADC_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校准则默认值也可满足临时调试需求。