基于STM32的电子秤PCB程序实现

📅 发布时间:2026/7/4 23:59:39 👁️ 浏览次数:
基于STM32的电子秤PCB程序实现
一、硬件设计要点核心器件选型主控芯片STM32F103C8T672MHz Cortex-M364KB Flash传感器模块HX71124位ADC内置PGA支持增益128/64/32称重传感器Zemic L6G5kg量程C3级精度显示模块SSD1306 OLEDI2C接口电源管理TP4056锂电池充电 MT3608升压至5VPCB布局规范四层板结构信号层Top→ 地平面GND→ 电源平面VCC→ 信号层Bottom关键布线传感器信号线A/A-长度≤10cm差分走线间距≤0.2mmHX711的PD_SCK和DOUT线远离数字信号如MCU时钟电源输入端并联10μF电解电容0.1μF陶瓷电容二、软件架构设计// 主程序流程图intmain(){硬件初始化();// GPIO、时钟、外设HX711_Init();// 传感器校准与参数配置OLED_Init();// 显示模块初始化while(1){读取重量数据();// HX711数据采集与滤波更新显示();// OLED刷新重量值处理按键();// 去皮/单位切换低功耗管理();// 闲置时进入休眠}}三、关键代码实现1. HX711驱动模块// hx711.h#ifndef__HX711_H#define__HX711_H#includestm32f1xx_hal.h#defineHX711_SCK_PINPB0#defineHX711_DOUT_PINPB1voidHX711_GPIO_Init();int32_tHX711_Read_RawData();floatHX711_Get_Weight(floatscale,floatoffset);#endif// hx711.c#includehx711.hvoidHX711_GPIO_Init(){GPIO_InitTypeDef GPIO_InitStruct{0};__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitStruct.PinHX711_SCK_PIN|HX711_DOUT_PIN;GPIO_InitStruct.ModeGPIO_MODE_OUTPUT_PP;GPIO_InitStruct.PullGPIO_PULLUP;HAL_GPIO_Init(GPIOB,GPIO_InitStruct);}int32_tHX711_Read_RawData(){int32_traw0;for(inti0;i24;i){HAL_GPIO_WritePin(GPIOB,HX711_SCK_PIN,GPIO_PIN_SET);HAL_Delay(0.1);// 100ns延时raw1;HAL_GPIO_WritePin(GPIOB,HX711_SCK_PIN,GPIO_PIN_RESET);if(HAL_GPIO_ReadPin(GPIOB,HX711_DOUT_PIN))raw|1;HAL_Delay(0.1);}HAL_GPIO_WritePin(GPIOB,HX711_SCK_PIN,GPIO_PIN_SET);// 增益选择HAL_Delay(0.1);HAL_GPIO_WritePin(GPIOB,HX711_SCK_PIN,GPIO_PIN_RESET);returnraw;}floatHX711_Get_Weight(floatscale,floatoffset){int32_trawHX711_Read_RawData();return(raw-offset)*scale/8388608.0f;// 24位满量程转换}2. 滑动平均滤波算法#defineFILTER_SIZE16staticfloatweight_buffer[FILTER_SIZE]{0};staticuint8_tindex0;floatMovingAverageFilter(floatnew_value){weight_buffer[index]new_value;if(indexFILTER_SIZE)index0;floatsum0;for(inti0;iFILTER_SIZE;i)sumweight_buffer[i];returnsum/FILTER_SIZE;}3. OLED显示驱动// oled.c#includessd1306.hvoidOLED_Display_Weight(floatweight){charbuf[16];sprintf(buf,Weight: %.2f g,weight);SSD1306_Clear();SSD1306_GotoXY(0,0);SSD1306_Puts(buf,Font_7x10,1);SSD1306_UpdateScreen();}4. 按键中断处理// key.cvolatileuint8_tkey_flag0;voidEXTI0_IRQHandler(){if(EXTI_GetITStatus(EXTI_Line0)!RESET){key_flag1;EXTI_ClearITPendingBit(EXTI_Line0);}}voidProcess_Key(){if(key_flag){key_flag0;// 切换去皮/单位staticuint8_tmode0;mode(mode1)%2;if(mode0)OLED_Display_String(Tare Mode);elseOLED_Display_String(Unit: kg);}}四、校准流程去皮操作floattareHX711_Get_Weight(1.0,0.0);// 空载读取offsettare;// 存储至EEPROM标定砝码// 使用1kg砝码floatrawHX711_Read_RawData();scale1000.0/(raw-offset);// 计算比例系数EEPROM_Write(0x10,scale);// 存储至EEPROM五、低功耗优化// 进入睡眠模式voidEnter_LowPower(){HAL_PWR_DisablePVD();// 关闭电压检测HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);}// 唤醒处理voidSysTick_Handler(){if(WakeUp_Flag){HAL_PWR_EnablePVD();SystemClock_Config();// 重新配置时钟}}参考代码 基于STM32设计的电子秤PCB原理图加程序www.youwenfan.com/contentcsr/101822.html六、PCB设计文件示例文件名内容说明STM32F103C8T6.lpf低通滤波配置抑制高频噪声HX711.SCH传感器接口原理图PCB_Layout四层板堆叠结构信号-地-电源-信号七、调试与验证串口调试printf(Raw Data: %ld, Weight: %.2f g\n,raw,current_weight);示波器观察HX711的DOUT信号应呈现稳定的24位脉冲序列PD_SCK时钟频率需严格控制在10MHz以内实物测试测试项合格标准零点漂移空载波动≤±0.5g线性度1kg~5kg误差≤±0.2% FS响应时间100ms内稳定显示