1. 项目概述
作为一名电子工程专业的毕业生,我选择了基于单片机的太阳追光系统作为毕业设计课题。这个选题源于我对可再生能源应用的兴趣,特别是在太阳能利用效率提升方面的探索。传统固定式太阳能板存在明显的能量损失问题,根据实测数据,在太阳高度角变化显著的地区,固定安装的太阳能板日均效率损失可达30%以上。
太阳追光系统的核心价值在于通过实时追踪太阳位置,使太阳能板始终保持最佳受光角度。我设计的这套系统采用Arduino Uno作为主控芯片,配合四路光敏电阻传感器和双轴舵机机构,实现了对太阳位置的自动检测与跟踪。相比市面上常见的单轴追踪系统,这套双轴方案在晨昏时段和季节变化时能提供更精确的追踪效果。
2. 系统设计原理
2.1 光线检测原理
系统采用四路光敏电阻构成的空间检测阵列,这是整个设计的核心传感部分。我将四个光敏电阻按照正四面体结构布置,分别对应东、西、南、北四个基本方位。这种布置方式相比常见的平面布置有以下优势:
- 空间检测范围更广,可覆盖180°的立体角
- 各方向检测灵敏度均衡
- 通过差分比较可消除环境光干扰
光敏电阻选用GL5528型号,其特性参数如下:
- 暗电阻:1MΩ(典型值)
- 亮电阻:5-10kΩ(在1000Lux光照下)
- 响应时间:约20ms
在实际电路设计中,采用100kΩ精密电阻作为分压电阻,与光敏电阻串联构成分压电路。通过ADC采集各路的电压值,可以计算出实时的光照强度差异。
2.2 运动控制算法
系统采用改进型PID控制算法驱动双轴舵机。与传统PID相比,我做了以下优化:
- 动态调整比例系数:根据误差大小自动调节P值,在小误差范围内使用较小的P值防止震荡,在大误差时快速响应
- 积分分离:设置误差阈值,超过阈值时暂时关闭积分项,防止积分饱和
- 微分先行:对设定值变化进行滤波处理,避免设定值突变引起的微分冲击
控制算法的具体实现流程:
- 读取四路光敏电阻的ADC值(A0-A3)
- 计算水平和垂直方向的误差量:
- 水平误差 = (A1 - A0)/(A1 + A0)
- 垂直误差 = (A3 - A2)/(A3 + A2)
- 通过PID算法计算出舵机需要转动的角度
- 输出PWM信号驱动舵机
3. 硬件设计详解
3.1 主控电路设计
选用Arduino Uno作为主控制器,主要考虑因素:
- 丰富的IO资源(14个数字IO,6个模拟输入)
- 足够的处理能力(16MHz主频)
- 完善的开发环境和库支持
- 成本优势(相比STM32等方案)
电路连接要点:
- 光敏电阻接口:A0-A3
- 舵机控制:D9(水平)、D10(垂直)
- 电源部分:采用LM7805稳压芯片,输入7-12V,输出稳定的5V电压
3.2 传感器电路设计
光敏电阻检测电路采用经典的分压结构:
code复制Vcc ──┬── 100kΩ ──── ADC输入
│
光敏电阻
│
GND
设计注意事项:
- 使用1%精度的金属膜电阻,确保测量一致性
- 在ADC输入端添加0.1uF滤波电容,抑制高频干扰
- 光敏电阻建议加装遮光罩,减少杂散光影响
3.3 执行机构设计
选用SG90舵机作为执行机构,主要参数:
- 工作电压:4.8-6V
- 扭矩:1.6kg·cm(4.8V时)
- 转动速度:0.12秒/60度
机械结构设计要点:
- 采用十字轴结构实现双轴转动
- 水平轴使用大扭矩舵机(MG996R,10kg·cm)
- 垂直轴使用标准舵机(SG90)
- 所有机械连接件采用3D打印制作,确保精度
4. 软件实现细节
4.1 系统初始化
cpp复制#include <Servo.h>
// 引脚定义
const int ldrPins[] = {A0, A1, A2, A3}; // 光敏电阻引脚
const int servoHPin = 9; // 水平舵机
const int servoVPin = 10; // 垂直舵机
// 全局变量
Servo servoH, servoV; // 舵机对象
int servoHVal = 90; // 水平初始角度
int servoVVal = 45; // 垂直初始角度
void setup() {
// 初始化串口
Serial.begin(9600);
// 舵机初始化
servoH.attach(servoHPin);
servoV.attach(servoVPin);
// 设置初始位置
servoH.write(servoHVal);
servoV.write(servoVVal);
delay(1000); // 等待舵机到位
}
4.2 光强检测与处理
cpp复制// 读取四路光敏电阻值
int readLDRs(int values[]) {
for(int i=0; i<4; i++) {
values[i] = analogRead(ldrPins[i]);
// 软件滤波:连续采样3次取平均
values[i] = (analogRead(ldrPins[i]) + values[i] + analogRead(ldrPins[i]))/3;
}
return 1;
}
// 计算太阳位置偏差
void calculateError(int ldrValues[], float &hError, float &vError) {
// 水平误差(东西方向)
hError = (ldrValues[1] - ldrValues[0]) / (float)(ldrValues[1] + ldrValues[0] + 1);
// 垂直误差(南北方向)
vError = (ldrValues[3] - ldrValues[2]) / (float)(ldrValues[3] + ldrValues[2] + 1);
// 误差限幅
hError = constrain(hError, -1.0, 1.0);
vError = constrain(vError, -1.0, 1.0);
}
4.3 PID控制实现
cpp复制// PID参数
float kp = 2.0, ki = 0.05, kd = 1.0;
float hErrorSum = 0, vErrorSum = 0;
float hLastError = 0, vLastError = 0;
void pidControl(float hError, float vError) {
// 水平方向PID
hErrorSum += hError;
float hDError = hError - hLastError;
float hOutput = kp*hError + ki*hErrorSum + kd*hDError;
hLastError = hError;
// 垂直方向PID
vErrorSum += vError;
float vDError = vError - vLastError;
float vOutput = kp*vError + ki*vErrorSum + kd*vDError;
vLastError = vError;
// 更新舵机位置
servoHVal = constrain(servoHVal + (int)hOutput, 0, 180);
servoVVal = constrain(servoVVal + (int)vOutput, 0, 90);
servoH.write(servoHVal);
servoV.write(servoVVal);
}
5. 系统调试与优化
5.1 光敏电阻校准
在实际调试中发现,即使是同一批次的光敏电阻也存在灵敏度差异。为此开发了校准程序:
- 将系统置于均匀光照环境下
- 运行校准模式,记录各路的基准值
- 计算补偿系数并存储在EEPROM中
- 正常工作时应用补偿系数
校准代码片段:
cpp复制void calibrateLDRs() {
int calValues[4] = {0};
const int samples = 100;
// 采集样本
for(int i=0; i<samples; i++) {
int temp[4];
readLDRs(temp);
for(int j=0; j<4; j++) {
calValues[j] += temp[j];
}
delay(10);
}
// 计算平均值
for(int j=0; j<4; j++) {
calValues[j] /= samples;
}
// 存储校准值
EEPROM.put(0, calValues);
}
5.2 抗干扰措施
在实际测试中遇到的主要问题及解决方案:
-
云层干扰:
- 增加移动平均滤波算法
- 设置变化率阈值,突变时保持原位置
-
机械振动:
- 在舵机输出轴增加橡胶垫片
- 降低PID算法的微分增益
-
电源干扰:
- 在电源输入端增加大容量电解电容
- 为每个舵机单独添加0.1uF去耦电容
5.3 性能测试数据
经过优化后的系统性能指标:
| 测试项目 | 指标值 | 测试条件 |
|---|---|---|
| 追踪精度 | ±2° | 晴天,太阳高度角>30° |
| 响应时间 | <3s | 太阳移动10° |
| 功耗 | 待机:50mA 工作:200mA | 使用2个SG90舵机 |
| 工作温度 | -10℃~60℃ | 持续运行4小时 |
6. 应用扩展与改进方向
6.1 系统扩展方案
当前系统可进一步扩展的功能:
-
能量回收系统:
- 增加太阳能电池板
- 设计MPPT充电电路
- 搭配锂电池储能
-
远程监控:
- 添加ESP8266 WiFi模块
- 开发手机APP实时查看状态
- 实现历史数据记录
-
天气预报集成:
- 通过API获取天气数据
- 阴雨天时进入休眠模式
- 大风天气自动进入保护位置
6.2 硬件改进建议
-
传感器升级:
- 使用数字光照传感器(如BH1750)替代光敏电阻
- 增加红外传感器检测云层状态
-
执行机构改进:
- 采用步进电机+编码器方案提高精度
- 使用谐波减速器增大扭矩
-
主控升级:
- 迁移到STM32平台提高处理能力
- 增加RTOS实现多任务管理
6.3 软件优化空间
-
算法优化:
- 实现自适应PID参数调整
- 加入太阳位置预测算法
-
功能增强:
- 开发自学习功能记忆当地太阳轨迹
- 添加故障自诊断系统
-
节能优化:
- 实现间歇工作模式
- 开发低功耗休眠算法
在实际开发过程中,我发现机械结构的精度对系统性能影响最大。建议使用CNC加工关键部件,或者选择工业级舵机。电源稳定性也是常见问题,特别是在户外应用中,需要特别注意防雷和过压保护设计。