[G32R] 【极海G32R430 TinyBoard开发板测评】三、这个板子,我最期待的片内16bits-ADC

[复制链接]
39|0
地瓜patch 发表于 2026-5-13 16:51 | 显示全部楼层 |阅读模式
, , , ,
本帖最后由 地瓜patch 于 2026-5-14 15:26 编辑

在项目中,很多时候片内12位ADC是远远不够用的,不得不外扩16位或更高位ADC。这样增加了成本的同时大大增加了工作量。

一直在寻找片内16位ADC的片子。有的封装太大,有的性能一般。很高兴极海G32R430能具有16位ADC,这正是我所需要的。
分辨率越高,越容易受干扰,前端采样电路和基准电压源的设计尤为重要。
在开发板中,电压参考源是用了一颗REF3333来实现,VrefL直接接入模拟地。
781206a0437c8efaca.png 570276a0437e541770.png
模拟地和数字地由一颗0欧姆电阻相连,单端实现接地。

939236a04380d12082.png
在开发板中扩展出了两路16bit差分接口
693616a04387a65855.png 542926a0438919a315.png

在单端ADC采样代码中ADC channel 1 定义为PA1,模式为
时钟挂在到AHB

    DDL_RCM_EnableAHBPeripheral(DDL_RCM_AHB_PERIPHERAL_GPIO);
    DDL_RCM_EnableAHBPeripheral(DDL_RCM_AHB_PERIPHERAL_ADC1);
启用ADC中断

    DDL_ADC16_EnableIT_EOC(ADC1);
    DDL_Interrupt_Register(ADC1_IRQn, ADC_Isr);
    DDL_NVIC_EnableIRQRequest(ADC1_IRQn, 1, 1);

中断时读取采样结果并计算电压

void ADC_Isr(void)
{
    uint16_t adcData = 0;
    uint16_t voltage = 0;

    if(DDL_ADC16_IsActiveFlag_EOC(ADC1))
    {
        adcData = DDL_ADC16_REG_ReadConversionData32(ADC1);
        voltage = (adcData * 3300) / 65535;

        printf("\r\n voltage : %d mV\r\n", voltage);
        Delay(0x4FFFF);
        /* Clear ADC1 EOC pending interrupt bit */
        DDL_ADC16_ClearFlag_EOC(ADC1);
    }
}

由函数启动转换
DDL_ADC16_REG_StartConversion(ADC1);

接入0V时采样结果如下,电压波动3mV,以此换算ADC采样波动59.57,0.0909%
974436a056b6a44f50.png
接入3.3V时,采样结果无变化,有种可能性是数字3.3V超过了REF3333的电压,导致溢出。
963986a056c8bc9a52.png

接入分压电阻,将3.3V分压一半后接入PA1,得到的采样结果如下,总共接收2011个数据,最大值31897,最小值31817,差值80,波动0.25%,数据见附件文档。
710266a056ff348d57.png 458786a0577891c489.png
16位ADC采样.3.3V分压一半采样2011次.zip (472 Bytes, 下载次数: 1)


本次测试为16位ADC单端采样,分别测试0V,3.3V和1.65V,以上附件中数据为1.65V的采样数据,因分压电阻存在误差,所得数据在31857上下波动。波动范围0.25%。

对于16位的采样结果相当满意,准备采购一批,用于项目中。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

2699

主题

17312

帖子

30

粉丝
快速回复 在线客服 返回列表 返回顶部
0