【32毕业设计案例】【S002】舵机云台太阳能追光系统

作品简介

额外定制服务:

  1. 通用服务实物制作、包邮、资料齐全(原理图、源码、仿真、使用模块资料)、问题解答(包含答辩时老师提问的问题解答+平时问题解答)
  2. 可选服务:万用板(洞洞板) 或者 PCB板(包含原理图及PCB图设计)

视频教程链接

  1. B站主页链接:易佳电子设计主页(点击跳转)
  2. 软件安装:合集·软件安装(点击跳转)
  3. 各个模块功能讲解:合集·电子毕设专用-【51传感器模块库】(点击跳转)
  4. 毕业设计案例讲解:合集·电子专业毕业设计专用-案例讲解(点击跳转)


该工程实现了一个基于STM32F103C8T6单片机的太阳能追光系统,通过双轴舵机控制太阳能板朝向,实现自动追踪太阳光线的最强方向,以提高太阳能板的发电效率。

一、设计介绍

核心功能

  • 自动追光:通过四个光敏传感器检测光照强度差异,自动调整舵机角度
  • 手动控制:支持通过按键手动调整舵机角度
  • 环境监测:实时监测电池电压和环境温度
  • 参数设置:可调整追光灵敏度,并将设置保存到Flash
  • 状态显示:通过OLED显示系统工作状态和传感器数据

模块说明:

光敏传感器模块

  • 数量:4个(上、下、左、右)
  • 接口:连接到ADC通道(PA4-PA7)
  • 功能:检测不同方向的光照强度,为追光算法提供输入
  • 采集方式:通过ADC+DMA连续采集,采样周期为55.5个时钟周期

舵机控制模块

  • 数量:2个(水平和垂直方向)
  • 接口:通过PWM控制(TIM2和TIM3)
  • 控制范围
  • 垂直舵机:40°-130°(SERVOUP_LIMIT2SERVOUP_LIMIT1
  • 水平舵机:10°-190°(SERVODOWN_LIMIT2SERVODOWN_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:主程序,实现系统初始化和主循环逻辑

功能模块分析

追光算法

  1.   追光算法是系统核心,实现在Proc_Servo()函数中:
  2. 计算上下、左右光敏传感器的差值(diffUDdiffLR
  3. 当差值超过灵敏度阈值时,调整对应舵机角度
  4. 光照不足时(所有传感器值<WORK_SERVO_LIGHT),舵机回到中心位置
  5. 光照充足时(四个传感器值总和>4.5*WORK_SERVO_LIGHT),执行追光逻辑
  6. 考虑舵机角度限位,防止机械损坏

参数存储

  1.   系统使用Flash存储关键参数:
  2. 通过Write_Flash_Data()将参数写入Flash
  3. 通过Read_Flash_Data()在系统启动时读取参数
  4. 存储的参数包括灵敏度(Sensitivity

用户界面

  1.   系统提供多级菜单界面:
  2. 主界面:显示电池电压、温度、光照强度和工作模式
  3. 设置界面:调整追光灵敏度

按键处理

  1.   按键处理逻辑在Key_Proc()函数中:
  2. 中键:切换自动/手动模式
  3. 上下键:在手动模式下控制垂直舵机,在设置界面调整参数
  4. 左右键:在手动模式下控制水平舵机,在主界面切换到设置界面

数据采集

  1.   数据采集在Get_Dat()函数中:
  2. 每100ms触发一次(由定时器中断控制)
  3. 读取四个光敏传感器值、电池电压和温度
  4. 根据工作模式决定后续处理(自动追光或手动控制)

系统工作流程

  1. 系统初始化
  2. 配置时钟和中断优先级
  3. 初始化各外设(按键、OLED、舵机、温度传感器、ADC等)
  4. 从Flash读取保存的参数
  5. 舵机回到中心位置
  6. 主循环
  7. 按键处理(Key_Proc()
  8. 数据获取和处理(Get_Dat()
  9. 定时中断
  10. 每100ms触发一次数据采集和显示更新
  11. 设置Flag_Get标志位
  12. 自动追光模式
  13. 计算光敏传感器差值
  14. 根据差值和灵敏度调整舵机角度
  15. 光照不足时回到中心位置
  16. 手动控制模式
  17. 通过按键直接调整舵机角度
  18. 实时显示传感器数据
  19. 参数设置
  20. 调整灵敏度参数
  21. 保存参数到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站搜索:易佳电子设计 主页搜索该设计编号或名称

视频链接:

创作时间: