额外定制服务:
- 通用服务:实物制作、包邮、资料齐全(原理图、源码、仿真、使用模块资料)、问题解答(包含答辩时老师提问的问题解答+平时问题解答)
- 可选服务:万用板(洞洞板) 或者 PCB板(包含原理图及PCB图设计)
视频教程链接:
- B站主页链接:易佳电子设计主页(点击跳转)
- 软件安装:合集·软件安装(点击跳转)
- 各个模块功能讲解:合集·电子毕设专用-【51传感器模块库】(点击跳转)
- 毕业设计案例讲解:合集·电子专业毕业设计专用-案例讲解(点击跳转)
该工程实现了一个基于STM32F103C8T6单片机的太阳能追光系统,通过双轴舵机控制太阳能板朝向,实现自动追踪太阳光线的最强方向,以提高太阳能板的发电效率。
一、设计介绍
核心功能
- 自动追光:通过四个光敏传感器检测光照强度差异,自动调整舵机角度
- 手动控制:支持通过按键手动调整舵机角度
- 环境监测:实时监测电池电压和环境温度
- 参数设置:可调整追光灵敏度,并将设置保存到Flash
- 状态显示:通过OLED显示系统工作状态和传感器数据
模块说明:
光敏传感器模块
- 数量:4个(上、下、左、右)
- 接口:连接到ADC通道(PA4-PA7)
- 功能:检测不同方向的光照强度,为追光算法提供输入
- 采集方式:通过ADC+DMA连续采集,采样周期为55.5个时钟周期
舵机控制模块
- 数量:2个(水平和垂直方向)
- 接口:通过PWM控制(TIM2和TIM3)
- 控制范围:
- 垂直舵机:40°-130°(
SERVOUP_LIMIT2
到SERVOUP_LIMIT1
) - 水平舵机:10°-190°(
SERVODOWN_LIMIT2
到SERVODOWN_LIMIT1
) - 中心位置:88°(
SERVO_CENTER
) - PWM参数:周期20ms(50Hz),通过调整占空比控制角度
温度传感器
- 型号:DS18B20
- 接口:单总线接口
- 功能:监测环境温度
- 精度:0.1℃
显示模块
- 型号:OLED显示屏
- 接口:I2C
- 功能:显示系统状态、传感器数据和设置参数
- 初始化:通过
OLED_Init()
配置显示参数
按键模块
- 类型:五向按键(上、下、左、右、中)
- 功能:
- 模式切换(自动/手动)
- 手动控制舵机
- 参数设置
- 菜单导航
电源监测
- 功能:监测电池电压
- 接口:ADC通道(PA3)
- 计算方式:
Volat = ((3.3 * ADC_DMA_IN[0]) / 4096) * 2
继电器控制
- 功能:控制外部设备开关
- 控制方式:通过
Relay
变量控制
工程架构
该工程采用分层架构设计,清晰地划分了硬件核心层、系统层、设备驱动层和应用层:
核心层 (CORE)
- CORE:包含Cortex-M3核心文件
- STM32F10x_FWLib:STM32标准外设库,提供底层硬件访问接口
系统层 (SYSTEM)
- adc.c/h:ADC配置和采集,用于光敏传感器和电压检测
- delay.c/h:延时函数实现
- flash.c/h:Flash存储操作,用于保存系统参数
- sys.c/h:系统基础配置
- tim.c/h:定时器配置,提供系统时基
设备驱动层 (HARDWARE)
- device.c/h:外设IO初始化
- ds18b20.c/h:温度传感器驱动
- key.c/h:按键驱动和扫描
- OLED_I2C.c/h:OLED显示驱动
- pwm.c/h:PWM信号生成
- serve.c/h:舵机控制
应用层 (USER)
- main.c:主程序,实现系统初始化和主循环逻辑
功能模块分析
追光算法
- 追光算法是系统核心,实现在
Proc_Servo()
函数中: - 计算上下、左右光敏传感器的差值(
diffUD
和diffLR
) - 当差值超过灵敏度阈值时,调整对应舵机角度
- 光照不足时(所有传感器值<
WORK_SERVO_LIGHT
),舵机回到中心位置 - 光照充足时(四个传感器值总和>4.5*
WORK_SERVO_LIGHT
),执行追光逻辑 - 考虑舵机角度限位,防止机械损坏
参数存储
- 系统使用Flash存储关键参数:
- 通过
Write_Flash_Data()
将参数写入Flash - 通过
Read_Flash_Data()
在系统启动时读取参数 - 存储的参数包括灵敏度(
Sensitivity
)
用户界面
- 系统提供多级菜单界面:
- 主界面:显示电池电压、温度、光照强度和工作模式
- 设置界面:调整追光灵敏度
按键处理
- 按键处理逻辑在
Key_Proc()
函数中: - 中键:切换自动/手动模式
- 上下键:在手动模式下控制垂直舵机,在设置界面调整参数
- 左右键:在手动模式下控制水平舵机,在主界面切换到设置界面
数据采集
- 数据采集在
Get_Dat()
函数中: - 每100ms触发一次(由定时器中断控制)
- 读取四个光敏传感器值、电池电压和温度
- 根据工作模式决定后续处理(自动追光或手动控制)
系统工作流程
- 系统初始化:
- 配置时钟和中断优先级
- 初始化各外设(按键、OLED、舵机、温度传感器、ADC等)
- 从Flash读取保存的参数
- 舵机回到中心位置
- 主循环:
- 按键处理(
Key_Proc()
) - 数据获取和处理(
Get_Dat()
) - 定时中断:
- 每100ms触发一次数据采集和显示更新
- 设置
Flag_Get
标志位 - 自动追光模式:
- 计算光敏传感器差值
- 根据差值和灵敏度调整舵机角度
- 光照不足时回到中心位置
- 手动控制模式:
- 通过按键直接调整舵机角度
- 实时显示传感器数据
- 参数设置:
- 调整灵敏度参数
- 保存参数到Flash
该系统通过精确的光照差异检测和舵机控制,实现了太阳能板的高效追光功能,同时提供了友好的用户界面和灵活的控制方式。
二、资料展示
原理图
使用立创EDA格式打开,打开方式为将文件夹内 .json 后缀文件拖入嘉立创EDA(标准版) - 免费、易用、强大的在线电路设计软件 立创EDA编辑网站中即可
本次原理图使用立创EDA画出的,对于新手较为方便,全中文易上手,不需要安装任何软件。另,Altium Designer 格式打开后标注会有所丢失,建议使用立创EDA
PCB
实物图
材料清单
如果您不能独自完成焊接,我这边也提供付费焊接服务以及调试,完成后第一时间通过快递寄给您。
主要代码展示:
/********************函数声明****************************/
// 按键处理函数
void Key_Proc(void);
// 显示动态数据
void Dis_Dat(void);
// 获取数据
void Get_Dat(void);
// 显示菜单静态页面
void Dis_Menu(void);
// 舵机处理函数
void Proc_Servo(void);
// 读取flash保存数据
void Read_Flash_Data(void);
// 写入数据到flash
void Write_Flash_Data(void);
/*
* 函数名: main
* 描述: 主函数,初始化硬件并进入主循环
* 参数: 无
* 返回值: int (程序执行状态)
*/
int main(void)
{
// 设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
// 使能GPIOA、GPIOB、GPIOC和AFIO的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);
// 禁用JTAG,只保留SWD调试功能,释放部分IO口
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
delay_init(); // 延时函数初始化
KEY_Init(); // 按键初始化
I2C_Configuration(); // I2C配置,用于OLED显示
Servo_Init(); // 舵机初始化
Device_Init(); // 外部设备IO口初始化
Relay = 0; // 继电器初始状态为关闭
DS18B20_Init(); // DS18B20温度模块初始化
ADC_Configuration(); // ADC初始化,用于读取光敏电阻和电池电压
TIM4_Init(TIM4_PERIOD, TIM4_PRESCALE); // 初始化定时器4,用于定时任务
Read_Flash_Data(); // 读取掉电保存的数据(灵敏度设置)
Dis_Dat(); // 初始化显示界面
// 将两个舵机设置到中心位置
Servo1_SetAngle(SERVO_CENTER); // 设置水平舵机角度
Servo2_SetAngle(SERVO_CENTER); // 设置垂直舵机角度
// 主循环
while (1)
{
Key_Proc(); // 处理按键输入
Get_Dat(); // 获取传感器数据并处理
}
}
下载内容展示:
三、 视频链接地址:
更多详细功能与代码视频讲解请B站搜索:易佳电子设计 主页搜索该设计编号或名称
视频链接: