基于单片机的太阳跟踪系统的设计

news2024/11/24 4:42:51

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式

文章目录

    • 概要
  • 一、设计的主要内容
  • 二、硬件电路设计
    • 2.1跟踪控制方案的选择
    • 2.1.1跟踪系统坐标系的选择
    • 2.2系统总体设计及相关硬件介绍
  • 三、软件设计
    • 3.1系统主程序设计
    • 原理图
    • 源程序清单
  • 四、结论
  • 五、 文章目录

概要

  根据太阳与地球的相对运动规律和赤道坐标系和地平坐标系下太阳相对于地球的运动轨道,以应用价值为前提,提出了以步进电机为驱动机构的开环跟踪控制策略,并设计了相应的控制系统。根据控制系统的要求,本文选用了AT89C51RC单片机作为核心部件,完成了单片机的外围硬件电路设计和相应的软件设计。文中详细介绍了系统硬件电路中的重要器件及其实现的功能,设计了相应的硬件接口电路,主要包括复位电路,I2C串行通信电路和步进电机驱动电路,并以软件流程图的形式详细说明了本文的软件设计思想。
关键词: 太阳能热发电;太阳跟踪;单片机;开环跟踪

一、设计的主要内容

由于太阳相对于聚光器的位置时刻都在改变,这就要求聚光器不断改变自身的方位,实时保持太阳处于太阳能聚光器的主光轴上,即始终对准太阳,以有限的接收面积捕获尽可能多的太阳辐射能。要保持太阳始终处于聚光器的主光轴上,就必须采用跟踪系统。本论文将设计和开发一套用于太阳能热发电的跟踪控制系统。
论文设计的主要内容包括硬件设计和软件设计两部分。
硬件部分:
① 复位电路。
② I2C通信电路,包括外围总线、键盘显示芯片和日历时钟芯片的连接。
③ 步进电机模块电路,包括反向驱动器,步进电机驱动器的连接。
④ 绘制系统的总体电路图。
软件系统包括:
① 系统总设计流程图及其程序。
② I2C通信模块软件设计,包括I2C总线连接图,初始化流程图,按键处理流程图和时间调整流程图及程序。
③ 步进电机的软件设计,包括计算模块流程图和步进电机模块流程图。

二、硬件电路设计

2.1跟踪控制方案的选择

2.1.1跟踪系统坐标系的选择

在太阳能热发电系统中,支架不仅要支撑起聚光器,还要支撑起安置在聚光器焦点位置的一台数吨重的发动机。如果采用极轴坐标系统,虽然跟踪的方式简单,但是聚光器的重量并不通过极轴轴线,极轴支撑装置的设计难度大。所以本设计不采用极轴坐标系统。
对于较大的系统,工程上常采用地平坐标系统。采用地平坐标系统的一个特殊优点是重力平面保持在通过收集器的垂直平面内,这样把收集器表面的重力偏差减到最小,就可以使收集器及其支架的工程设计的复杂性简化到最低限度,收集器的轴和轴承所受的力矩也减到最小。故采用地平坐标系统的收集器支撑结构比较简单。
2.1.2跟踪方式及跟踪系统的选择
跟踪控制方式分为闭环跟踪、开环跟踪和混合跟踪控制方式三种。
闭环跟踪和开环跟踪控制方式的主要区别是有无反馈信息。混合跟踪控制方式将闭环跟踪和开环跟踪相结合的跟踪控制方式,混合跟踪控制方式。混合跟踪方式有闭环跟踪方式的优点也同样具备开环方式的优点。如果采用高性能的传感器用于光电跟踪模块,无疑将大大提高跟踪系统的造价,这是在工业生产中所不愿看到的;如果采用普通的传感器,则跟踪系统会存在的缺点为反应慢、精度差、稳定性低,且闭环跟踪无法适用多云天气。根据当地的经度纬度,日期和时间,采用开环控制方式,通过数学上对太阳轨道的计算,得到下一时刻收集器的位置。这样可以通过电动驱动收集器,保持太阳始终处于收集器的主光轴上。按轨道跟踪太阳,不受天气限制。如此一来也存在一个缺点是时间长了,系统的累积误差的影响越来越大,跟踪效果会明显下降。
因为步进电机只有周期性的误差而无累积误差,所以步进电机在非超载的情况下,其转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响。因此,采用步进电机作为跟踪系统的执行机构,可有效控制系统的累积误差。
本论文控制方式采用开环的程序控制,分别对太阳高度角和方位角进行二维跟踪,执行机构采用步进电机。

2.2系统总体设计及相关硬件介绍

系统示意图如图2-l所示,单片机是控制系统的核心,键盘显示芯片作为键盘指令输入和相关数据显示的驱动器管理着键盘和显示器,日历时钟芯片为系统提供了一个准确的时钟作为时间标准;步进电机驱动器间接控制着步进电机。相关硬件接口电路主要包括复位电路,I2C通信电路和步进电机模块电路。本文将对所选用的单片机以及主要硬件电路展开说明。
在这里插入图片描述

图2-1 系统示意图
综合考虑本系统对单片机功能的要求,本文选用美国ATMEL公司的AT89C51RC单片机,该单片机具有以下特性:
AT89C51RC是在AT89C52基础上开发的新型单片机。它的主要特性是:
●片内含有32KB的Flash程序存储器,擦写周期为1000次;
●片内数据存储器内含512字节的RAM;
●具有可编程32线I/O口(P0,P1,P2和P3);
●具有3个可编程定时器TO,T1和T2;
●中断系统是具有8个中断源、6个中断矢量、2级中断优先权的中断结构;
●具有一个全双工UART串行口;
●低功耗工作方式为空闲模式和掉电模式;
●具有双数据指针DPTR0和DPTRl;
●具有3级程序锁定位;
●具有硬件看门狗定时器WDT;
●AT89C5 1 RC工作电源为4.0-5.5V;
●AT89C5lRC最高工作频率为33MHz;
●具有断电标志POF。
AT89C51RC单片机PDIP封装的引脚排列如图2-2所示。
在这里插入图片描述

图2-2 AT89C51RC引脚图

三、软件设计

3.1系统主程序设计

本控制系统软件设计的主程序流程如图3-1所示,主要分为I2C串行通信模块、角度计算模块和步进电机模块。

在这里插入图片描述

图3-1 主程序流程图

原理图

在这里插入图片描述

源程序清单

附录2 源程序清单
主程序:
#include“reg52.h”
#include“VI2C_C5 I.H” / /包含VI2C软件包
#include“zlg7290.h”
#include“fgangel.h”
#include“motorun.h”
#include“manregstep.h”
#include<math.h>
#define PCF8563 0xA2
#define WRADDR 0x00
#define RDADDR 0x02
#define settime l
#define setdata 2
#define setlongitude 3
#define tran 4
#define up 5
#define down 6
#define left 7
#define ok 8
#define uint unsigned int
#define uchar unsigned char
sbit  KEY_ INT=P3^2;
sbit  RST=P1^2;
unsigned char disp_buf[8]={0,0,0,0,0,0,0,0};
unsigned char KEY; 
float *fg;
bit switch date=0;
bit longtpn;
struct longitude
{
uint longtitudehour;,
uchar longtitudemin;
uchar longtitudesec;
};
 struct time
{
uchar hour;
uchar min;
uchar see;
}idata lconvtime;
struct longitude idata Lloc={116,28,0};
unsigned char loncontime(struct longitude idata*Lstal,struct longitude idata*LLloc);
···································
if(KEY==setdata)   //is setdam?
{
IRcvStr(PCF8563,RDADDR,rd,Ox7);//读现在的时、分、秒
display_date(rd+3);
disp butl2]2disp_buf[2]&0x7f;
disp_butf[4]=disp_butl4]&0x7f;
while(1)
{
disp_buf[i]=disp_buf[i]10x40;//E1个位首先闪烁
ZLG7290_SendBuf(&disp_butl0],i+1);
if(KEY_INT-==0)
{
KEY=ZLG7290_GetKey0;
if(KEY==up)//加l
{
disp_buf[i]=disp_butIi]+1;
if((disp_buf[i]&OxOf)= 10)
{
disp_butIi]2disp_butli]&0x40;
}
}
if(KEY==down)
{
disp_buf[i]=disp_buf[i]-l;
if((disp_buf[i]&OxOf)==OxOF)
{
disp_butIi]=0x49;
}
}
If(KEY'==left)
{
disp_buf[i]=disp__buf[i]&0XBF;//stop flash
i=i+l;
if(i>5)
{
ZLG7290_sendBuf(&disp_buf[0],8)i=0}
}
if(KEY==ok)//确认
{
disp_butli]=disp_butf[i]&0XBF;//stop flash
ZLG7290_SendBuf(&disp_buf[i],1);
tdl[0]=disp_buf[1]*1 6+(disp_butl0]&0XOF);
tdl[1]=dispbuf[3]*16+disp_butl2];
tdl[2]=disp_buf[5]*16+disp_buf[4];
ISendStr(PCF8563,WRADDR+5,tdl,0x1);
ISendStr(PCF8563,WRADDR+7,&tdl[1],ox2)i=0:
break;
}
}
}
}
····································
if(KEY=setlongitude)//is longitude?
{
display_longimde(Lloc);
while(1)
{
disp_buf[i]=disp buif[i] 0x40;//秒首先闪烁 
ZLG7290_ SendBuf(&disp_buf[0],i+1);
if(KEY_INT==0)
{
KEY=ZLG7290_ GetKeY0;
if(KEY==up)//加l
{
disp_buf[i]=disp_butli]+l;
if((disp_buf[i]&0x0f)==10)
{
disp bur[i]=disp_buf[i]&0x40;
}
}
if(KEY= down)
{
disp_bul[i]=disp butli]-l;
if((disp_buflil&OxOf)==OxOF)
{
disp_buf[i]=0x49;
}
}
if(KEY=left)
{
disp_but[i]=disp_buf[i]&0XBF;//stop flash
i=i+l;
if(i>6)
{
ZLG7290_SendBuf(&disp_buf[0],8)i=0}
}
if(KEY=ok)//确认
{
Disp_buf[i]=disp_buf[i]&0XBF;//Stop flash
Lloc.Iongtitudesec=disp_butf[l]*10+disp_buf[0];
Lloc.1ongtitudemin=disp_butf[3]*10+disp_buf[2];
Lloc.longtitudehour=disp_buf[6]*100+disp_buf[5]*10+disp_buf[4]i=0:
break;
}
}
}
}
// 设置纬度
····································
if(KEY=etlatitude)//is set latimde?
{
display_latitude(1atitude);
while(1)
{
disp_buf[i]=disp_buf[i] 0x40;//秒首先闪烁
ZLG7290_SendBuf(&disp_butl0],i+1);
If(KEY_INT==0)
{
KEY =ZLG7290_GetKeY0;
if(KEY==up)//加l
{
disp_butf[i]=disp_buf[i]+l;
if((disp_buf[i]&0xof)=l0)
{
disp_buf[i]=disp_buf[i]&0x40;
}
}
if(KEY==down)
{
disp_buf[i]=disp_butf[i]+1;
if((disp_buf[i]&OxOf)=20x0F)
{
disp_buf[i]=0x49;
}
}
If(KEY=left)
{
disp_buf[i]=disp_buf[i]&OXBF;//stop flash
i=i+l;
if(i>5)
{
ZLG7290_SendBuf(&disp_buf[0],8)i=O;
}
} 
If(KEY==6)//确认 
{
disp_buf[i]=disp_butIi]&0XBF;//stop flash
latitude[2]=disp_buf[1]*10+disp_buf[0];
latitude[1]=disp_butl3]*10+disp_but[2];
latitude[0]=disp_buf[5]*10+disp_butl4]i=0;
break;
}
}
}
}
·时间调整子程序
····································
if(KEY= =settime) //is settime?
{
IRcvStr(PCF8563,RDADDR,rd,0x3);//读现在的时、分、秒
display_timeset(rd);
while(1)
{
disp_buf[i]=disp_buf[i]0x40;//秒首先闪烁
ZLG7290_SendBuf(&disp_butl0],i+1);
 if(KEY_INT= =0)
{
KEY=ZLG7290_GetKeY();
If(KEY= =up)//加1
{
disp_buf[i]=disp_butf[i]+1;
if((disp_but[i]&0x0f)= = 10)
{
disp_buf[i]=disp_buf[i]&0x40;
}
}
If(KEY= =down)
{
disp_buf[i]=disp_butIi]-1;
if((disp_buf[i]&0x0f)= =0x0F)
{
disp_bufIi]=0x49;
}
}
If(KEY==left)
{
disp_buf[i]=disp_buf[i]&0XBF;//stop flash
i=i+l:
if(i>7)
{
ZLG7290_SendBuf(&disp_buf[0],8)i=0}
}
if(KEY==ok)//确认
{
disp_buf[i]=disp_buf[i]&0XBF;//stop flash
ZLG7290_SendBuf(&disp_buf[i],1);
 tdl[0]=disp_buf[1]*16+(disp_butl0]&0XOF);
tdl[1]=disp_butf[4]*16+disp_buf[3];
tdl[2]=disp_buf[7]*16+disp_buf[6];
ISendStr(PCF8563,WRADDR+2,td l,0x3)i=0;
break;
}
}
}
}
}


















  

 



四、结论

  本设计开发了以AT89C51RC为核心的硬件控制电路,硬件接口电路主要包括复位电路,I2C串行通信电路和步进电机驱动电路;同时进行了软件部分的设计,由以上软硬件构成的控制系统,实现了在地平坐标系下对太阳的二维跟踪。
本课题研究方向的一些展望:
1.采用步进电机驱动聚光器转动虽可有效控制累积误差,但也存在电能消耗多和负载增大时(如大风天气)容易出现丢步等问题。采用直流电机作为动力机械,通过开环闭环相结合的控制方式消除系统累积误差的跟踪方式更具前景,但’反应速度快,精度高的光电传感器造价高,跟踪系统成本的控制依赖于低成本,高性能的光电传感器的研制和开发。
2.考虑到太阳能跟踪控制系统的实际应用环境(多为沙漠地区)的恶劣,提高控制电路的抗干扰性势在必行。随着电子技术的发展,提高元器件及芯片性能和系统组成的模块化程度,是控制领域发展的大趋势。

五、 文章目录

目 录
摘要 I
Abstract II
1 绪论 1
1.1课题背景及意义 1
1.1.1太阳能热发电技术是最有前途的可再生能源发电方式 1
1.1.2几种主要太阳能热发电方式的前景 2
1.2我国的太阳能资源 3
1.3国内外现状 4
1.4本论文设计的主要内容 5
2 系统硬件的设计 6
2.1跟踪控制方案的选择 6
2.1.1跟踪系统坐标系的选择 6
2.1.2跟踪方式及跟踪系统的选择 6
2.2系统总体设计及相关硬件介绍 7
2.2.1复位电路的硬件设计 9
2.2.2 I2C通信模块 10
2.2.3步进电机模块 14
2.3本章小结 15
3 软件设计 17
3.1 I2C串行通信简介及其软件设计 19
3.1.1 I2C总线设计 19
3.2.2 I2C总线连接器件的设计 21
3.2步进电机模块的软件设计 27
3.3本章小结 27
4 结 论 30
参考文献 31
致谢 32
附录 33
附录1:原理图 33
附录2:程序 34

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1147689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9、电路综合-基于简化实频的任意幅频响应的微带电路设计

9、电路综合-基于简化实频的任意幅频响应的微带电路设计 网络综合和简化实频理论学习概述中的1-8介绍了SRFT的一些基本概念和实验方法&#xff0c;终于走到了SRFT的究极用途&#xff0c;给定任意响应直接综合出微带电路。 1、任意幅频响应的微带电路设计用途 我们演示了采用…

Flask基本教程以及Jinjia2模板引擎简介

flask基本使用 直接看代码吧&#xff0c;非常容易上手&#xff1a; # 创建flask应用 app Flask(__name__)# 路由 app.route("/index", methods[GET]) def index():return "FLASK&#xff1a;欢迎访问主页&#xff01;"if __name__ "__main__"…

【多线程面试题九】、说一说sleep()和wait()的区别

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;说一说sleep()和wait()的…

如何使用 Docker 搭建 Jenkins 环境?从安装到精通

不少兄弟搭 jenkins 环境有问题&#xff0c;有的同学用 window, 有的同学用 mac&#xff0c; 有的同学用 linux。 还有的同学公司用 window, 家里用 mac&#xff0c;搭个环境头发掉了一地。。。 这回我们用 docker 去搭建 jenkins 环境&#xff0c;不管你是用的是什么系统&…

方太描画未来厨房的模样

作者 | 辰纹 来源 | 洞见新研社 不知不觉中&#xff0c;iPhone已经更新到15代了&#xff0c;家里的电视变成了越来越轻薄的液晶屏&#xff0c;过去被称为“老三样”的富康&#xff0c;捷达、桑塔纳&#xff0c;如今也被以特斯拉为代表的新能源智能汽车们所取代…… 类似以上的…

第五章 I/O管理 一、I/O设备的基本概念和分类

目录 一、什么是I/O设备 1、定义&#xff1a; 2、按特性分类&#xff1a; 3、按传输速率分类&#xff1a; 4、按信息交换的方式分类&#xff1a; 二、总结 一、什么是I/O设备 1、定义&#xff1a; I/O设备就是可以将数据输入到计算机&#xff0c;或者可以接收计算机输出…

<C++> vector模拟实现

目录 前言 一、定义命名空间 二、构造函数 三、拷贝构造 四、赋值运算符重载 五、push_back && reserve 六、深拷贝问题 七、iterator 迭代器 1. 可读可写 2. 只读 八、operator[ ] 1. 可读可写 2. 只读 九、insert 问题&#xff1a;内部迭代器失效 十、erase 十一、re…

【网络安全】Seeker内网穿透追踪定位

Seeker追踪定位对方精确位置 前言一、kali安装二、seeker定位1、ngrok平台注册2、获取一次性邮箱地址3、ngrok平台登录4、ngrok下载5、ngrok令牌授权6、seeker下载7、运行seeker定位8、运行隧道开启监听9、伪装链接10、用户点击&#xff08;获取定位成功&#xff09;11、利用经…

(速进)完美解决“用户在命令行上发出了 EULAS_AGREED=1,表示不接受许可协议。”以及“此产品安装程序不支持降级”

安装VMware时候&#xff0c;出现以下两种情况的原因是&#xff1a;未彻底卸载&#xff08;之前安装过VMware&#xff09;&#xff0c;例如&#xff1a;还有相关配置信息、注册表信息等。只要彻底清理就可以解决此问题。 网上很多帖子使用了powershell里的命令 例如&#xff1…

Linux病毒疯狂增长,我们该如何…

导读国家信息中心日前与瑞星联合发布的《2017年上半年中国网络安全报告》&#xff08;以下简称《报告》&#xff09;指出&#xff0c;目前Linux系统病毒已快速增长。《报告》对2017年1至6月的网络安全现状与趋势进行统计、研究和分析后指出&#xff0c;Linux系统的勒索软件数量…

帆软finereport10.0 多个筛选框根据不同条件必须选一个才能查询

效果&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 方法一&#xff1a;在查询里写上一段js&#xff0c;此方法会把端口和IP暴露出来&#xff0c;方法二比较完美。 var diff this.options.form.getWidgetByName("diff").getValue();//正反向 var fllh …

【多线程面试题 八】、说一说Java同步机制中的wait和notify

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;说一说Java同步机制中的…

Day 12 python学习笔记

模块 内置模块 sys模块 概述&#xff1a;Python 的 sys 模块提供访问解释器使用或维护的变量&#xff0c;和与解释器进行交互的函数。通俗来讲&#xff0c;sys 模块为程序与 Python 解释器的交互&#xff0c;提供了一系列的函数和变量&#xff0c;用于操控 Python 运行时的环境…

多输入多输出 | Matlab实现k-means-ELM(k均值聚类结合极限学习机)多输入多输出组合预测

多输入多输出 | Matlab实现k-means-ELM&#xff08;k均值聚类结合极限学习机&#xff09;多输入多输出组合预测 目录 多输入多输出 | Matlab实现k-means-ELM&#xff08;k均值聚类结合极限学习机&#xff09;多输入多输出组合预测预测效果基本描述程序设计参考资料 预测效果 基…

lazarus开发:提升sqlite数据插入速度

目录 1 前言 2 优化数据容器 3 开启事务插入数据 4 其他方面优化 1 前言 近期有一个需求是向数据库中插入excel文件中的10万多条数据&#xff0c;接近70个字段。最初整个插入数据时间是大约40分钟&#xff0c;经过优化调整后&#xff0c;大幅优化为大约5分钟。这里简单介绍…

CV计算机视觉每日开源代码Paper with code速览-2023.10.27

精华置顶 墙裂推荐&#xff01;小白如何1个月系统学习CV核心知识&#xff1a;链接 点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构&#xff1a;Transformer】&#xff08;Ne…

Jetpack:020-Jetpack导航示例:底部导航栏

文章目录 1. 概念介绍2. 使用方法3. 代码与分析3.1 示例代码3.2 代码分析 4. 内容总结 我们在上一章回中介绍了Jetpack中导航相关的内容&#xff0c;本章回中主要介绍 导航的综合示例&#xff1a;底部导航栏。闲话休提&#xff0c;让我们一起Talk Android Jetpack吧&#xff0…

2-多媒体数据压缩国际标准-Part3

文章目录 视频压缩的国际标准MPEG-1&MPEG-2/H.262视频标准MPEG-4 AVC/H.264视频标准H.264编码框架概述H.264视频编码的技术创新点 H.265/HEVC视频标准HEVC性能与编解码框架概述Quadtree-based coding structureDeblocking & SAO FilterHEVC各模块运算量 视频压缩的国际…

leetcode-哈希表

1. 理论 从哈希表的概念、哈希碰撞、哈希表的三种实现方式进行学习 哈希表&#xff1a;用来快速判断一个元素是否出现集合里。也就是查值就能快速判断&#xff0c;O&#xff08;1&#xff09;复杂度&#xff1b; 哈希碰撞&#xff1a;拉链法&#xff0c;线性探测法等。只是一种…

leetcode 1353. 最多可以参加的会议数目

给你一个数组 events&#xff0c;其中 events[i] [startDayi, endDayi] &#xff0c;表示会议 i 开始于 startDayi &#xff0c;结束于 endDayi 。 你可以在满足 startDayi < d < endDayi 中的任意一天 d 参加会议 i 。注意&#xff0c;一天只能参加一个会议。 请你返回…