You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于STM32F103C8T6实现ADC值在LCD1602显示的技术求助

解决STM32F103C8T6 ADC采集电压并显示在HD44780 LCD上的问题

问题分析

你当前的代码完成了ADC初始化启动、LCD初始化和静态字符串打印,但缺少电压值到LCD的输出逻辑,同时电压计算公式存在错误(传感器量程是0-25V,你用了16.5V作为满量程值)。

修正步骤与代码实现

1. 修正电压计算逻辑

STM32F103的ADC是12位分辨率(最大值4095),你的0-25V电压传感器应该是通过分压电路将25V转换为ADC能接收的0-3.3V(STM32 GPIO的最大输入电压),因此正确的电压转换公式应为:

voltage = (float)readValue / 4095.0f * 25.0f;

2. 实现浮点值转字符串并输出到LCD

HD44780的HD44780_PrintStr函数仅支持字符串输入,需要用snprintf将浮点电压值转换为格式化字符串,再输出到LCD。

3. 完善循环内的显示更新逻辑

每次采集计算后,将光标定位到静态字符串Vol = 的后方,打印转换后的电压值,避免残留旧数据。

完整修正代码

// 需提前定义全局变量或局部变量
uint32_t readValue;
float voltage;
char lcd_buffer[16];  // 存储格式化后的电压字符串

int main(void)
{
  // 省略HAL初始化、GPIO/ADC初始化代码...

  HAL_ADC_Start(&hadc1);
  HD44780_Init(2);          // 初始化2行LCD
  HD44780_Clear();
  HD44780_SetCursor(0, 0);
  HD44780_PrintStr("Vol = ");  // 打印静态前缀

  while (1)
  {
    // 等待ADC转换完成,超时1000ms
    if(HAL_ADC_PollForConversion(&hadc1, 1000) == HAL_OK)
    {
      readValue = HAL_ADC_GetValue(&hadc1);
      // 修正电压计算:0-25V量程对应ADC 0-4095
      voltage = (float)readValue / 4095.0f * 25.0f;
      // 将浮点电压格式化为字符串(保留1位小数)
      snprintf(lcd_buffer, sizeof(lcd_buffer), "%.1f V", voltage);
      // 定位光标到"Vol = "后方(第0行第5列)
      HD44780_SetCursor(0, 5);
      // 打印电压字符串
      HD44780_PrintStr(lcd_buffer);
      // 重新启动ADC,准备下一次采集
      HAL_ADC_Start(&hadc1);
    }
    HAL_Delay(100);
  }
}

额外注意事项

  • 如果你的电压传感器分压比不是对应0-3.3V,需要根据实际分压比例调整计算公式。
  • 若LCD显示出现乱码,检查HD44780_Init的参数是否与你的LCD规格匹配(比如是16x2还是20x4)。
  • 确保ADC的GPIO引脚配置正确,且传感器输出范围在STM32 ADC的输入范围内(0-3.3V)。

内容的提问来源于stack exchange,提问作者Unique Soul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 07:36:19