基于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
相关产品推荐
相关产品推荐

