本项目以 HC32A4A0 为核心,读取多个模拟电压通道(如传感器、电池电压等),并实时将数值显示在 LCD 上。通过这一示例你将掌握:
ADC 配置与多通道采样;
电压值转换与处理;
基于 LCD 的 UI 输出;
一个完整的小型测量仪表系统构建过程。
核心代码结构
① ADC 初始化(多通道采样)
c
复制
编辑
#define ADC_CHANNEL_NUM 2
uint16_t adc_raw[ADC_CHANNEL_NUM];
void ADC_Init(void)
{
PWC_Fcg3PeriphClockCmd(PWC_FCG3_ADC, Enable);
Gpio_SetAnalogMode(PortA, Pin00); // AIN0
Gpio_SetAnalogMode(PortA, Pin01); // AIN1
stc_adc_init_t stcInit;
ADC_StructInit(&stcInit);
stcInit.u16ScanMode = ADC_SCAN_SEQ;
stcInit.u8RepeatMode = ADC_SEQ_SINGLE;
ADC_Init(ADC, &stcInit);
ADC_SeqChCmd(ADC, ADC_SEQ_CH0, Enable); // AIN0
ADC_SeqChCmd(ADC, ADC_SEQ_CH1, Enable); // AIN1
stc_adc_ch_cfg_t chCfg;
chCfg.u8SamplingTime = 0x60;
for (uint8_t i = 0; i < ADC_CHANNEL_NUM; i++) {
chCfg.u8Channel = i;
ADC_ChCfg(ADC, &chCfg);
}
ADC_Cmd(ADC, Enable);
}
② 获取电压值函数(单位:mV)
c
复制
编辑
float Convert_ADC_to_Voltage(uint16_t adc_val)
{
return (float)adc_val * 3300.0f / 4095.0f; // 假设使用 3.3V 参考电压
}
③ LCD 显示函数(调用 LCD 库)
c
复制
编辑
extern void LCD_Print(uint8_t row, char *text); // 你自己的 LCD 库接口
void Show_Voltages_On_LCD(void)
{
char str[32];
for (int i = 0; i < ADC_CHANNEL_NUM; i++) {
float voltage = Convert_ADC_to_Voltage(adc_raw);
snprintf(str, sizeof(str), "CH%d: %.2f V", i, voltage / 1000.0f);
LCD_Print(i, str);
}
}
④ 主循环逻辑
c
复制
编辑
int main(void)
{
ADC_Init();
LCD_Init(); // 初始化 LCD 模块
while (1)
{
ADC_Start(ADC);
while (ADC_GetStatus(ADC, ADC_FLAG_EOC) == Reset);
adc_raw[0] = ADC_GetValue(ADC, ADC_CH0);
adc_raw[1] = ADC_GetValue(ADC, ADC_CH1);
Show_Voltages_On_LCD();
DDL_DelayMS(500); // 每500ms更新一次
}
}
进阶拓展建议
加入 按钮 实现通道切换或数值保持;
使用 DMA + 定时器触发 ADC,自动刷新;
添加 报警阈值设置,超限时闪烁或蜂鸣;
支持 USB/UART 输出,实现数据上传。
可以帮助你系统理解 HC32A4A0 的:
ADC 多通道采样原理; LCD 驱动与动态数据显示; 简单的电压监测应用开发流程。
|