一、基本介绍
项目名:
基于单片机的太阳能追光系统设计
项目名:太阳能自动追光
单片机类型:STM32F103C8T6
具体功能:
1、 通过四个光敏电阻检测四个方向的光照强度
2、 利用两个舵机控制太阳能板朝着光照最强的方向转动
3、通过太阳能板给锂电池充电,并通过ADC检测锂电池电压,超过最大电压后不在进行充电
4、 通过四个按键可手动控制太阳能板上下左右旋转,第五个按键控制模式切换
5、当太阳能板跟随阳光到最西边,回到东边
6、通过显示屏显示数据
扩展功能:通过蓝牙模块将测量数据发送到手机端,并可以控制控制太阳能板上下左右旋转、切换模式
二、资 料总览
实物资料
仿真资料
三、51单片机部分资料展示
1、实物图展示
单片机型号:STC89C52
供电接口:TYPE-C
板子类型:PCB集成板,厚度1.2,两层板(上下层覆铜接地)
器件类型:元器件基本上为插针式,个别降压芯片会使用贴片式。
2、仿真图展示
仿真软件版本:proteus8.9
电路连线方式:网络标号连线方式
注意:部分实物元器件仿真中没有,仿真中会用其他工作原理相似的元件代替,这样可能导致实物程序和仿真程序不一样
3、原理图展示
软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构图
4、PCB图展示
由原理图导出,中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。
两层板,上下覆铜接地。
)
四、32单片机部分资料展示
1、实物图展示
单片机型号:STM32F103C8T6
供电接口:TYPE-C
板子类型:PCB集成板,厚度1.2,两层板(上下层覆铜接地)
器件类型:元器件基本上为插针式,个别降压芯片会使用贴片式。
2、原理图展示
软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图
3、PCB图展示
由原理图导出,中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。
两层板,上下覆铜接地。
五、系统框图
绘制软件:VISIO
本设计以单片机为主要控制芯片,以及输入模块和输出模块组成完整的基于单片机的太阳能追光系统设计,主要利用太阳能板四周光照强度存在误差进行偏转,使用太阳能板使得光照强度更好的利用。该设计包括中央控制部分,输入部分和输出部分。中央控制部分使用单片机,其主要功能是获取数据的输入部分,经过内部处理后,控制输出部分。输入由四部分组成,第一部分是光敏电阻,对太阳能光照强度进行检测,通过对比太阳能板上下左右板子的光照强度,当出现光照强度差的时候,控制太阳能板偏转向光照强度较高的地方,另外在手动模式下,通过按键进行上下左右四个方向进行追光。第二部分是电池电压检测模块,通过该模块可以检测当前电池的电压;第三部分是独立按键模块,通过按键可以控制太阳能板旋转。第四部分是充放电一体模块,通过该模块将太阳能板上的电能存储在电池之中给板子进行供电。输出包括三个部分:第一部分是显示模块,可以显示门太阳四周的光照强度值及其当前控制的模式,也可以显示电池的电能。第二部分是舵机,用来转动太阳能板的方向,使得向光照强度较高的地方进行偏转;第三部分是家用电器,将太阳能板检测到的光照强度转换为电能,供电器进行工作;除此之外还有蓝牙和手机连接模块,可以将检测到的数据传输到手机,也可以通过手机发送指令控制太阳能板的工作。
六、部分程序展示
软件版本:keil5
注意:逻辑程序和驱动程序分开,分布于main.c和其他.c文件
*******处理函数
*****/
void Manage_function(void)
{
if(flag_mode == 0) //自动模式下
{
if(light_1 > (light_3+15)) //上的光照强度大于下的光照强度
{
if(motor_duoji_cout_2 < 1950) //控制上下转动的舵机向上转
motor_duoji_cout_2+=10;
TIM_SetCompare4(TIM1,motor_duoji_cout_2);
}
else if(light_3 > (light_1+15)) //下的光照强度大于上的光照强度
{
if(motor_duoji_cout_2 > 1750) //控制上下转动的舵机向下转
motor_duoji_cout_2-=10;
TIM_SetCompare4(TIM1,motor_duoji_cout_2);
}
if(light_2 > (light_4+15)) //左的光照强度大于右的光照强度
{
if(motor_duoji_cout < 1950) //控制左右转动的舵机向左转
motor_duoji_cout+=10;
TIM_SetCompare1(TIM1,motor_duoji_cout);
}
else if(light_4 > (light_2+15)) //右的光照强度大于左的光照强度
{
if(motor_duoji_cout > 1750) //控制左右转动的舵机向右转
motor_duoji_cout-=10;
TIM_SetCompare1(TIM1,motor_duoji_cout);
}
if(motor_duoji_cout >= 1950) //如果转到最左边即西边,回到最右边即东边
{
motor_duoji_cout = 1750;
TIM_SetCompare1(TIM1,motor_duoji_cout);
motor_duoji_cout_2 = 1800;
TIM_SetCompare4(TIM1,motor_duoji_cout_2);
Delay_ms(1000);
Delay_ms(1000);
}
}
if(bat_value > 4.1) //如果电池充满,断开充电
RELAY_B = 1;
else
RELAY_B = 0;
}