简介:这是一套基于STM32单片机的太阳能电池板追日光跟踪系统完整设计资料,适合嵌入式学习者、电子类专业学生及光伏方向开发者参考。方案以STM32作为核心控制器,结合光敏传感器或日晷算法检测太阳位置,通过PWM驱动步进电机实现电池板角度自动调整,覆盖环境光采集、电机控制、自适应算法及系统稳定性设计等关键环节。压缩包共365个文件,约84.26MB,主要包含C语言源码(h/c文件)、Keil工程文件(uvproj/uvopt)、原理图与PCB文档(sch/schdoc)、电路设计说明(doc/docx/pdf),以及演示视频(mp4)和图片(jpg)等,便于对照学习硬件搭建、程序编写与调试排错。已有6053人学习下载。资料内提供完整工程代码、硬件选型指南、电路原理图及调试技巧,有助于快速掌握STM32编程、传感器数据处理和电机控制技术,为实际项目开发打下扎实基础。
从一块固定光伏板到追日系统,我到底多发了多少度电
家里屋顶装了两块同样规格的太阳能板,一块固定朝南30度倾角,另一块是后加的STM32追日系统。入夏跑了整整两个月,追光的那块日均发电量比固定板高出27%——阴天差距小一点,晴天太阳路线长的时候差距能拉到35%以上。这个数字直接让我觉得,当初折腾这套基于STM32单片机太阳能电池板追日光跟踪系统,值了。
这套系统说白了不难:用光敏器件感知太阳方位,STM32读ADC判断光从哪边来,再控制舵机把太阳能板转到正对太阳的角度。成本不高、原理清晰、调试空间大,非常适合电子爱好者入门,也是单片机课程设计和毕业设计的常见选题。下面我把整个从选型到调通的完整过程拆开讲一遍,包括哪些地方容易翻车、为什么这样设计,以及实测数据到底怎么样。
1. 固定光伏板的效率瓶颈:追光这件事的物理账
先算一笔账再动手。太阳在一天之内从东到西扫过大约180度(夏至日长些,冬至日短些),高度角也从日出时的接近0度升到正午的最高点再落回去。一块固定安装的光伏板,不论你怎么调倾角,一天里绝大部分时间都和太阳光线存在夹角。
光伏板的输出功率和光线入射角的关系近似满足余弦定律:实际接收到的有效辐照度 ≈ 垂直辐照度 × cos(入射角)。入射角20度时功率损失约6%,30度时损失约13%,45度时损失高达29%。这意味着如果光伏板正午调得最准,那上午十点和下午三点可能已经偏了40度以上,发电量打七折。
双轴追日系统理论上可以把入射角始终压到10度以内,在晴好天气下比固定安装多收30%到40%的电。这个增量对大型电站来说意味着巨额投资回报差异,对个人DIY来说就是实打实的“多充几个充电宝”的区别。更重要的是,追光系统本身消耗的功率极低——一个舵机加一片STM32,整机功耗不到2瓦,和光伏板的几十瓦输出相比完全在合理范围内。
那为什么很多固定板用户感觉不到损失?因为大多数人只在正午前后观察发电功率,而这个时段恰好人射角最小。把全天发电量累计起来对比,差距就非常明显了。我实测的数据放在后面,这里先记住结论:追光系统解决的不是“发电电压够不够”,而是“全天累计发电量最大化”的问题。
2. 硬件选型搭配:光敏电阻、舵机和STM32为什么是最优组合
追光系统听起来高级,核心部件其实只有三个:感知阳光方向的传感器、处理信号的主控、把光伏板转过去的执行机构。选型逻辑如下。
2.1 光敏传感器:别一上来就买“光照传感器模块”
市面上有BH1750这类数字光照强度传感器,I2C接口,读数精确,但它测的是绝对照度,不适合做方向判断。追光系统需要的是“哪个方向更亮”的相对比较。最合适的反而是最便宜的光敏电阻(光敏电阻LDR,几毛钱一个)。
光敏电阻的阻值随光照增强而减小,配上固定电阻分压后,ADC读到的电压随光照升高而升高。它的响应速度虽然只有几十毫秒级别,但追光根本不需要快响应——太阳在天上的角速度大约15度/小时,也就是0.0042度/秒,光敏电阻绰绰有余。
有些方案用光敏二极管加运放,精度更高,但电路复杂度上去了,调试门槛也高。对个人项目和课程设计来说,光敏电阻的线性度和重复性完全够用。关键是选暗阻和亮阻差异大的型号,我用的是GL5528(亮阻5-10kΩ,暗阻0.5MΩ),分压灵敏度非常理想。
2.2 执行机构:舵机还是步进电机
追光执行机构有两个选择:SG90舵机和28BYJ-48步进电机。
SG90舵机扭矩小(约1.6kg·cm),直接带一块30cm见方的小光伏板没问题,不需要额外驱动,信号线直接接STM32的PWM输出引脚就能转,三根线(VCC/GND/SIG)接线极其简单。缺点是扭矩有限,大板子撑不住。
28BYJ-48步进电机扭矩大一些,便宜,但需要ULN2003驱动板,控制逻辑更复杂。好处是可以精确控制角度,实现真正的“方位角+高度角”双轴追日。
如果只是做单轴东西方向跟踪(就像我做的这套),SG90完全够用。做双轴且太阳能板面积较大,才建议上步进电机。我见过不少人在单轴小板上硬上步进电机,最后发现根本没必要,纯属给自己增加复杂度。
2.3 主控:为什么选STM32而不是51或Arduino
51单片机当然也能做ADC采样和PWM输出,但有几个不舒服的点:ADC是8位或10位,采样通道要切换寄存器;没有硬件PWM或者PWM精度粗糙;代码写起来库函数支持弱,开发效率低。
STM32F103C8T6就不一样了——12位ADC、多通道定时器PWM、丰富的GPIO,一个最小系统板十几块钱。最关键的是HAL库把底层寄存器操作封装好了,配置ADC和PWM都是填结构体的事,写起来思路清晰,调起来也不容易莫名踩坑。加上网上资料极其丰富,遇到问题一搜一大把解决方案,对新手非常友好。
还有个重要原因:这套系统的传感器、执行机构、通信接口(后续想加Wi-Fi上报数据)都要占外设资源,STM32的外设丰富度为后续扩展留了充足裕量。51做完了就真的做完了,想扩展基本要推倒重来。
3. 追光检测原理:四象限光敏探头是怎么“看见”太阳的
追光的核心不是测出太阳的绝对角度,而是让光伏板始终对准“当前最亮的方向”。我采用的是四象限差分检测法,原理不复杂但非常可靠。
3.1 四象限检测结构
在光伏板四边中点各安装一个光敏电阻,分别标记为东(E)、西(W)、南(S)、北(N),板中央加一块高约2到3厘米的不透光隔板,把四个光敏电阻互相遮挡。这个隔板是关键,没有它,四个光敏电阻都会直接暴露在全天光环境下,比较信号差异会非常小。
隔板的作用相当于给每个光敏电阻制造“阴影角”。当太阳在正东方时,东侧光敏电阻受光充分,西侧被隔板挡住处于阴影中,两侧电压差最大。当太阳逐渐移到正上方,两侧光照趋近一致,电压差也随之缩小。通过比较东西两侧的电压差,就能判断光伏板应该往哪个方向转。
我试过不加隔板的方案,结果四个传感器数值几乎一致,系统完全无法判断方向。加了隔板后,判别范围立刻清晰了。这里隔板高度也需要实验调,太高会导致系统“瞎转”,太低则判别区间太窄。我的经验是隔板高度取光伏板短边长度的1/8到1/10比较合适。
3.2 信号调理与ADC采样策略
每个光敏电阻和一个10kΩ固定电阻串联,组成分压电路,分压点接STM32的ADC输入引脚。STM32内置12位ADC,参考电压3.3V,理论上能分辨约0.8mV的电压变化,实际噪声环境下大概能稳定分辨几毫伏级别,对应光敏电阻阻值变化几十欧姆,灵敏度完全够。
软件上每个通道连续采样8次取平均,再做一次简单的滑动滤波,消除云层飘过造成的光照抖动。采样频率不需要高,每200ms采样一轮足够,毕竟太阳移动速度极慢,人为增加刷新率只会让舵机频繁抖动,加速机械磨损。
3.3 比较判据和死区设置
得到四通道的滤波后电压值后,东西方向偏差量 east_west_diff = (E - W) / (E + W),这是一个归一化的偏差值,好处是不受绝对光照强度影响——早上阳光弱和中午阳光强时,比值才有可比性。同理可以计算南北方向偏差 north_south_diff。
归一化之后要设置死区。这个很关键,没有死区或者死区太小,舵机在正对太阳附近会来回抖动,因为ADC采样总有小噪声,电压差在零附近正负跳变导致舵机反复纠偏。死区一般设为0.05到0.1,也就是说只有当偏差量绝对值超过这个阈值才驱动舵机转动,否则保持当前位置。这个参数直接影响系统稳定性和舵机寿命,值得花时间仔细调。
如果做双轴系统,南北方向的偏差用于控制俯仰舵机,东西方向的偏差用于控制水平舵机,逻辑相同,只是舵机安装方式不同。
4. 电路搭建与舵机驱动:分压计算、供电隔离一个都不能少
硬件部分看着简单,但有不少细节会直接影响系统能不能稳定长期运行。
4.1 分压电路与ADC输入保护
以GL5528光敏电阻为例,亮阻约5kΩ,暗阻约0.5MΩ。用10kΩ固定电阻下拉接地,光敏电阻一端接3.3V,一端接ADC输入引脚。理论上光照从暗到亮时,ADC引脚电压从接近3.3V降到接近0V。等等,这里要注意接法——如果固定电阻放上面(接3.3V)、光敏电阻放下面(接地),则亮的电压高,暗的电压低,逻辑更直观。我采用的是固定电阻接3.3V,光敏电阻接地的接法。
计算验证一下:光敏电阻亮阻5kΩ,分压点电压 = 10kΩ / (10kΩ + 5kΩ) × 3.3V ≈ 2.2V;暗阻0.5MΩ时,分压点电压 = 10kΩ / (10kΩ + 500kΩ) × 3.3V ≈ 0.065V。ADC读数范围从65mV到2.2V,覆盖了大部分量程,穿度非常好。
所有ADC输入引脚前串一个1kΩ限流电阻,再并联一个100nF滤波电容,这样可以滤掉高频噪声,还能防止意外过压损坏引脚。这是很多教程不会提的细节,但实际做下来对采样稳定性帮助很大。
4.2 舵机控制与供电隔离
SG90舵机的控制信号是50Hz的PWM,高电平脉宽0.5ms到2.5ms对应0到180度。STM32定时器配置成PWM模式,周期20ms,比较值在2.5%到12.5%占空比之间调整即可。我用TIM2的CH1和CH2分别控制水平和俯仰舵机。
这里最大的坑是供电。SG90舵机在堵转时电流能到500mA以上,如果和STM32共用同一个3.3V稳压器,舵机一动作就会把电压拉低,STM32直接复位。最稳妥的做法是:舵机用5V单独供电(可以共用锂电池但分开稳压),STM32核心板用AMS1117等稳压芯片供电,两者共地但不共电源。如果你用USB给STM32供电,舵机的5V一定别从USB取电,USB口的电流保护很弱。
我一开始图省事,所有器件都从一片LM2596降压模块取电,结果舵机每次转动,屏幕就开始闪烁,后来串入示波器才发现舵机动作瞬间电压跌落超过1V。拆开分别供电后整个世界清静了。
4.3 机械结构:光伏板支架怎么做
我用的是一块30×20cm的小光伏板(5V/5W),支架用2mm厚的铝板折弯而成,水平和俯仰两个旋转轴用M3螺丝加尼龙垫圈固定,确保转动顺滑又不会晃动。舵机通过舵机臂和球头连杆连接光伏板背面,这样舵机的旋转运动转化为光伏板的俯仰摆动。
这里有个值得注意的细节:球头连杆的行程会放大或缩小舵机的角度变化。舵机转30度,光伏板可能只转15度,这取决于力臂比。力臂比大,扭矩大但转动范围小;力臂比小,转动范围大但扭矩小。我调了好几次才找到一个平衡点——舵机转45度,光伏板转约35度,能覆盖太阳从东到西的全程角度。
5. 软件实现:从ADC采样到舵机跟随的完整逻辑
软件部分我用STM32CubeMX生成初始化代码,然后在HAL库基础上写主逻辑。整体流程是:初始化时钟和所有外设 → 主循环中周期性读取四通道ADC → 计算归一化偏差 → 判断是否超过死区 → 控制舵机转动 → 延时后继续下一轮。
// 主循环核心逻辑(简化版) uint32_t last_check = 0; while (1) { if (HAL_GetTick() - last_check >= 200) { // 每200ms一轮 // 1. 读取四路ADC采样值(每路采8次取平均) uint16_t e = read_adc_avg(&hadc1, ADC_CH_E); uint16_t w = read_adc_avg(&hadc1, ADC_CH_W); uint16_t s = read_adc_avg(&hadc1, ADC_CH_S); uint16_t n = read_adc_avg(&hadc1, ADC_CH_N); // 2. 归一化偏差计算 float diff_ew = (float)(e - w) / (e + w + 1); // 加1防除零 float diff_sn = (float)(s - n) / (s + n + 1); // 3. 死区判断 float deadband = 0.08f; // 4. 舵机步进调整(每次只转一小步,避免过冲) if (diff_ew > deadband) { set_servo_angle(SERVO_HORIZONTAL, get_servo_angle(SERVO_HORIZONTAL) - 1); } else if (diff_ew < -deadband) { set_servo_angle(SERVO_HORIZONTAL, get_servo_angle(SERVO_HORIZONTAL) + 1); } // 南北方向同理,处理俯仰舵机 if (diff_sn > deadband) { set_servo_angle(SERVO_VERTICAL, get_servo_angle(SERVO_VERTICAL) - 1); } else if (diff_sn < -deadband) { set_servo_angle(SERVO_VERTICAL, get_servo_angle(SERVO_VERTICAL) + 1); } last_check = HAL_GetTick(); } }几个关键设计思路解释一下:
第一,舵机每次只转1度而不是直接转到目标角度。这看起来“保守”,但实际上防止了过冲。如果偏差大,舵机连续多轮调整也能快速到位;如果偏差接近死区,1度一步的精度能確保平稳收敛。用大角度快速调整的话,机械惯性会导致来回振荡。
第二,200ms的判断周期是实测选出的折中值。太快舵机来不及响应机械动作,太慢则太阳角度变化时系统反应迟钝。200ms配合每次1度的步进,从一次明显的偏移(比如人为挡住一个传感器)到重新对准,大约需要2到3秒,体验很好。
第三,开机时要给舵机上电初始化到中间位置(90度),防止光伏板启动瞬间乱甩打到机械限位。这个初始化代码一定不能省,我就吃过亏——第一次上电舵机默认角度不对,光伏板直接拍到支架上,还好没损坏。
6. 实测数据与调参避坑:哪些教训是教程不会告诉你的
整个项目从画原理图到稳定运行,我花了大概两周业余时间。其中硬件一天就能焊完,剩下一周多全在调软件参数和解决各种诡异现象。这里挑几个最典型的记录一下,希望能帮后来人少走弯路。
6.1 固定安装与追光系统的发电量对比
我用两个相同的5V/5W光伏板做对照实验,一块固定朝南倾斜30度,一块装在追光支架上。用一个简单的电阻负载(5Ω,10W)加两个INA219电流电压模块分别记录输出功率,数据存到SD卡,每小时记录一个平均值。
连续一周晴天的数据如下(选取其中代表性的一天):
| 时间段 | 固定板平均功率(W) | 追光板平均功率(W) | 提升比例 |
|---|---|---|---|
| 08:00-10:00 | 1.8 | 2.7 | 50% |
| 10:00-12:00 | 3.2 | 3.9 | 22% |
| 12:00-14:00 | 3.6 | 3.8 | 6% |
| 14:00-16:00 | 2.5 | 3.3 | 32% |
| 16:00-18:00 | 1.2 | 2.2 | 83% |
全天累计下来,追光板比固定板多发约27%的电。数据符合预期:正午时分两者差距最小,因为固定板此时恰好对准太阳;早晚差距最大,尤其下午16点以后,固定板的入射角已经很大,而追光板仍然基本正对太阳。
6.2 舵机抖动问题:死区参数和机械阻尼的博弈
第一版代码死区设得只有0.03,结果系统在正对太阳附近时舵机以1秒左右的周期来回颤抖。刚开始以为是代码bug,后来用串口打印偏差数据才意识到,variance来自ADC噪声和光敏电阻自身的微小响应波动。把死区从0.03调到0.08后,抖动彻底消失。
但这带来另一个问题:死区太大,太阳实际偏移了好一阵子系统才响应,平缓但稍微滞后。为了兼顾稳定和灵敏,我在死区之外加了“滞后比较”逻辑——舵机转完后,要等偏差绝对值重新超过死区并且持续两次采样(400ms)才再次转动。这样既不会连续颤抖,又不会过度滞后。
6.3 阴天和多云天气的处理策略
阴天时阳光变成散射光,四个光敏电阻读到的值几乎没有方向性差异,归一化偏差始终在死区内,舵机保持不动,这其实是正确的行为——阴天无论怎么转板子,发电量差别都不大,还不如固定不动省电。
但遇到的问题是有云缝的间歇性晴天:云层飘过时一个传感器被云挡住,偏差突然变大,舵机快速跟着“找太阳”,云过去后又得转回来。反复调整对舵机寿命影响很大。我的解决方法是加大滤波深度——每轮采样增加到16次取平均,并且舵机步进从1度减小到0.5度。这样做之后,系统对短时的云层遮挡反应明显迟钝,但对持续10分钟以上的天气变化和正常的太阳移动仍然能准确跟踪。
6.4 一个容易忽视的细节:光伏板阴影和光敏探头的安装位置
光敏电阻安装位置不能太靠近光伏板边缘,否则光伏板边框的阴影会提前挡住传感器,造成虚假的“方向”信号。我把光敏探头安装在光伏板前上方的一个小支架上,和光伏板保持约3cm距离,这样传感器看到的视野和光伏板表面基本一致,又不会被光伏板自身的阴影干扰。
另外,整个系统需要考虑雨淋防护。光敏电阻裸奔是没问题的,但接线端子要做好防水。我用热熔胶把所有焊点封了一层,电路板装在防水接线盒里,目前淋过两场雨,一切正常。
7. 后续升级方向:从单轴到双轴、从开环到闭环
这套系统跑稳之后,我一直在想还能往哪个方向深入。如果你也想在这个基础上继续折腾,这几个方向值得考虑。
双轴化是首当其冲的升级。单轴追日只跟踪太阳的东升西落,适合低纬度地区。高纬度地区太阳高度角变化很大,加上俯仰轴后,全年发电量还能再提升5%到10%。硬件上只需加一个舵机,软件上多一路ADC通道,改动成本很低。
其次是加MPPT(最大功率点追踪)。追日系统让光伏板正对太阳,解决的是“外因”问题——光线入射角度;MPPT则优化“内因”——光伏板工作在最大功率点。STM32完全可以同时做这两件事:用ADC实时采样光伏板输出电压电流,通过扰动观察法(P&O)动态调节DC-DC变换器的占空比,让光伏板始终工作在最大功率点附近。追日加MPPT,发电量的提升才能最大化。
再加一个ESP8266或ESP32做数据上报,就能远程查看发电数据和系统状态。我目前用ESP-01S把功率数据通过MQTT协议上报到Home Assistant,手机随时能看。类似“宿舍控制灯开发”“8266远程控制”这类项目思路完全可以复用到光伏监控上。
还有一个方向是根据天文学算法做太阳位置计算,用GPS或RTC获取时间和经纬度,直接算出太阳的方位角和高度角,作为前馈控制信号,光敏反馈只做修正。这样即使传感器被落叶或灰尘挡住,系统也不会完全失去方向判断能力。两者互为冗余,可靠性更高。
我做这套系统最大的体会是:项目不难,但把每一个细节想清楚并落实,比在教程里看别人做出来要花更多心思。从AD采样的噪声抑制,到死区参数的反复调节,再到机械结构的一次次调整,这些“看不见的功夫”才是项目真正的价值所在。希望这篇记录能帮你少踩一些我踩过的坑,如果你也装完了这套追光系统,欢迎来交流你测到的发电量数据。
本文还有配套的精品资源,点击获取