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);
// ...
// 处理采样数据
}
}
|