找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

求助,根据ds1302得出的时间进行太阳追踪 单片机程序问题

查看数: 2242 | 评论数: 7 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-4-6 12:33

正文摘要:

我想根据制作一个可以调节的ds1302时钟,再根据时钟计算出太阳高度角和方位角来进行太阳追踪 可是我的程序却不能用按键将改好的时间写入ds1302 有高手能看下哪里不正确需要改吗 单片机源程序如下: #inc ...

回复

ID:671688 发表于 2023-3-9 14:01
求仿真跟程序,学习一下
ID:678200 发表于 2020-4-9 17:57
求仿真跟程序,学习一下
ID:710256 发表于 2020-4-7 12:49
Y_G_G 发表于 2020-4-7 09:36
你这估计是太阳能之类的,那天气不好的话,太阳能还有什么用呢?没有太阳,转哪不都一样的吗?有了太阳,就调整 ...

我主要是实现在白天实现全天候的太阳追踪所以需要两种方式一起用,至于经度的校正没有进行,不需要太精确,能力有限,看了一堆资料被一大堆公式绕了进去
ID:401564 发表于 2020-4-7 09:36
astlaqwq 发表于 2020-4-6 20:37
用采光跟踪只是其中一部分还要与轨迹跟踪相配合,光强不够,天气不好就启用轨迹跟踪

你这估计是太阳能之类的,那天气不好的话,太阳能还有什么用呢?没有太阳,转哪不都一样的吗?有了太阳,就调整一下不就得了
而且,这经度时间什么的,你算过时区没有呀?我们用的是北京时间,你家在北京吗?大年三十的时候,新疆那边可是晚上八九点才天黑的
冬天和夏天的太阳轨迹也是不一样的
采光跟踪已经可以解决很多问题
ID:710256 发表于 2020-4-6 20:37
Y_G_G 发表于 2020-4-6 17:25
用4个光敏电阻通过实时采光跟踪它不好吗?
冬天下午3点和夏天的下午3点,这太阳的方向是不一样的呀

用采光跟踪只是其中一部分还要与轨迹跟踪相配合,光强不够,天气不好就启用轨迹跟踪
ID:710256 发表于 2020-4-6 17:51
这是算太阳角度,和主程序,望大佬指正

  1. /*计算太阳角度*/
  2. void anglecalculate()
  3. {  
  4.    int     leap;
  5.    uint    year,mon,day;
  6.    uint    hour,min,sec;
  7.    uint    DayAdd;
  8.    uchar   DecAngle,HourAngle,DecAngle1;
  9.    uchar   EleAngle,AziAngle,AziAngle1;
  10.    year=(time[6]>>4)*10+(time[6]&0x0f)+2000;
  11.    mon=(time[4]>>4)*10+(time[4]&0x0f);
  12.    day=(time[3]>>4)*10+(time[3]&0x0f);
  13.    hour=(time[2]>>4)*10+(time[2]&0x0f);
  14.    min=(time[1]>>4)*10+(time[1]&0x0f);
  15.    sec=(time[0]>>4)*10+(time[0]&0x0f);
  16.    leap=(year%4==0&&year%100!=0)||(year%400==0);闰年计算
  17.    switch(mon)
  18.           {
  19.             case 1:
  20.                   DayAdd=(day);break;
  21.             case 2:
  22.                   DayAdd=31+day;break;
  23.             case 3:
  24.                           DayAdd=31+28+day;break;
  25.             case 4:
  26.                           DayAdd=31+28+31+day;break;
  27.             case 5:
  28.                           DayAdd=31+28+31+30+day;break;
  29.             case 6:
  30.                           DayAdd=31+28+31+30+31+day;break;
  31.             case 7:
  32.                           DayAdd=31+28+31+30+31+30+day;break;
  33.             case 8:
  34.                       DayAdd=31+28+31+30+31+30+31+day;break;
  35.             case 9:
  36.                           DayAdd=31+28+31+30+31+30+31+31+day;break;
  37.             case 10:
  38.                           DayAdd=31+28+31+30+31+30+31+31+30+day;break;
  39.             case 11:
  40.                           DayAdd=31+28+31+30+31+30+31+31+30+31+day;break;
  41.             case 12:
  42.                           DayAdd=31+28+31+30+31+30+31+31+30+31+30+day;break;
  43.                 default:
  44.                       break;         /*cout<<"月份输入错误!*/
  45.           }
  46.   if(leap&&(mon>=3))
  47.   DayAdd=DayAdd+1; //当前天数  
  48.   DecAngle=(23.45*sin(2*PI*(284+DayAdd)/365))*PI/180;//计算赤纬角
  49.   DecAngle1=(23.45*sin(2*PI*(284+DayAdd+1)/365))*PI/180;//计算第二天赤纬角
  50.   HourAngle=(12-(hour)-(min)/60.0-(sec)/3600.0)*PI/12;//计算时角
  51.   EleAngle=asin(sin(LAT)*sin(DecAngle)+cos(LAT )*cos(DecAngle)*cos(HourAngle));//计算高度角
  52.   AziAngle=acos((sin(EleAngle)*sin(LAT )-sin(DecAngle))/(cos(EleAngle)*cos(LAT )));//计算方位角
  53.   AziAngle1=acos((0-sin(DecAngle1))/cos(LAT ));//计算第二天的方位角
  54.   angle[0]=EleAngle;
  55.   angle[1]=AziAngle;
  56.   angle[2]=AziAngle1;
  57.   
  58.      
  59. }/*视日轨迹追踪*/
  60. void trackgo()
  61. {
  62.     uchar h,f;
  63.     uchar y,z;
  64.     uchar p,q;
  65.     uchar c=0,d=0;

  66.    
  67.     h=angle[0];//得到高度角
  68.     f=angle[1];//得到方位角
  69.     y=(f-c)/5;//计算方位电机需旋转圈数
  70.     z=(h-d)/1;//计算高度电机需旋转圈数
  71.     c=f;
  72.     d=h;
  73.     if(y!=0)
  74.     {              
  75.       for(p=0;p<y;p++)
  76.        {
  77.         GoA1();
  78.        }
  79.      }
  80.     else
  81.      {  
  82.        if(z!=0)
  83.         {            
  84.          for(q=0;q<z;q++)
  85.           {
  86.             GoB1();
  87.            }
  88.          }
  89.       }            
  90.     P2=0x00;
  91. }
  92. //函数:void main()功能:主函数,初始化
  93. void main()
  94. {
  95.     uchar psec=0xaa;
  96.     uchar time_30s=0;
  97.     uint getdata;
  98.     float temp;
  99.    
  100.     P2=0x00;
  101.         time_500ms = 0;
  102.         flag_js = 0;
  103.         count1 = 1;
  104.         count2 = 1;

  105.     InitDS1302();
  106.     timer_init();
  107.     Out_Init();
  108.    LCD_init();
  109.        
  110.     delay_ms(50);

  111.     E_W_ANGLE=read2543(0x00);
  112.     S_N_ANGLE=read2543(0x10);
  113.     LIGHT_DETECTION=read2543(0x20);
  114.    
  115.         while(1)
  116.         {
  117.       
  118.        if(time_500ms == 50)
  119.        {
  120.             time_500ms=0;
  121.             DS1302BurstRead(time);//获得时间
  122.             key();
  123.             anglecalculate();
  124.             if(psec!=time[0])
  125.              {                       
  126.                            disp(flag_js); //用液晶显示时间
  127.                psec=time[0];
  128.               }
  129.             time_30s++;
  130.         
  131.             if(time_30s==6)//3s判定一次方位
  132.              {
  133.                  time_30s=0;
  134.                  getdata=read2543(0x20);
  135.                  getdata=read2543(0x20);
  136.                  getdata=read2543(0x20);
  137.                  temp=(float)getdata/4095*500;
  138.                  LIGHT_DETECTION=temp;//当前光照强度
  139.                  temp=0;

  140.                  if(LIGHT_DETECTION<300&&LIGHT_DETECTION>100)//光强不足启用视日轨迹追踪
  141.                   {
  142.                      trackgo();           
  143.                    }            
  144.             }
  145.       
  146.             startgo();
  147.        }
  148.         }
  149. }
复制代码
ID:401564 发表于 2020-4-6 17:25
用4个光敏电阻通过实时采光跟踪它不好吗?
冬天下午3点和夏天的下午3点,这太阳的方向是不一样的呀

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表