STM32 ADC实战:用一块电位器+OLED,5分钟搞定电压表(附完整代码)
STM32 ADC实战用一块电位器OLED5分钟搞定电压表附完整代码当你想测量某个引脚的电压值时STM32的ADC模块就是你的数字万用表。本文将带你用最简硬件一个电位器OLED屏幕和清晰代码快速实现可调电压的实时监测。无需复杂理论直接动手感受模拟信号到数字世界的转换魅力。1. 硬件准备与电路连接所需材料清单STM32F103C8T6核心板其他型号亦可10kΩ电位器0.96寸OLED显示屏I2C接口杜邦线若干电路连接示意图3.3V ────┬─────── OLED_VCC │ [10kΩ] │ Wiper ─── PA0 (ADC输入) │ GND ─────┴─────── OLED_GND电位器两端分别接3.3V和GND中间滑动端接STM32的PA0引脚ADC通道0。OLED的SCL、SDA分别接PB6、PB7电源接3.3V和GND。注意确保ADC输入电压不超过3.3V否则可能损坏芯片。电位器阻值建议选择1kΩ-50kΩ范围。2. 软件环境配置首先在STM32CubeIDE中新建工程配置关键参数ADC配置模式Independent mode数据对齐Right alignment扫描模式Disabled连续转换Disabled触发方式Software trigger采样时间55.5 cyclesI2C配置用于OLED标准模式(100kHz)无地址检测GPIO配置PA0设为模拟输入PB6(I2C1_SCL)、PB7(I2C1_SDA)设为复用开漏输出生成代码后添加OLED驱动库如SSD1306到项目。以下是关键初始化代码片段void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct {0}; // 72MHz HCLK配置 RCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL RCC_PLL_MUL9; HAL_RCC_OscConfig(RCC_OscInitStruct); RCC_ClkInitStruct.ClockType RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider RCC_HCLK_DIV1; HAL_RCC_ClockConfig(RCC_ClkInitStruct, FLASH_LATENCY_2); }3. ADC数据采集实现ADC采集的核心在于原始值到实际电压的转换。STM32的12位ADC输出范围0-4095对应0-3.3V电压uint16_t Read_ADC(ADC_HandleTypeDef* hadc) { HAL_ADC_Start(hadc); if (HAL_ADC_PollForConversion(hadc, 10) HAL_OK) { return HAL_ADC_GetValue(hadc); } return 0; } float ADC_To_Voltage(uint16_t adcValue) { return (adcValue * 3.3f) / 4095.0f; }电压测量精度优化技巧多次采样取平均#define SAMPLE_TIMES 16 uint16_t Get_Stable_ADC(ADC_HandleTypeDef* hadc) { uint32_t sum 0; for (int i0; iSAMPLE_TIMES; i) { sum Read_ADC(hadc); HAL_Delay(1); } return sum / SAMPLE_TIMES; }参考电压校准若板载有REF引脚float vref 1.2f; // 内部参考电压典型值 float actual_vdd (vref * 4095) / adc_ref_value;4. OLED动态显示实现结合SSD1306驱动库创建电压显示界面void Show_Voltage(float voltage) { char str[16]; OLED_Clear(); // 标题 OLED_ShowString(0, 0, STM32 Voltmeter, 16); // 原始ADC值 OLED_ShowString(0, 2, ADC:, 16); sprintf(str, %4d, adc_value); OLED_ShowString(32, 2, str, 16); // 电压值 OLED_ShowString(0, 4, Voltage:, 16); sprintf(str, %5.2fV, voltage); OLED_ShowString(64, 4, str, 16); // 进度条 uint8_t len (uint8_t)(voltage * 30 / 3.3); OLED_DrawRectangle(0, 6, 127, 7); OLED_Fill(0, 6, len, 7, 1); OLED_Refresh(); }显示效果优化添加波动指示器←→表示稳定电压超限警告如3.0V时显示!最小/最大电压记录功能5. 完整代码整合主循环实现周期性采集与显示int main(void) { HAL_Init(); SystemClock_Config(); // 外设初始化 MX_GPIO_Init(); MX_I2C1_Init(); MX_ADC1_Init(); OLED_Init(); uint16_t adc_value; float voltage; while (1) { adc_value Get_Stable_ADC(hadc1); voltage ADC_To_Voltage(adc_value); Show_Voltage(voltage); HAL_Delay(200); // 控制刷新率 } }扩展功能实现按键控制采样速率电压变化趋势图通过串口输出数据到PC阈值报警功能如LED闪烁6. 常见问题排查ADC读数不稳定检查电源滤波在VDD与GND间加0.1μF电容增加采样时间可尝试239.5 cycles确保电位器接触良好OLED无显示确认I2C地址通常0x78或0x7A检查上拉电阻4.7kΩ到3.3V验证初始化时序正确电压测量偏差// 校准公式示例 float calibrated_voltage (raw_voltage * 3.3f) / 4095 * calibration_factor;实测中发现当旋转电位器时OLED上的电压值应平滑变化。如果出现跳变可尝试在PA0与GND之间添加100nF电容以滤除噪声。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2584569.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!