news 2026/8/31 6:41:30

基于STM32F103的空气净化器设计与实现——从硬件到PCB的完整方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于STM32F103的空气净化器设计与实现——从硬件到PCB的完整方案

简介:本资源是一套完整的基于STM32F103RCT6微控制器的空气净化器嵌入式开发资料,面向嵌入式初学者、电子设计爱好者及物联网设备开发者,解决室内空气质量监测与智能调控的实际工程问题。资源包含原理图(.SchDoc)、PCB设计文件(.PcbDoc)、Keil MDK工程(.uvprojx/.uvoptx)、全部源码(38个.h头文件、36个.c实现文件)、编译中间文件(.o/.d/.axf/.hex)及配套说明文档(.pdf/.txt),共162个文件,总大小4.05MB;其中C/H文件涵盖传感器驱动(温湿度、甲醛)、TIM/PWM风扇调速、LCD显示与系统调度等核心模块,工程结构清晰,便于分层理解与二次开发。已有1493人学习下载,资料可直接编译烧录运行,提供从硬件设计到固件开发的全链路参考,特别适合掌握STM32外设应用、多传感器融合采集及闭环控制策略的实践训练。 拿到这套基于STM32F103空气净化器设计资料的时候,我其实刚做完一版12V风机直驱的样品,板子一上电MCU就反复重启,查了一整天,最后发现是电源拓扑的问题。后来重新整理了原理图、程序结构和PCB布局,才把整套系统稳定下来。这篇文章就把我从需求拆解、硬件链路、PWM调速程序、从原理图生成PCB,到实测标定和常见坑的完整过程写出来。资料包里包含了程序源码、原理图源文件、PCB工程和Gerber,我会顺便说明每一部分怎么打开、怎么改、怎么复用到你自己的净化器项目中。

这篇内容适合正在做STM32F103项目的电子系学生、参加电赛的队伍,以及想DIY一台“能自动调速、能显示空气质量”的桌面净化器的动手党。即使你手里的板子和我的不一样,我的思路和排查方法也可以照搬到其它F103小系统上。

1. 为什么最终选了STM32F103:把净化器需求一条条对回去

很多人在做一个设备的时候,习惯先把手头最熟的芯片用上,再往上堆功能。这么搞不是不行,但很容易出现“引脚不够”“定时器不够用”“ADC通道不够”这种尴尬。我更习惯先把功能需求列出来,再倒推主控需要哪些资源,最后才看哪款芯片最合适。

1.1 先列需求,再谈选型

一台桌面空气净化器,功能清单其实非常固定:

  • 采集粉尘浓度,至少要能算出PM2.5的近似值
  • 控制风机转速,用PWM调速是最省事且效果最好的方式
  • 显示当前浓度和风速档位,OLED或LCD都行
  • 通过按键或者编码器切换模式、调节风速
  • 可选:预留串口输出浓度数据,方便调试和联网
  • 可选:定时开关、蜂鸣器提醒

这一套需求看上去不复杂,但一落地就发现对主控外设的要求很“杂”:传感器可能走UART、可能走ADC;显示走I2C或SPI;风机调速需要至少两个通道的PWM;按键扫描又要普通GPIO。用一片8位单片机做,程序逻辑容易乱,资源也紧张;直接上ESP32或者带Wi-Fi的芯片,功能强,但如果只是纯本地净化器,反而增加了不少成本和学习成本。

1.2 F103的资源分配刚好够用

STM32F103C8T6是Cortex-M3内核,72MHz主频,64KB Flash、20KB RAM。价格便宜、资料铺天盖地、烧录调试工具多,新人上手难度低。具体到这个项目里,我用到的资源很清晰:

功能模块使用外设说明
风机调速TIM3 CH1 / CH2两路PWM输出,驱动两个风机或一个双速风机
粉尘传感器USART2 或 ADC1_CH0PMS5003走串口;GP2Y1010走ADC
OLED显示I2C10.96寸OLED,128x64
按键/编码器GPIOA / GPIOB中断或轮询扫描
调试串口USART1打印PM2.5、占空比、模式状态
系统时基SysTick1ms节拍,做非阻塞调度

72MHz跑这些任务绰绰有余,空闲时还能做点滤波算法和状态机逻辑。20KB RAM也足够,我开了几个环形缓冲区、若干个滤波数组,占用仍然很低。真正让我决定用F103的,是它的定时器结构:高级定时器、通用定时器各有多个通道,PWM输出和ADC采集可以做到不冲突。另外,ST标准外设库和HAL库的例程非常多,哪怕你想从零开始写,翻几篇PWM配置例程就能跑起来。

1.3 模块化划分:主板、传感器、风机电源分开想

选型确定之后,设计上我有一个很重要的习惯:把系统拆成“主板 + 传感器小板 + 风机电源部分”,在原理图里用网络标号连接,在PCB布局时分开处理。

这样做的原因很现实:粉尘传感器和风机驱动是两类完全不同的电路。传感器模块需要干净的模拟电源和采样信号,风机驱动则会有十几伏的电源波动和PWM开关噪声。混在一个区域,后级ADC采出来的数据根本没法看。即使后面软件加了很多滤波,硬件上的隔离才是治本。

主板区域放MCU、按键、OLED接口、UART调试口;传感器区域独立放置PMS5003接口或者GP2Y1010采样电路;风机驱动区域和电源输入放在同一侧,大电流走线短而粗。三个区域在PCB上用电源平面和地平面自然隔开,模拟地和数字地单点连接。这样设计的净化器硬件,后面调试时基本不会遇到“传感器读数飘忽不定”这种玄学问题。

2. 硬件链路:从粉尘传感器到风机PWM驱动的完整信号路径

这一章是整个项目的核心硬件部分。如果你只关心程序,可以跳过细节直接看代码,但如果你打算自己打板、自己调试,最好把信号路径完全理清楚。我按信号流的方向来讲:输入侧是粉尘传感器,输出侧是风机PWM驱动,中间夹着MCU、电源和显示交互。

2.1 粉尘传感器选型:模拟输出还是串口输出

粉尘传感器常见有两类:一类是夏普GP2Y1010AU0F这种光学模拟传感器,另一类是攀藤PMS5003这种激光数字传感器。两者我都用过,差异非常明显。

GP2Y1010AU0F价格便宜,但驱动麻烦一点。它内部有一个红外LED和一个光电二极管,需要周期性给LED施加脉冲电流,然后在一个很窄的时间窗口内采样输出电压。典型工作时序是每10ms触发一次LED脉冲,脉冲宽度约0.32ms,在脉宽接近结束时采样输出。输出引脚V0的电压和粉尘浓度近似线性,但个体离散性较大,批量使用时最好每个传感器单独标定。

PMS5003就省心很多:供电5V,UART输出,默认主动上报,每帧32字节,直接读第5和第6字节就是PM2.5浓度值。数据稳定、量程宽(0.1~1000 ug/m3),缺点是多花几十块钱。我的建议是:做DIY自己玩,直接选PMS5003,省下的调试时间远超差价;做低成本课程设计,选GP2Y1010当然也可以,但采样电路和软件滤波要做得更仔细。

参数GP2Y1010AU0FPMS5003
输出方式模拟电压(约0~3.6V)UART数字帧
供电5V5V
测量范围约0~500 ug/m30.1~1000 ug/m3
驱动复杂度高,需要脉冲时序低,串口直接读
价格
抗干扰能力一般,需要滤波强,输出稳定

我用PMS5003做主力方案,代码里预留了GP2Y1010的ADC分支。这样不管手边买到哪种传感器,都能跑起来。

2.2 风机驱动:20kHz PWM与MOS低端驱动

风机调速最简单有效的方案是PWM调压。我的风机是12V直流有刷风机,工作电流大约0.4A,启动瞬间可能到0.8A左右。选MOS管的时候我用了AO3400这种N沟道MOS,SOT-23封装,Vgs在4.5V时导通电阻只有几十毫欧,3.3V逻辑直接驱动也能勉强工作,但为了可靠性,栅极驱动电压我直接复用12V系统:用一颗三极管做电平转换,或者选择逻辑电平MOS管,让单片机3.3V的PWM信号干净地控制12V回路。

如果你直接用3.3V接到12V风机的N-MOS栅极,问题不大但要确认MOS的Vgs阈值。部分AO3400在2.5V才完全导通,虽然3.3V也够,但保险起见我在栅极加了一个10k下拉电阻到GND,防止MCU上电瞬间引脚悬空导致风机误转。风机两端要并联一个续流二极管,最好是快恢复二极管或肖特基二极管,阴极接12V,阳极接MOS漏极。没有这个二极管,PWM关断瞬间风机的感性电动势会把MOS打穿,这属于教科书级别但最容易漏掉的坑。

PWM频率我选20kHz。原因很简单:人耳可听范围大概在20Hz到20kHz,低于20kHz的PWM会有明显的啸叫,很多电机驱动板嗡嗡响就是PWM频率太低。20kHz已经超过人耳上限,噪音明显减小。对MCU来说,20kHz也不难实现:72MHz主频,TIM3的ARR设为3599,预分频为0,正好20kHz。

2.3 电源系统与显示交互

整个净化器的电源输入是12V适配器,但F103和传感器、OLED都需要5V或3.3V。这里有一个非常容易踩的坑:别直接用AMS1117-3.3干12V转3.3V。

AMS1117的输入输出压差上限一般是15V,但压差越大,线性稳压器的损耗越大。12V转3.3V,压差接近9V,如果整板电流200mA,损耗就接近1.8W,AMS1117会烫到不敢摸。正确做法是先用一颗DC-DC降压模块或芯片,把12V降到5V,再用AMS1117-3.3从5V转3.3V。这样3.3V侧的压差只有1.7V,发热可忽略。5V给PMS5003和OLED供电,3.3V给MCU和逻辑电路供电。

显示部分我用0.96寸I2C OLED,四根线:VCC、GND、SCL、SDA。I2C总线需要上拉电阻,很多最小系统板上已经带了4.7k上拉,但如果自己画板,务必加上。串口调试接USART1,PA9是TX、PA10是RX,和USB转TTL模块交叉连接。如果你在淘宝上买的模块有不同引脚顺序,先查清楚再接线,否则会有一堆乱码。

3. 程序框架:状态机、可变频率PWM与浓度调速算法

硬件链路跑通之后,程序才是让净化器“聪明”起来的关键。我的程序没有用复杂的实时操作系统,而是用了一个基于SysTick的非阻塞任务调度,外加一个状态机。整体结构清晰,调试问题也容易定位。

3.1 软件分层的工程组织

项目里,我把源码分成几个维度:

  • 底层驱动:时钟、GPIO、定时器PWM、ADC、UART、I2C
  • 外设驱动:PMS5003数据解析、OLED显示驱动、按键扫描
  • 业务逻辑:状态机、调速算法、数据滤波
  • 应用入口:main循环和任务调度

这样做的好处是,换传感器或者改显示屏幕时,不需要重写应用逻辑。比如我最初用GP2Y1010,后来换PMS5003,只替换了“粉尘传感器驱动”这一层,上层的浓度映射、风机调速、显示逻辑完全没动。

3.2 PWM初始化与频率在线调整

PWM初始化代码用标准外设库写。核心思路是:开启TIM3时钟,配置PA6为复用推挽输出,初始化TIM3时基,然后设置输出比较为PWM1模式。

void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // TIM3_CH1 -> PA6 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = 3599; // ARR = 3600-1, 72MHz/3600=20kHz TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比0 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_ARRPreloadConfig(TIM3, ENABLE); TIM_Cmd(TIM3, ENABLE); }

这里的ARR是决定PWM频率的关键。72MHz主频不变的情况下,ARR越大,频率越低。如果你想做“频率可调PWM”,直接改ARR,但注意一点:改ARR之后必须同步重算比较值CCR,否则占空比会变。

void PWM_SetFreqAndDuty(uint32_t freq_hz, uint8_t duty_percent) { uint32_t arr = (SystemCoreClock / freq_hz) - 1; uint32_t ccr = (uint32_t)((uint32_t)arr * duty_percent / 100); TIM3->ARR = arr; TIM3->CCR1 = ccr; }

我做一个空气净化器,通常20kHz固定不变,只需要改占空比。占空比对应的比较值更新用TIM_SetCompare1(TIM3, value)就行。占空比从0到100,对应CCR从0到ARR。

3.3 ADC采集与浓度换算

如果使用GP2Y1010,ADC采样是关键。PA0配置为模拟输入,ADC1_CH0,采样时间尽量长一些,用239.5周期,能降低内阻带来的误差。

void ADC_Init_GP2Y1010(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); ADC_Cmd(ADC1, ENABLE); } uint16_t ADC_ReadSingle(void) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET) {} return ADC_GetConversionValue(ADC1); }

电压值 = ADC读数 × 3.3V / 4096。GP2Y1010输出是0~3.6V,但直接接ADC时注意量程,最好用电阻分压或运放电路把电压映射到0~3.3V以内。浓度换算的近似公式是:浓度(ug/m3)= (Vout - 0.5) × 200,其中0.5V为洁净空气下典型输出电压。这个公式是经验值,不同传感器差异较大,最好用标准粉尘仓或对比PMS5003来标定。

PMS5003的解析则简单得多。串口每帧32字节,帧头是0x42、0x4D,PM2.5浓度在帧的第5、6字节,PM10在7、8字节。我写了一个简单的环形缓冲区接收中断函数,在主循环里查找帧头、校验、提取数据。注意PMS5003上电后需要稳定时间,大概几十秒,前30秒的数据不要用于控制风机。

3.4 状态机调度与调速策略

程序的核心逻辑是一个状态机,状态包括:待机、自动、手动、睡眠。默认上电进入自动模式。

自动模式下,读取PM2.5浓度,按照分段映射计算目标占空比:

  • 浓度小于35 ug/m3:目标占空比20%,低速维持空气流通
  • 35~75 ug/m3:目标占空比40%
  • 75~150 ug/m3:目标占空比60%
  • 大于150 ug/m3:目标占空比90%

直接跳变占空比会让风机声音突变,而且启动电流冲击大。我在程序里做了软启动:每次任务循环,如果目标占空比大于当前占空比,就让当前值缓慢增加,每100ms最多增加2%。这样风机从低速升到高速,整个过程平滑,MCU也不会因为启动瞬间的电压跌落而复位。

人手模式通过按键切换风速等级:低、中、高、自动。风速等级直接映射到20%、50%、80%和自动逻辑。整个主循环是非阻塞的,SysTick每1ms产生一次中断,任务通过计数标志决定是否执行。OLED显示刷新一般10Hz就够了,串口打印1Hz,传感器读取3Hz,按键扫描10ms一次。

4. 从原理图到PCB:Altium Designer里的关键操作顺序

这一章专门讲AD(Altium Designer)从原理图生成PCB的完整流程。很多人觉得画原理图时把线连好、封装放好就完事了,结果一到PCB阶段就各种报错,其实问题大多出在“原理图到PCB”的连接过程没有按规范走。

4.1 为什么很多人第一步就错:编译和封装检查

我见过不少同学,原理图画完直接点Update PCB Document,然后PCB里一堆元器件乱飞、网络高亮变成暗黑色,甚至报错提示找不到封装。根源在于没有先编译工程,也没有检查封装库。

在AD里,正确的是先在原理图界面按快捷键 C + C(Compile),或者右键工程名选择Compile PCB Project。编译之后看Message面板,里面会列出重复引脚、未连接网络、封装缺失等问题。特别留意三类错误:

  • 引脚没有网络标号,悬空
  • 元器件没有封装或封装引脚数不对
  • 使用了隐藏电源引脚但没接好

封装检查可以用Tools -> Footprint Manager,批量查看每个元器件的封装是否完整。我会把容易出问题的器件单独确认一遍:按键、接插件、电解电容、继电器这类有方向或孔径要求的元件。

4.2 从原理图生成PCB的完整操作

编译通过、封装无误之后,才真正进入PCB流程。

  1. 新建PCB文件,设置好板框。我的净化器主板尺寸大约80mm×60mm,用Mechanical1层画矩形,再选中板框通过Design -> Board Shape -> Define from selected objects生成闭合板框。

  2. 在原理图界面执行Design -> Update PCB Document xxx.PcbDoc,弹出Engineering Change Order窗口。点Validate Changes检查,所有Change status变成绿色对勾后再点Execute Changes。

  3. 导入成功后,PCB里会出现一个Room区域,元器件堆在一起,旁边还有一堆飞线。先删除Room,然后按模块把元器件拖出来。我习惯先放固定位置的接口器件,比如电源插座、传感器接插件,再放MCU、晶振、电容电阻。

布局是PCB设计中最影响成败的一步。几个铁律:晶振要离MCU尽量近,走线短而直;去耦电容放在MCU电源引脚旁边;空气净化器的主板如果涉及风机接口,大电流线尽量短;OLED排针放在PCB边缘,方便安装。

  1. 布局基本完成后,设计布线规则。快捷键 D + R 打开PCB Rules and Constraints Editor。我用的参数如下:
规则项数值
信号线宽0.254mm~0.3mm
电源线宽1mm以上
风机大电流线宽1.5mm~2mm
安全间距0.2mm以上
过孔内径0.3mm
过孔外径0.6mm
覆铜到板边距离0.4mm
  1. 布线顺序很有讲究:先布电源和地,再布敏感信号线,最后处理普通信号线。如果空间允许,12V和5V电源走线直接加粗到1mm以上,GND最后整片覆铜。布线的过程如果发现某一根飞线绕不过去,可以回看原理图,用网络标号重新规划引脚顺序,不一定非要强行打过孔。

  2. 布线完成后,在PCB的顶层和底层分别执行Place -> Polygon Pour,网络选GND,覆盖整板。覆铜之后别忘了在Tool -> DRC Run Design Rule Check,处理所有报错。

4.3 Gerber输出与下单打样

最终打样需要导出Gerber和钻孔文件。在AD中通过File -> Fabrication Outputs -> Gerber Files导出RS-274X格式,注意勾选需要的层:Top Layer、Bottom Layer、Top Overlay、Keep-Out Layer、Drill Drawing。钻孔文件用NC Drill导出。同时导出BOM表(Bill of Materials),方便核对贴片元器件数量。

下单前我会再检查一次过孔和孔径最小限制。大部分PCB打样厂家支持最小孔径0.3mm,如果板子比较密,我会把过孔统一放在0.3/0.6mm,既保证可制造性,也减少钻嘴损耗。Gerber文件生成后用浏览器里的Gerber查看器或者嘉立创EDA在线预览检查一遍,确认没有漏层、没有反字、没有缺失丝印,再上传打样。

5. 实测调试与标定:这几类坑基本都会踩一遍

硬件打样回来,程序编译下载,真正头疼的时刻才开始。这一章把我的实测过程和踩坑记录写出来,能帮你省不少时间。

5.1 上电阶段:先看电源,再看最小系统

我的调试习惯是分步上电,而不是一上来就把整个系统全接上。第一次上电,只接12V电源,用万用表量5V和3.3V是否正常,再用示波器看有没有明显纹波。如果3.3V异常,先查AMS1117输入输出和负载电容。

电源没问题后,接上ST-Link或者J-Link,下载一个最简单的LED闪烁程序。如果LED正常闪烁,说明MCU最小系统、晶振、复位电路都没问题。这个步骤看着基础,但能快速把问题域缩小到外设部分,而不是一锅粥地排查。

5.2 传感器标定与数据解析

PMS5003上电后,串口会持续输出32字节数据帧。我调试时先用USB转TTL模块直接接PMS5003的TX/RX,放到串口助手里看原始数据,确认模块没有问题,再接到STM32的USART2。如果MCU收到的数据是乱码,优先查波特率,PMS5003默认是9600波特率。如果数据时断时续,检查供电是否稳定,以及接线是否虚焊。

GP2Y1010的标定更麻烦一点。因为LED脉冲触发和ADC采样需要在时序上配合,我建议在主循环里用延时函数控制:先触发LED脉冲,延时一段时间,再启动ADC采样。你可以把采样结果通过串口打印出来,分别测室内环境和靠近香烟烟雾的读数,记录电压值和对应状态,再拟合一条线性曲线。没有标准粉尘仪的情况下,用这种“两点标定”也能达到足够的控制效果。

5.3 PWM干扰、风扇启动和OLED花屏

我最开始遇到的第一个问题是:只要风机转起来,PMS5003读到的PM2.5数值就开始明显跳变。查到最后是电源共地导致的干扰,还有PWM开关噪声耦合到了传感器供电线上。解决方案主要有三层:传感器供电加LC滤波,传感器区域独立覆铜,软件读取时做滑动平均滤波。

第二个问题是风扇启动瞬间MCU复位。用示波器抓12V电源轨,发现启动瞬间电压跌落到了10V以下,3.3V也跟着晃。原因是风机启动电流大,12V电源余量不足。软件方案是软启动,前面已经写了;硬件方案是在12V输入端加一个470uF电解电容,同时在风机MOS漏极靠近源端的位置加一个100uF电容吸收浪涌。加了以后,即使占空比直接拉到100%也不会复位了。

第三个问题是OLED花屏。常见的两个原因:一是I2C上拉电阻缺失或者阻值过大,二是OLED地址冲突。我的板子上SCL和SDA各接了4.7k上拉到3.3V,屏幕接口VCC单独接5V,GND与MCU共地,花屏问题基本消失。如果你遇到OLED通电白屏,先测电源,再查I2C地址,用扫描程序枚举一下地址列表,很多OLED模块是0x3C或者0x3D,驱动代码里地址错了就会花屏或者无显示。

6. 这套资料里到底有什么,怎么拿去做二次开发

最后聊一聊资料本身。我整理这套基于STM32F103空气净化器资料的时候,刻意把文件按功能分层放好,让新手也能快速找到自己需要的东西。

6.1 资料目录结构与使用建议

整个资料包里包含程序源码、原理图、PCB、数据手册和使用文档,目录结构大致如下:

STM32F103空气净化器设计资料/ ├─ 01-Projet-Program/ 程序源码(MDK-ARM工程) ├─ 02-Principle-Schematic/ 原理图PDF与源工程 ├─ 03-PCB/ PCB工程、Gerber、BOM ├─ 04-Datasheet/ 芯片与模块数据手册 └─ 05-README/ 使用说明与调试记录

程序源码建议直接用Keil MDK打开,编译前先安装对应芯片的器件支持包。如果你用的是标准外设库版本,注意宏定义里选择STM32F10X_MD。原理图源工程用Altium Designer打开,PCB工程里面有布局布线好的板卡,如果想改版,可以直接在源工程上修改。Gerber文件夹里是已经导出的制板文件,不想装AD的话,直接把Gerber压缩包发给打样厂家即可。

如果你是第一次接触这种项目,我强烈建议不要一上来就改这改那,先把原始程序编译下载、硬件点亮、串口能打印数据、风机能转起来,完整跑通一遍。很多人拿到资料就先动代码,结果硬件和软件互相甩锅,越改越乱。先复现,再创新,这是最稳妥的做法。

6.2 模块化改造与功能扩展

这套设计并不是封闭的,扩展方向很多:

  • 把PMS5003的数据通过USART1转发的Wi-Fi模块,比如ESP8266或ESP32,手机端用微信小程序或App远程查看PM2.5浓度,远程开关机。
  • 增加一个温湿度传感器,比如SHT30或DHT11,在OLED上显示,并根据温湿度优化风机策略。
  • 把风机的驱动从有刷风机改成BLDC无刷风机,降低噪音和寿命损耗,但驱动电路需要重新设计,程序里增加BLDC控制算法。
  • 把固定档位改成PID闭环控制,传感器读数作为反馈量,让浓度稳定在目标值附近。

我个人的经验是,二次开发时优先做“加传感器”和“加通信”,因为这两块在程序里只要增加一个驱动文件和对应的任务函数,硬件上也只需要预留好接口即可。如果要改风机驱动或者电源拓扑,那基本等于重新画一版PCB,工作量会大很多。

这套净化器项目我已经做了三个版本。第一版直流电机直驱,第二版加入PMS5003和软启动,第三版加入了Wi-Fi透传和远程控制。每次修改最花时间的往往不是写代码,而是定位电源干扰和接口匹配的问题。如果你在复现过程中卡住了,先按我前面说的顺序检查:电源、最小系统、传感器串口数据、PWM波形,再往上层应用看,大概率能快速找到问题所在。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 6:40:45

音效插件真能让你效率翻倍?拆解听觉环境与专注力的真相

我最近被一个标题勾住了注意力:“所有人立刻安装这个DSH音效插件,工作效率(人的)提升100%”。这几个字放在一起,既有命令感,又有数据感,还有括号里那个耐人寻味的“人的”。仿佛在说&#xff1a…

作者头像 李华
网站建设 2026/8/31 6:39:31

SSM框架毕设实战:从零搭建资产评估业务管理系统

先问一个很现实的问题:毕设选题时,你是不是也在“网上找现成源码”和“自己从零写系统”之间反复横跳?下载过压缩包的同学应该都有体会——十个压缩包里有五六个缺数据库,两三个缺依赖,剩下的几个能跑起来,…

作者头像 李华
网站建设 2026/8/31 6:39:25

三极管偏置电路设计精讲:从静态工作点设置到分压偏置计算

在硬件调试中,三极管偏置电路是最容易出问题、也最容易被低估的一环。很多初学者搭完一个共射极放大电路,明明元件和接线都没错,示波器上却看不到正常放大的正弦波,要么输出被削掉一边,要么完全没有信号。问题往往不在…

作者头像 李华
网站建设 2026/8/31 6:38:50

SpringBoot3+Vue3租车管理系统毕设实践:从技术选型到部署答辩全复盘

简介:这是一套面向计算机专业本科生的2025届毕业设计级全栈项目资源,聚焦租车业务场景,解决车辆租赁服务中用户预订、订单管理、车辆调度与后台监管等核心需求,适用于课程设计、毕设开题与SpringBootVue工程实践学习。资源共6个文…

作者头像 李华
网站建设 2026/8/31 6:38:21

PyTorch vs TensorFlow:动态图与静态图核心对比与实战

正在准备面试人工智能、深度学习相关岗位,或者刚开始接触深度学习的朋友,几乎都逃不过一个问题:PyTorch 和 TensorFlow,到底应该学哪个?这个问题表面上是“框架选型”,实际上对方想从你的回答里判断三件事&…

作者头像 李华