ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于STM32的双轴追日系统设计与实现

基于STM32的双轴追日系统设计与实现 简介哈尔滨工业大学2021年10月大创结题报告内容为基于STM32的太阳能电池板追日系统的完整设计与实现。项目以STM32F103C8T6单片机为控制核心配合4路光敏采集电路、ULN2003驱动芯片及双轴步进电机实现光照强度检测、角度计算与自动追踪并加入TP4056锂电池充电、升压稳压、TFT彩屏显示和手动按键控制等功能。压缩包内含1个docx文档约1.22MB报告涵盖项目背景、总体设计方案、STM32与ULN2003原理分析、电路原理图与PCB搭建、系统集成优化、项目成果与展望等章节。整体结构清晰适合高校大创项目、嵌入式课程设计及太阳能追光方向学习参考已有982人学习下载。1. 固定支架少发两成电追日系统才是光伏的完全体太阳能板固定安装时只有正午前后几小时能接近垂直入射早晨和傍晚的光线斜射角度大反射损失极高。实测数据表明双轴追日系统相比固定倾角安装年发电量可提升 20%~30%在低纬度地区增益更明显。这套基于 STM32F103C8T6 的追日系统用 4 路光敏电阻感知空间光照分布配合 ULN2003 驱动的双轴步进电机把太阳能板实时对准太阳结构简单、成本不到 200 元。核心逻辑并不复杂——四路光照值不一致就说明没对准哪边强就往哪边转直到四路读数落入容差范围。整套系统从硬件焊接、Keil 编程到整机联调做一遍就能把 ADC 采集、PWM 脉冲控制、电机驱动、电源管理这些嵌入式基本功全部串起来。2. 硬件架构与模块选型从光敏电阻到双轴电机2.1 系统总体架构整个系统分为主控板和光敏采集板两块 PCB。光敏采集板上焊接 4 个光敏电阻分上、下、左、右四个方位通过连接线把模拟量送回主控板。主控板承担全部处理任务STM32F103C8T6 读取四路 ADC 通道、运行控制算法、输出脉冲到 ULN2003、驱动两路步进电机同时管理 TFT 彩屏显示、按键输入和锂电池充放电。系统框图可以按信号流向理解光敏电阻的阻值变化 → 分压电路转化为电压 → STM32 的 ADC 通道采样 → 数值比较算法 → GPIO 输出步进脉冲 → ULN2003 电流放大 → 步进电机转动 → 太阳能板姿态变化 → 光敏电阻读数重新分布。这是一个典型的闭环控制系统反馈量是四路光强执行量是水平和垂直两个轴向的旋转角度。2.2 STM32F103C8T6 选型分析做追日控制器可选方案有 PLC、Arduino、STM32 三种。PLC 可靠性高但价格贵单片小型 PLC 就要几百元而且梯形图做浮点运算和 ADC 多通道采集很别扭。Arduino 生态友好但算力和外设资源一般做电机控制和屏幕刷新同时跑会吃力。最后选 STM32F103C8T6核心原因是性价比和外设匹配度。具体到本项目用到的外设资源ADC1 的 5 个通道4 路光敏 1 路电池电压检测、若干 GPIO 输出脉冲、USART1 用于调试打印、SPI 或并口驱动 TFT 彩屏、定时器做步进电机脉冲延时控制。F103C8T6 的 64KB Flash 和 20KB RAM 对这个量级的代码完全够用48 引脚 LQFP 封装也方便手工焊接。价格方面核心板零售价大约 15~25 元拆机芯片甚至不到 10 元。需要注意区分的是市面上很多 STM32F103C8T6 核心板使用的是STM32F103C8T6芯片64KB Flash编译时在 Keil 里选择对应的 Device 型号。如果代码量较大且开启了优化选项Flash 占用超过 64KB 会导致链接失败此时需要裁剪代码或改用STM32F103RCT6256KB Flash。2.3 电源管理链TP4056 与升压稳压追日系统是户外设备供电链路完整与否直接决定系统能不能在阴天持续工作。原方案的电源链路是太阳能板输出7x7cm开路电压约 5.5V~6V→ TP4056 锂电池充电模块 → 3.7V 锂电池 → 升压稳压模块 → 5V 系统电源。TP4056 是线性充电芯片充电电流通过外部电阻设定典型配置为 1A 或 500mA为单节 18650 锂电池充电绰绰有余。系统各模块功耗估算模块工作电压典型电流备注STM32F103C8T6 核心板3.3V/5V30~50mA主频 72MHz 全速运行1.44 寸 TFT 彩屏3.3V40~80mA背光全亮时更高ULN2003 28BYJ-48 步进电机5V100~200mA 单轴双轴同时动作时峰值约 400mA光敏采集板3.3V/5V5mA纯电阻分压网络整机峰值电流接近 500mA锂电池容量建议不低于 2000mAh否则阴天续航会紧张。原方案里还加了电源开关和 LED 指示灯方便判断系统上电状态。2.4 光敏采集电路设计与阻抗匹配光敏电阻的阻值随光照变化暗阻可达 MΩ 级亮阻可低至几 kΩ。电路上采用电阻分压结构光敏电阻与固定电阻串联中间节点接入 STM32 的 ADC 引脚。分压点电压随光照线性方向变化光越强光敏电阻阻值越低分压点电压越高。这里有一个经验值固定电阻的选择要与光敏电阻的亮阻在同一数量级。若固定电阻选 10kΩ光敏电阻亮阻 5kΩ则分压比约为 1/3 到 2/3ADC 读数的分辨率较高。若固定电阻选 100kΩ亮阻只有 5kΩ分压比非常接近 VCC四路光照差异几乎无法分辨。原程序里1000 - 1000*My_ADC_GetValue(...)/4096做了取反处理说明电路里是暗光时 ADC 读数大、亮光时读数小的接法即光敏电阻接在 VCC 侧、固定电阻接地。这样换算后 lighVla_xx 数值越大代表光照越强读数和直觉一致。3. 四路 ADC 采集与追日控制算法3.1 ADC 多通道轮询与数据转换STM32F103C8T6 的 ADC1 支持最多 10 个外部通道本系统占用通道 0~3 作为四路光敏采集通道 4 作为锂电池电压检测。初始化时需要配置 ADC 分辨率12 位、采样时间、扫描模式等参数。实际代码中用手动轮询方式逐个读取每次调用My_ADC_GetValue(ADC1, ADC_Channel_x)返回 0~4095 的原始值。光敏读数的转换公式为lighVla_left 1000 - 1000 * My_ADC_GetValue(ADC1, ADC_Channel_0) / 4096; lighVla_up 1000 - 1000 * My_ADC_GetValue(ADC1, ADC_Channel_1) / 4096; lighVla_right 1000 - 1000 * My_ADC_GetValue(ADC1, ADC_Channel_2) / 4096; lighVla_down 1000 - 1000 * My_ADC_GetValue(ADC1, ADC_Channel_3) / 4096;这段代码先把 12 位 ADC 原始值归一化到 0~1000 区间再用 1000 减去完成逻辑反相。背后的电路关系是光敏电阻放在 VCC 和分压节点之间光越强阻值越小分压节点电压越高ADC 读数越大转换后 lighVla_xx 也越大。提示My_ADC_GetValue内部若没有做多次采样取平均单次读取容易受电源噪声和光照波动影响。建议连续读 8 次去掉最大最小值后取平均能明显提高稳定性实测波动范围可从 ±15 降到 ±3。3.2 容差比较与死区控制追日控制核心算法如下#define RONGCHAZHI_UD 500 // 上下容差值ADC 归一化后单位 #define RONGCHAZHI 500 // 左右容差值 if ((lighVla_left - lighVla_right) RONGCHAZHI_UD) { My_StepMotor_RotateAngle(0, ZHUANDONG_ZZ); // 左强向左转 } else if ((lighVla_right - lighVla_left) RONGCHAZHI_UD) { My_StepMotor_RotateAngle(0, ZHUANDONG_FZ); // 右强向右转 } else { My_StepMotor_Stop(10); }容差值 RONGCHAZHI 的含义是左右光照差异大于多少时才需要转动。这个值设得越大系统对光照差异越不敏感电机启动越少、越省电但追踪精度下降设得越小追踪越灵敏但光线稍有变化电机就要频繁动作反而容易因振动导致角度过冲。原设计取 500 是相对保守的值在 0~1000 的光照范围内相当于要求一侧光照高出另一侧 50% 才动作。实际应用中建议根据使用场景调整户外空旷场地光强变化平缓容差取 200~300追踪精度高楼顶或树木遮挡场景光线跳变剧烈容差取 500~700避免电机频繁启停多云天气云层飘过时四路光照会短时间内剧烈变化可以加一个延时滤波状态连续 3 次采样都超过容差才动作My_StepMotor_Stop(10)里的 10 是停止等待时间参数用于让电机轴完全静止后再做判别避免步进电机停止瞬间的反向电动势影响光敏采样。3.3 控制周期与主循环调度主循环采用while(1)轮询调度代码结构分三段按键扫描与模式切换、追日控制逻辑、ADC 采样与屏幕刷新。关键问题在于这三件事的执行频率不同按键需要毫秒级响应追日控制可以 100ms 一次屏幕刷新 200~500ms 一次就够了。原方案的disFlag标志位就是典型的节拍控制手段置 1 时才刷新屏幕避免 LCD 写操作占据太多 CPU 时间。一个值得优化的点是ADC 采样放在控制逻辑之后。这意味着第一次进入循环时用的是上次的采样值进行判断控制滞后一拍。对慢速的追日系统来说没影响但如果后续改成更快的追踪算法建议把采样放在循环开头。4. ULN2003 步进电机驱动与双轴机构设计4.1 ULN2003 的达林顿管阵列驱动原理STM32 的 GPIO 输出能力有限推挽模式下最大输出电流约 25mA而 28BYJ-48 步进电机单相绕组额定电流约 150~250mA。直接用 GPIO 驱动只有两个结果一是电机不转二是芯片过热烧毁。ULN2003 内部集成 7 路达林顿管每路可以承受 500mA 集电极电流总电流最大 1.5A输入兼容 5V TTL 电平正好在 STM32 的 3.3V GPIO 输出范围内——3.3V 高电平可以稳定触发达林顿管导通。ULN2003 每个通道还内置了续流二极管这对于驱动感性负载至关重要。步进电机绕组是电感电流关断瞬间会产生几百伏的反向电动势如果没有续流二极管这个高压会直接打坏 STM32 的 GPIO。ULN2003 内部已经把这个二极管集成好了外部电路只需要连接电机引线不需要额外加保护元件。28BYJ-48 步进电机是 5 线四相电机内部减速比 1:64步距角 5.625°/64 ≈ 0.0879°。控制方式采用四相八拍即半步模式通电顺序为 A-AB-B-BC-C-CD-D-DA每个脉冲使轴转动一个半步。实际使用中常出现的问题是减速比 1:64 是标称值部分厂家实际是 1:63.68395长时间旋转后角度累积误差会逐渐变大需要通过限位开关或编码器校准本项目方案中提到的利用编码器进行数据回读就是这个目的。4.2 双轴电机接线与机械装配双轴结构的关键在于两个电机的分工一个电机控制高度角上下翻转安装在光敏采集板背面另一个控制方位角左右旋转安装在底座上。这样设计的好处是光敏板跟随太阳能板一起转动四路光敏电阻始终感知的是当前板面的光照分布不存在传感器与执行器的坐标变换问题。接线清单如下电机轴控制通道作用初始接线颜色水平轴上端通道 1上下翻转红、橙、黄、粉垂直轴下端通道 0左右旋转红、橙、黄、粉注意两个电机的 A、B、C、D 相序不能接反接反会导致电机振动而不转。调试时用一段测试程序让电机单步旋转若发现电机不转或抖动调整任意一个线圈的两根引线即可。4.3 脉冲控制与手动模式逻辑手动控制的核心逻辑case 1: // 手动模式 if (KeyIsPressed(KEY_1)) { My_StepMotor_RotateAngle(0, ZHUANDONG_ZZ); // 水平轴正转 } else if (KeyIsPressed(KEY_3)) { My_StepMotor_RotateAngle(0, ZHUANDONG_FZ); // 水平轴反转 } else { My_StepMotor_Stop(0); } // KEY_2 / KEY_4 控制垂直轴逻辑同上 break;My_StepMotor_RotateAngle(axis, angle)函数接收两个参数轴编号和目标角度。角度为正则正转为负则反转。ZHUANDONG_ZZ和ZHUANDONG_FZ分别定义为 50 和 -50单位是归一化角度步数。此前见过类似的实现内部是根据目标角度计算需要的拍数然后按 8 拍顺序循环输出脉冲每拍延时约 1.8ms对应电机转速约 15rpm。手动模式与自动模式的切换通过 KEY_5 按键实现。代码里用rememberMode记录上一次的模式只有模式变化时才刷新屏幕上的模式显示减少无意义的 LCD 写入。手动模式下电机持续动作的依据是KeyIsPressed返回持续按下的状态而不是边沿触发这样按住按键时电机会连续转动松开即停。5. 锂电池电量估算与低电量保护策略5.1 电压分段映射与容量换算系统通过 ADC 通道 4 采集锂电池电压采样点经过两个电阻分压后进入 STM32所以实际电压等于 ADC 读数换算值乘以 2batteryVolt My_ADC_GetValue(ADC1, ADC_Channel_4) * 3.3 / 4096 * 2;3.3V 是 STM32 的 ADC 参考电压VREF 接 3.3V4096 是 12 位 ADC 满量程对应的数值乘以 2 恢复分压前的真实电池电压。例如 ADC 读数为 2500则 batteryVolt 2500 × 3.3 / 4096 × 2 ≈ 4.03V。锂电池电压与容量的关系是非线性的但可以用分段近似处理if (batteryVolt 4.15) { BatCap 0.99; } else if (batteryVolt 3.4) { BatCap 0; } else { BatCap (batteryVolt - 3.4) / (4.15 - 3.4); }这段代码用线性插值法把 3.4V~4.15V 的电压区间映射到 0%~99% 的电量百分比。3.4V 作为截止电压下限4.15V 作为满电电压上限。注意这个模型是理想化的锂电池在 3.7V~3.9V 区间电压平台期很长容量变化却很大只用电压估算电量误差可能达到 20% 以上。更准确的方案是引入库仑计芯片或者记录充放电历史来修正曲线。对追日这种间歇性充电设备来说电压分段映射已经足够用于低电量预警。5.2 低电量降级运行策略当前代码在电量低于 45% 时用红色显示提醒但电机仍可继续工作。从系统可用性的角度考虑更好的做法是分级降载电量大于 40%自动模式正常工作响应灵敏度保持默认电量 20%~40%降低追日频率容差值从 500 增大到 700电机动作间隔延长至 500ms电量低于 20%停止自动追日保留手动模式屏幕关闭背光或降低亮度这样改动以后即便连续阴天无法充电系统也能以低功耗模式维持更长的待机时间等天晴后太阳能板恢复充电再自动切回全功能状态。这个策略的收益在实测中很明显——不加降载逻辑时系统在弱光环境下只能撑半天加了以后能撑过整个阴雨天而损失的最大发电量不超过当天理论值的 5%。本文还有配套的精品资源点击获取
返回列表