基于STM32的太阳能电池板双轴追日跟踪系统设计与实现
2026/9/10 1:40:55 网站建设 项目流程

简介:基于STM32单片机的太阳能电池板追日光跟踪系统设计资料,面向嵌入式开发学习者、电子竞赛参赛者及新能源方向研究人员,解决如何利用单片机实现太阳位置检测与步进电机跟随控制的问题。资源包共365个文件,约84.26MB,以C语言源码(66个c、68个h)为核心,涵盖ADC光线采集、PWM电机驱动、系统主控逻辑等关键代码;同时包含原理图、电路设计文档、PDF说明、运行截图及操作演示视频,便于从硬件搭建到软件调试全流程参考。压缩包还整理了Keil工程文件、编译中间文件及备份配置,可直接导入工程查看完整项目结构。已有6053人学习该资源,适合需要快速掌握STM32光跟踪系统整体设计思路、传感器数据处理和步进电机控制方法的读者,也可作为课程设计或竞赛项目的进阶模板。 最近我完整做了一遍基于STM32单片机太阳能电池板追日光跟踪系统的设计,从原理图、元器件选型,到代码调试和室外实测,整个流程走完以后,我对“低成本追日系统”这件事有了非常具体的认识。这个项目核心并不复杂:用光敏传感器判断太阳方位,单片机配合舵机让电池板实时朝向太阳,让光伏板尽可能保持最佳受光角度,从而提升发电效率。

主控选用STM32F103C8T6,传感器是普通光敏电阻,执行机构是两个SG90舵机组成双轴结构,整体成本不高,也能满足课程设计、毕业设计以及小型光伏实验平台的精度要求。下面我按系统设计、硬件选型、控制算法、调试过程和问题排查这几个方面,把整套方案和踩坑经验一次性写清楚。如果你正要做类似的追光系统,这篇文章可以当成一个直接参考的底稿。

1. 太阳能追日系统整体设计思路与方案选型

1.1 太阳能电池板为什么要“追”太阳

光伏板的输出功率和入射光角度关系非常密切。太阳一天内从东到西不断移动,固定安装的电池板只有正午前后一小段时间能保持最佳受光角度,其他时间段的实际发电效率都会明显下降。根据我平时收集的实测数据,单轴追光系统一般能提升20%到30%的发电量,双轴追光在晴朗天气下甚至可以提升接近40%,这个收益对分布式光伏和教学演示项目来说都相当可观。

但追日跟踪真正要解决的是两个问题:一是怎么判断太阳当前在哪个方向,二是怎么让电池板准确、平滑地对准太阳。行业里主流有两类方案,一类是光敏传感器实时跟踪,另一类是天文算法跟踪。天文算法需要经纬度、时间和日期数据,通常要配合实时时钟和GPS模块,定位准确但成本高、调试复杂。我这次选择光敏传感器方案,理由很简单:成本低、实现直观,而且它直接响应“当前光线最强的方向”,在多云和局部遮挡场景下反而更灵活。

1.2 单轴还是双轴:我的选择逻辑

单轴系统只在一个平面上转动,常见的是水平方向追踪太阳的东升西落轨迹。它的结构简单、控制逻辑也少,适合屋顶固定式光伏等场景。双轴系统则同时控制水平方位角和俯仰角,相当于在三维空间里追踪太阳的位置,适应面更广,跟踪精度也更高。

我这次做了双轴方案。一个舵机负责方位角,带动整个支架水平旋转,另一个舵机负责俯仰角,让电池板前后倾斜。从代码角度来看,双轴只比单轴多了一路ADC采集、一路偏差计算和一路PWM控制,工作量并不会翻倍,但跟踪效果和演示体验会明显上一个档次。对正在准备毕业设计或者工程展示的读者来说,双轴方案“看起来更专业”这一点,在答辩时其实挺占优势的。

1.3 系统整体架构

整个系统可以拆成四个部分:光强感知部分、主控部分、执行机构、电源部分。光强感知用四个光敏电阻分别安装在电池板的四个角,左右各一组,上下也各一组;主控是STM32F103C8T6最小系统板;执行机构是两个SG90舵机,一个管水平转动,一个管俯仰;电源部分用5V USB输入,再经过稳压给单片机和传感器供电。

系统的控制流程很清晰:四路光敏电阻分别把光照强度转换成电压,接到STM32的ADC引脚。单片机周期性读取AD值,把上下左右对应位置的读数做差分比较,判断光线偏向哪边,然后输出PWM信号控制舵机朝光线更强的一侧转动。当四路读数趋于平衡时,就认为电池板已经正对太阳,整个跟踪过程就这么周而复始地运行下去。

2. 硬件选型与关键电路设计

2.1 STM32单片机选型

STM32F103C8T6是一颗性价比非常高的芯片,基于ARM Cortex-M3内核,主频72MHz,内置64KB Flash和20KB RAM,对这个小系统来说资源足够富裕。它的外设里有3个12位ADC,支持多通道采集,还有4个16位定时器可以输出PWM,引脚数量也完全够用。

有读者可能会问,这种功能用51单片机行不行。严格来说51也能做,但STM32在ADC精度、转换速度、定时器功能上比51强一大截。更关键的是调试体验,STM32配合ST-Link可以在线仿真,直接看变量和寄存器值,排查问题比51用串口打印的方式快得多。STM32的生态资料也极其丰富,遇到问题基本都能找到现成答案,这对一个人独立完成项目来说帮助非常大。

2.2 光敏电阻传感器电路

光敏电阻的阻值会随光照强度变化:光照越强,阻值越低。利用这个特性,把光敏电阻和一个固定电阻串联,中间引出分压点,接到STM32的ADC引脚,就能把光强转换成电压信号。

电路实现上我用了四个光敏电阻,分别和10kΩ固定电阻串联,分压点接PA0到PA3。这里有几个经验值得记住。第一,光敏电阻要买同一批次、同型号的,否则四个通道的初始阻值差异会很大,校准的时候特别折磨人。第二,光敏电阻不加遮挡时接收的是大范围漫反射光,方向性很差,我用黑色热缩管把感光面四周包起来,只留正前方一个小窗口,这样它对方向的敏感度会强很多。第三,ADC参考电压就是单片机供电电压3.3V,如果输入电源不稳,读数就会漂,所以供电链路要提前做好。

2.3 舵机结构与驱动

舵机是执行机构的核心。SG90是入门级的模拟舵机,工作电压5V,扭矩大概在1.8kg/cm,驱动一块小面积的光伏板模型绰绰有余。舵机控制信号是50Hz的PWM波,脉宽0.5ms对应0度,1.5ms对应90度,2.5ms对应180度。

STM32的定时器输出PWM很方便,配置好参数后,硬件会自动生成稳定的方波,完全不需要CPU干预。但要注意,SG90这种模拟舵机的脉宽和角度并不是严格的线性关系,尤其是接近两个极限位置时会有偏差。所以不要直接按比例计算脉宽,最好实测几个关键角度对应的脉宽值,做一个简单的查表映射。如果后面要驱动真正的光伏板而不是模型,就得换大扭矩金属齿轮舵机,或者改用步进电机加驱动器,控制方式会变成脉冲/方向信号,定位精度和扭矩都能提升不少。

2.4 电源与系统供电设计

电源是整个系统里最容易翻车的一环。舵机正常运转时需要几百毫安电流,启动瞬间电流更大,而STM32和传感器整个控制部分加起来也就几十毫安。如果把它们接在同一个弱供电电路上,舵机一启动,电压瞬间跌落,单片机可能直接复位,表现出来的现象就是系统一闪一闪地乱动。

我最后采取的方式是分开供电:控制部分用3.3V,舵机部分用5V,电源入口处再加一个大容量电解电容,比如1000μF,用来吸收舵机启动时的瞬态电流。两路电源最终要共地,否则PWM信号会没有电平参考基准,舵机就会完全乱转。实测下来,这个方法简单有效,问题基本消失。

3. 核心控制算法与软件实现

3.1 四路光敏传感器数据采集

ADC采集我建议用规则通道组加DMA的方式。STM32的ADC可以配置成扫描模式,连续把四个通道的转换结果放进内存数组,CPU不用一直等待单个通道转换完成。我每次启动一轮DMA传输,四路数据就自动就位,整体效率很高。

采集到的原始AD值不能直接用。光敏电阻在室外环境下的信号波动很大,云层经过、风吹树叶的阴影都会造成瞬时干扰。我做了两层滤波:第一层,连续采样十次,去掉最大值和最小值后求平均;第二层,再做滑动平均,保留最近几轮的平均值参与控制判断。这个组合滤波放在STM32上完全不占用太多资源,但对最终稳定性的提升非常明显。

3.2 偏差计算与死区控制

这是整个系统的控制核心。假设四个光敏电阻分别对应左上、右上、左下、右下,水平方向偏差用左侧两路均值减去右侧两路均值,垂直方向偏差用上方两路均值减去下方两路均值。两个差值分别对应两个舵机的转向依据。

当水平偏差大于某个正阈值,说明光线来自左侧,水平舵机应该往左转;小于负阈值就往右转。这里必须设计一个死区,也就是当偏差绝对值小于某个阈值时,认为系统已经对准,舵机不动作。如果没有死区,系统会在目标位置附近不停摆动,舵机发热、噪音大,齿轮也会快速磨损。死区具体大小需要实际调整,我一般先从满量程的2%开始,根据室外测试效果微调。

3.3 舵机PWM控制实现

我用STM32的TIM2输出两路PWM。假设系统时钟为72MHz,把PSC设为71,得到1MHz的定时器计数频率,也就是每个计数周期1μs。再把ARR设为19999,PWM周期就是20000μs,也就是20ms,对应50Hz,完全满足舵机需求。此时CCR每增加1,脉宽增加1μs,所以CCR=500对应0.5ms,CCR=1500对应1.5ms,CCR=2500对应2.5ms,逻辑非常清晰。

直接给一个大的角度跳变会让舵机突然甩过去,机械冲击大,看起来也不自然。我的做法是限制每次控制周期的CCR变化量,让目标值向期望值逐步靠近。这样舵机运动过程是平滑加减速的,整个电池板的转动更像真实的跟踪动作,对机械结构也更友好。

3.4 初始化与边界保护

系统上电初始化时,我会先让舵机回到中位,也就是1.5ms脉宽对应的90度位置,确保电池板处于一个安全的初始姿态。这里有个细节:在定时器还没开始输出PWM前,先把舵机信号引脚配置成推挽输出并拉低,防止GPIO默认电平导致舵机上电瞬间乱转。等所有外设配置完成后再输出PWM,就能避免上电误动作。

边界保护同样不能省。舵机有物理极限位置,程序里必须对目标脉宽做上下限钳制。我遇到过俯仰舵机因为目标角度超出范围,被支架卡住,堵转电流很大,舵机很快发热。后来加了一个简单的钳位函数,把脉宽限制在500到2500之间,再根据机械限位缩小一点安全余量,这个问题再没出现过。

4. 实操过程与调试要点

4.1 搭建最小系统与开发环境

开发环境我用Keil MDK5加STM32标准外设库,调试器是ST-Link V2。STM32F103C8T6最小系统板价格很低,板载USB转串口和一个LED,对原型验证来说非常合适。我先把四个光敏电阻连到PA0到PA3,两个舵机信号线分别接PA8和PA9,电源接5V,很快就搭出了一套能跑的原型。

第一次烧录时我就碰到了一个非常典型的报错:“error: no stm32 target found!”。这个错误绝大多数情况下是ST-Link连接问题,跟代码关系不大。我的排查顺序是:先确认SWD的四根线有没有接反,再看ST-Link在电脑设备管理器里有没有正常识别,最后检查板子供电是否稳定。还有个土办法很有效:按住板上的复位键,在Keil里点下载,等界面开始擦除Flash的瞬间松开复位键,成功率会明显提高。

4.2 用手电筒模拟太阳做室内闭环测试

正式去室外之前,我在室内用手电筒模拟太阳做了大量测试。方法很直接:把系统放在桌面,用手机闪光灯从不同方向照射传感器,观察舵机是否朝光源方向转动,同时观察四个ADC值的变化是否符合预期。

第一轮测试最容易翻车的地方就是左右方向搞反。光照在左边,传感器算出差值,程序却让舵机往右转,整个系统就是在跟太阳“对着干”。这个问题本质上是偏差计算的正负号和舵机转向没有对应上。我后来在程序里把传感器差分计算和舵机转向抽象成两个独立模块,先用固定测试值验证舵机转向是否正确,再接上真实传感器做闭环,排查速度会快很多。

4.3 传感器一致性校准

光敏电阻最大的问题是个体差异。四个光敏电阻放在同一个光源下,AD值可能差几十甚至上百。如果直接使用原始AD值做差分,系统会一直认为有一侧光线更强,电池板就会长期偏向错误方向。

我的校准方法是:先在均匀光强下记录四路初始值,然后在程序里用实时值除以初始值,做一个归一化处理。这样每个通道的数值变成了相对量,一致性大幅提升,即使光照整体变弱也不容易失效。实测下来,归一化处理在多云天气的优势非常明显,整套系统的判断稳定性比直接用原始AD值好了不止一个档次。

5. 常见问题与避坑经验

5.1 舵机抖动和持续摆动

这是追光系统里最容易遇到的问题。舵机在目标位置附近快速来回摆动,声音刺耳,发热明显。原因通常在两个方向:一是死区设置太小,细微的光线变化都会触发转向动作;二是舵机供电电压偏低,位置反馈不稳定。解决方法是把死区适当调大,同时检查舵机供电是否独立,不要在5V电源上并联过多负载。

5.2 ADC采集值跳变明显

室外场景下,ADC值的跳变几乎躲不掉。我的处理思路分三层:第一层在采集端,做滑动平均滤波,去掉瞬时噪声;第二层在控制逻辑,连续多次超过阈值才真正触发转向;第三层在执行端,限制每次脉宽变化步长。三层配合下来,整套系统在有轻微云层遮挡时依然能保持稳定,不会出现舵机频繁乱动的情况。

5.3 传感器盲区和失效保护

光敏电阻在某些场景下会“看不到”太阳,比如阴天光线非常均匀时,四路AD值几乎一样,差分结果一直在死区之内,系统会保持上一次的位置不动,这是正常且正确的行为。真正要注意的是某一颗光敏电阻被遮挡、短路或者断路,AD值会跑到接近0或者接近满量程,此时差分会严重失真,舵机可能转向错误方向。

我在程序里加了一个简单的故障判断:当某一路AD值长期处于异常区间,系统自动进入安全模式,保持当前角度不再转动。这个逻辑不需要额外硬件,却能在关键时候保护执行机构,强烈建议加上。

5.4 户外部署的注意事项

如果要做长时间户外运行,有几个细节要提前考虑。传感器和主控板建议放进防水盒,传感器开孔处用密封胶封好,但一定不能挡住感光面。光伏板本身的金属框架在雷雨天气可能引入感应电压,所以恶劣天气必须断电,否则单片机很容易被打坏。舵机齿轮的润滑和防锈也要定期检查,长时间运行后转动阻力会变大,舵机长期过流工作,最终烧毁驱动电路。

5.5 给正在做类似项目的读者一些建议

整个项目做完,我最大的感受是追光系统看起来不复杂,但稳定性全靠细节堆出来。传感器的一致性、采集滤波、死区设置、舵机供电、角度钳位、初始化顺序,这些单个拿出来都不难,但组合在一起就是一套完整的工程思维。

如果让我分享一个最有用的方法论,我会说:先室内闭环,再室外实测;先小舵机验证算法,再上大扭矩执行器;遇到异常先看数据,再改代码。这套流程帮我省下了大量无用调试时间,应该也能帮你少走不少弯路。

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询