打印
[方案相关]

HC32A4A0 ADC序列转换配置详解,轻松采集多路信号!

[复制链接]
31|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
t60yz|  楼主 | 2025-5-21 23:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC模块基本特性回顾
HC32A4A0 的 ADC 支持以下特性:

支持 13 路模拟输入(AIN0 ~ AIN12)

支持 序列扫描(最多8通道)

支持软件/外部/定时器触发方式

支持 DMA 自动传输

支持采样时间调节(提高高阻抗源采样稳定性)

支持中断机制(转换完成、溢出、错误)

二、ADC 序列配置核心步骤
1.步骤概览
使能 ADC 模块及所用 GPIO 的时钟;

配置模拟输入脚为模拟模式;

初始化 ADC 主配置结构体;

配置通道序列(SEQ);

配置采样时间;

配置触发方式(软件/定时器/外部);

配置中断或 DMA;

启动转换。

2.初始化代码详解
ADC 时钟与GPIO配置
c
复制
编辑
// 开启外设时钟
PWC_Fcg3PeriphClockCmd(PWC_FCG3_ADC, Enable);

// 配置模拟输入脚(示例为 AIN0 - AIN3)
Gpio_SetAnalogMode(PortA, Pin00);  // AIN0
Gpio_SetAnalogMode(PortA, Pin01);  // AIN1
Gpio_SetAnalogMode(PortA, Pin02);  // AIN2
Gpio_SetAnalogMode(PortA, Pin03);  // AIN3
ADC 主初始化结构体
c
复制
编辑
stc_adc_init_t stcAdcInit;
ADC_StructInit(&stcAdcInit);
stcAdcInit.u16Resolution = ADC_RESOLUTION_12B;
stcAdcInit.u16ScanMode   = ADC_SCAN_SEQ;        // 启用序列模式
stcAdcInit.u8RepeatMode  = ADC_SEQ_SINGLE;      // 单次扫描或重复
ADC_Init(ADC, &stcAdcInit);
通道序列配置(最多8通道)
c
复制
编辑
// 依次启用通道序列(从 SEQ_CH0 开始对应 AIN0)
ADC_SeqChCmd(ADC, ADC_SEQ_CH0, Enable);  // AIN0
ADC_SeqChCmd(ADC, ADC_SEQ_CH1, Enable);  // AIN1
ADC_SeqChCmd(ADC, ADC_SEQ_CH2, Enable);  // AIN2
ADC_SeqChCmd(ADC, ADC_SEQ_CH3, Enable);  // AIN3
设置采样时间(针对每个通道)
c
复制
编辑
stc_adc_ch_cfg_t stcChCfg;
stcChCfg.u8Channel = ADC_CH0;                 // AIN0
stcChCfg.u8SamplingTime = 0x30;               // 样本保持时间,越大采样越稳定
ADC_ChCfg(ADC, &stcChCfg);

// 可为其他通道重复配置
配置触发方式(软件触发示例)
c
复制
编辑
ADC_SetTriggerSrc(ADC, ADC_TRG_SRC_ADTRG);  // 软件触发
ADC_TriggerCmd(ADC, Enable);
3️⃣ 启动ADC序列采样
c
复制
编辑
ADC_Start(ADC);  // 启动采样
三、中断配置与回调函数注册
支持转换完成(EOC)中断通知。

使能中断并注册回调
c
复制
编辑
stc_irq_signin_config_t stcIrqCfg;
stcIrqCfg.enIRQn = Int000_IRQn;
stcIrqCfg.pfnCallback = &AdcSeqIrqCallback;
INTC_IrqSignIn(&stcIrqCfg);
NVIC_ClearPendingIRQ(Int000_IRQn);
NVIC_SetPriority(Int000_IRQn, DDL_IRQ_PRIORITY_DEFAULT);
NVIC_EnableIRQ(Int000_IRQn);

// 开启中断
ADC_SeqIrqCmd(ADC, Enable);
中断服务函数模板
c
复制
编辑
void AdcSeqIrqCallback(void)
{
    if (ADC_GetFlag(ADC, ADC_FLAG_EOC) == Set)
    {
        ADC_ClearFlag(ADC, ADC_FLAG_EOC);

        // 读取结果(ADDR0~ADDR7 对应通道)
        uint16_t result0 = ADC_GetSeqData(ADC, ADC_SEQ_CH0);
        uint16_t result1 = ADC_GetSeqData(ADC, ADC_SEQ_CH1);
        // ...

        // 处理采样数据
    }
}

使用特权

评论回复
沙发
t60yz|  楼主 | 2025-5-21 23:42 | 只看该作者
通过正确配置 通道序列、采样时间、触发源及中断机制,HC32A4A0 的 ADC 模块能实现高效可靠的多路信号采样。无论是周期性采样,还是事件驱动触发,均可通过其灵活的配置方式实现稳定的数据采集,适用于各种工业、消费电子嵌入式场景。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

187

主题

1085

帖子

0

粉丝