极海 G32R430 TinyBoard 的 ADC16 模块,我整理了一份从硬件准备到代码调试的完整落地计划。
这套流程基于官方 DDL 库,重点解决了 16 位 ADC 的时钟配置、参考源选择以及数据对齐等易错点。
一、硬件与引脚规划
硬件接线方案
单端输入(推荐):使用板载 J12 排针的 A1~A5(对应 PA1~PA5),信号接 ADCxP,GND 接 AGND。
差分输入,使用 J11 专用模拟排针(AD1P/AD1M, AD2P/AD2M),注意差分电压范围需在 VREF-至 VREF+之间。
参考电压,TinyBoard V1.2 板载 REF3333(3.3V)作为外部参考源,比内部参考更稳定,建议优先启用外部参考。
抗干扰措施
模拟部分电源尽量使用 LDO 单独供电,避免开关电源噪声。
信号线远离时钟线和数字 GPIO,必要时在 ADC 输入端并联 100pF 电容滤波。
二、工程环境搭建
基础工程准备
SDK:使用 G32R430_DDL_SDK_V1.0.2或更高版本,直接复用 Examples/Board_G32R430_Tiny/ADC16下的例程骨架。
调试通道:配置 USART2(115200bps)通过板载调试器输出采样数据,便于实时验证。
关键宏定义
在 ddl_conf.h中确认以下配置已开启:
- #define ADC16_UNIT1_ENABLE DDL_ON // 使能 ADC1
- #define ADC16_UNIT2_ENABLE DDL_ON // 使能 ADC2(若需双ADC同步)
- #define DDL_ADC16_ROUTINE DDL_ON // 使能 ADC16 常规转换
ADC 初始化步骤(单通道轮询)
这是最基础的验证流程,适合快速上手。
时钟与 GPIO 初始化
- DDL_ADC12_InitTypeDef ADC_InitStruct = {0U};
- DDL_ADC12_REG_InitTypeDef ADC_REG_InitStruct = {0U};
- /* Config Clock */
- DDL_RCM_Unlock();
- /* Set ADC3 clock source to SYSCLK */
- DDL_RCM_ADC_SetAdcAnalogClkSource(DDL_RCM_ADCACLK_SYSCLK);
- /* Set ADC3 Clock Division */
- DDL_RCM_ADC_SetAdc12AnalogClkDivision(DDL_RCM_ADC12ACLK_DIV_8);
- DDL_RCM_EnableAHBPeripheral(DDL_RCM_AHB_PERIPHERAL_GPIO);
- DDL_RCM_EnableAHBPeripheral(DDL_RCM_AHB_PERIPHERAL_ADC3);
- DDL_RCM_Lock();
- ADC_InitStruct.DataAlignment = DDL_ADC12_ALIGNMENT_RIGHT;
- DDL_ADC12_Init(ADC3, &ADC_InitStruct);
- /* Config ADC3 */
- ADC_REG_InitStruct.TriggerSource = DDL_ADC12_REG_TRIG_SOFTWARE;
- ADC_REG_InitStruct.SequencerLength = DDL_ADC12_REG_SEQ_SCAN_DISABLE;
- ADC_REG_InitStruct.SequencerDiscont = DDL_ADC12_REG_SEQ_DISCONT_DISABLE;
- ADC_REG_InitStruct.ContinuousMode = DDL_ADC12_REG_CONV_CONTINUOUS;
- ADC_REG_InitStruct.DMATransfer = DDL_ADC12_REG_DMA_TRANSFER_DISABLE;
- DDL_ADC12_REG_Init(ADC3, &ADC_REG_InitStruct);
- /* Set the sampling time of ADC3 */
- DDL_ADC12_SetChannelSamplingTime(ADC3, DDL_ADC12_CHANNEL_15, DDL_ADC12_SAMPLINGTIME_128CYCLES);
- DDL_ADC12_REG_SetSequencerLength(ADC3, DDL_ADC12_REG_SEQ_SCAN_DISABLE);
- DDL_ADC12_REG_SetSequencerRanks(ADC3, DDL_ADC12_REG_RANK_1, DDL_ADC12_CHANNEL_15);
- /* Enable Interrupt */
- DDL_ADC12_EnableIT_EOC(ADC3);
- DDL_Interrupt_Register(ADC3_IRQn, ADC_Isr);
- DDL_NVIC_EnableIRQRequest(ADC3_IRQn, 1, 0);
- DDL_ADC12_Enable(ADC3);
- while (DDL_RCM_ADC_IsAdc12AnalogClkRDY() == RESET);
- /* ADC start conversion */
- DDL_ADC12_REG_StartConversion(ADC3);
三,了解AD与AD的框架
16 位分辨率, ENOB13.5bit
( 2) 内置高精度参考源: 1.65V±2mV(25℃ )
( 3) 16bit 分辨率下最大采样率达到 1Msps
( 4) 支持单端和差分模式输入,采样通道数(差分/单端): 最多 6 对差分/12
个单端
( 5) 支持规则序列、注入序列、单次、连续采样模式
( 6) 两个 ADC 支持主从模式,配置主从时候保持采样同步
( 7) 支持最高 16 倍过采样
( 8) 触发方式:可通过软件、硬件触发双 ADC 同步采样。支持多个内部或外
部触发输入,每个 ADC 模块有触发方式选择:
片上定时器信号触发
外部引脚信号触发
软件触发
( 9) 支持外部参考电压引脚,允许输入电压范围独立于供电电源
( 10) 高度通用的配置
单次或连续/不连续序列的扫描模式,每个 ADC 可以转换多个通道或
扫描一个通道序列
ADC 转换结果可以存储在 16/32 位结果寄存器或通过 DMA 直接传输
到 RAM 中
数据预处理:每通道偏移补偿
通道可编程采样时间,灵活的采样时间控制
模拟看门狗,用于自动电压监测、生成中断和所选计时器的触发器
实现效果
|