STM32F103C8T6+HX711压力传感器,从接线到串口打印数据的保姆级避坑指南

张开发
2026/4/19 17:24:19 15 分钟阅读

分享文章

STM32F103C8T6+HX711压力传感器,从接线到串口打印数据的保姆级避坑指南
STM32F103C8T6HX711压力传感器实战从硬件对接到数据稳定的全流程解析第一次拿到STM32开发板和HX711模块时看着密密麻麻的引脚和陌生的专业术语确实容易让人望而生畏。但别担心这篇文章将带你一步步完成从硬件连接到稳定获取压力数据的全过程。我们会避开那些容易踩坑的细节比如为什么数据线必须配置为上拉输入、如何解决读数跳动问题、校准时的关键参数调整技巧等。无论你是电子竞赛的学生还是DIY爱好者只要跟着这个流程走两小时内就能看到串口输出的重量数据。1. 硬件连接避开那些容易接错的引脚1.1 认识你的硬件设备STM32F103C8T6俗称蓝莓板作为最经济的ARM Cortex-M3开发板其GPIO引脚虽然丰富但功能复用复杂。HX711作为24位高精度ADC芯片对时序要求严格。压力传感器通常采用应变片原理输出微弱的mV级信号。关键参数对比设备工作电压通信接口典型功耗STM32F103C8T63.3VGPIO/UART36mA 72MHzHX7112.6-5.5V自定义串行1.5mA应变式传感器5-10V模拟输出取决于激励电压1.2 接线图与防错指南正确的物理连接是成功的第一步这里给出经过验证的接线方案HX711 STM32F103C8T6 VCC ----- 3.3V GND ----- GND DT ----- PA0 (配置为上拉输入) SCK ----- PA1 (配置为推挽输出)特别注意DT线必须接开发板的上拉输入引脚否则可能无法检测到数据就绪信号。这是新手最常犯的错误之一。常见问题排查若读数始终为0检查传感器供电是否正常用万用表测量电桥输出电压若数据跳动剧烈确保电源滤波电容(100nF)贴近HX711放置若通信完全失败用逻辑分析仪抓取SCK和DT波形确认时序符合要求2. CubeMX配置关键参数设置详解2.1 时钟树配置在RCC配置中选择外部高速晶振HSE将主频设置为72MHz。HX711对时序敏感稳定的时钟源至关重要// 自动生成的时钟配置代码 void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct {0}; // 配置HSE RCC_OscInitStruct.OscillatorType RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState RCC_HSE_ON; // ...其他配置 HAL_RCC_OscConfig(RCC_OscInitStruct); }2.2 GPIO模式选择HX711的通信协议需要精确的GPIO控制在Pinout视图中找到PA0和PA1将PA0(DT)配置为GPIO_Input Pull-up将PA1(SCK)配置为GPIO_Output push-pull在Configuration标签页中设置GPIO速度为High警告错误的GPIO模式会导致通信失败。曾有人将DT设为浮空输入结果读数随机波动。3. 代码实现从底层驱动到数据滤波3.1 HX711驱动核心代码HX711的通信时序需要微秒级精确控制这里给出经过优化的实现// hx711.h 中的关键定义 #define HX711_DT_READ() HAL_GPIO_ReadPin(DT_GPIO_Port, DT_Pin) #define HX711_SCK_HIGH() HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_SET) #define HX711_SCK_LOW() HAL_GPIO_WritePin(SCK_GPIO_Port, SCK_Pin, GPIO_PIN_RESET) // hx711.c 中的读取函数 int32_t HX711_ReadData(void) { int32_t data 0; while(HX711_DT_READ()); // 等待数据就绪 for(uint8_t i0; i24; i) { HX711_SCK_HIGH(); delay_us(1); // 关键时序参数 data 1; HX711_SCK_LOW(); delay_us(1); if(HX711_DT_READ()) data; } // 第25个脉冲选择通道和增益 HX711_SCK_HIGH(); delay_us(1); HX711_SCK_LOW(); return data ^ 0x800000; // 补码转换 }3.2 数据滤波算法对比原始传感器数据往往存在噪声这是三种常用滤波方法的实现效果对比滤波方法代码复杂度内存占用实时性适用场景移动平均简单中好缓慢变化的压力卡尔曼滤波复杂高一般动态称重中值滤波中等低差脉冲干扰严重时推荐使用改进的移动平均滤波#define FILTER_WINDOW 8 int32_t filtered_data 0; int32_t data_window[FILTER_WINDOW]; uint8_t data_index 0; int32_t MovingAverageFilter(int32_t raw_data) { data_window[data_index] raw_data; data_index (data_index 1) % FILTER_WINDOW; int64_t sum 0; for(uint8_t i0; iFILTER_WINDOW; i) { sum data_window[i]; } return (int32_t)(sum / FILTER_WINDOW); }4. 校准与调试获得精确的重量数据4.1 两步校准法皮重校准空载时调用Get_Maopi()记录基准值量程校准放置已知重物调整GapValue参数校准公式实际重量 (原始读数 - 皮重) / 比例系数典型校准流程空载状态下连续采样10次取平均值作为皮重放置500g标准砝码记录读数计算比例系数 (读数 - 皮重)/500将比例系数写入代码中的GapValue4.2 串口调试技巧利用printf输出调试信息时建议采用以下格式printf([HX711] Raw: %ld, Filtered: %ld, Weight: %.2fg\r\n, raw_data, filtered_data, weight);常见问题解决方案数据跳动检查电源稳定性增加滤波窗口大小读数漂移预热传感器30分钟避免环境温度剧烈变化负值现象重新校准皮重检查传感器安装是否平衡在项目后期我发现将SCK线的GPIO速度设置为Very High反而会引入噪声最终保持在High速度获得了最佳稳定性。另外使用优质USB电源适配器比直接连接电脑USB端口能减少约30%的数据波动。

更多文章