慢动作 发表于 2025-5-21 23:57

ADC采样 + LCD显示实例:打造简易电压检测仪!

本项目以 HC32A4A0 为核心,读取多个模拟电压通道(如传感器、电池电压等),并实时将数值显示在 LCD 上。通过这一示例你将掌握:

ADC 配置与多通道采样;

电压值转换与处理;

基于 LCD 的 UI 输出;

一个完整的小型测量仪表系统构建过程。


核心代码结构

① ADC 初始化(多通道采样)
c
复制
编辑
#define ADC_CHANNEL_NUM2
uint16_t adc_raw;

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;
    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 = ADC_GetValue(ADC, ADC_CH0);
      adc_raw = ADC_GetValue(ADC, ADC_CH1);

      Show_Voltages_On_LCD();

      DDL_DelayMS(500);// 每500ms更新一次
    }
}

进阶拓展建议
加入 按钮 实现通道切换或数值保持;

使用 DMA + 定时器触发 ADC,自动刷新;

添加 报警阈值设置,超限时闪烁或蜂鸣;

支持 USB/UART 输出,实现数据上传。

可以帮助你系统理解 HC32A4A0 的:

[*]ADC 多通道采样原理;
[*]LCD 驱动与动态数据显示;
[*]简单的电压监测应用开发流程。

页: [1]
查看完整版本: ADC采样 + LCD显示实例:打造简易电压检测仪!