FEATURED · 精选文章

基于STM32的太阳能电池板双轴追日跟踪系统设计与实现

发布时间 / 2026/9/10 1:40:59
来源 / 创域科博编辑部
栏目 / 资讯中心
基于STM32的太阳能电池板双轴追日跟踪系统设计与实现 简介基于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设为19999PWM周期就是20000μs也就是20ms对应50Hz完全满足舵机需求。此时CCR每增加1脉宽增加1μs所以CCR500对应0.5msCCR1500对应1.5msCCR2500对应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 给正在做类似项目的读者一些建议整个项目做完我最大的感受是追光系统看起来不复杂但稳定性全靠细节堆出来。传感器的一致性、采集滤波、死区设置、舵机供电、角度钳位、初始化顺序这些单个拿出来都不难但组合在一起就是一套完整的工程思维。如果让我分享一个最有用的方法论我会说先室内闭环再室外实测先小舵机验证算法再上大扭矩执行器遇到异常先看数据再改代码。这套流程帮我省下了大量无用调试时间应该也能帮你少走不少弯路。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻