找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4511|回复: 3
收起左侧

基于51单片机的ASTRO真太阳方位天文解算芯片资料( 自动太阳能跟踪系统) 包含源码

  [复制链接]
ID:328187 发表于 2018-5-22 17:32 | 显示全部楼层 |阅读模式
ASTRO真太阳方位天文解算芯片
0.01 度精度、SPI 接口、高速计算、易用
—概述
ASTRO 系列真太阳方位解算芯片,是具有 SPI接口、0.01 角度精度的天文解算芯片。根据输入的日期、时间、经度和纬度信息,芯片内建的 IP 核依据 VSOP87天文算法计算出太阳的高度角与方位角。芯片有 3.3V和 5V两种,内建电源监控电路,当电压低于 2.2V和3.7V时自动复位。该系列芯片提供商业级与工业级温度范围,采用 SOP 20 封装。 该芯片自动识别闰年闰月,用户需输入格林尼治时间与经纬度,即可在全球范围内应用。如搭配 GPS 模块实时提供 GPS 标准时间和经纬度信息,即可构成移动的太阳方位计算系统。
—应用
  光电式太阳能跟踪系统的角度参考
  时间天文计算式太阳能跟踪系统的核心计算部件
  太阳能路灯用小型跟踪系统
  太阳灶用经济型跟踪小系统
  航海太阳导航计算
  历史未来世界各地太阳方位推算
0.png 0.png 0.png 0.png

ASTRO 芯片一共有 20 个引脚 采用 SOP20封装,表面无芯片型号 标识。芯片左上角有圆点标识出 1 号引脚。
ASTRO 有 4个引脚用于 SPI 通 讯,3 个引脚用于检测芯片的工作状 态,2 个引脚用于芯片复位与芯片的 休眠唤醒。2 个引脚是芯片核心的辅 助供电。

上图为 ASTRO 芯片的典型电路图。图中的虚线线路为用户选用的线路,用户可以根据需要选用。最简化的电路仅需一个外围元件 0.01uF 电容。
ASTRO 的 SPI_CLK、SPI_MISO、SPI_MOSI 和 SPI_SS 与 MCU的 IO 口相连。 用户可选用 MCU 的外部中断连接 END_CALCU 引脚来检测 ASTRO 是否完成解算,从而读取解算结果,该引脚在解算过程中为高电平,解算完成之后为低电平,连续解算时通过检测该引脚高电平的时间,可以得出用户自选晶体频率下 ASTRO 芯片一次解算所需的时间。ASTRO 的固定时钟频率下有固定的解算时间,用户可以让 MCU在解算完成后直接读取解算结果,从忽略此引脚的功能。
BEGIN_CALCU用于用户调试时测试芯片是否收到解算命令, 从而判断ASTRO的SPI接口通讯是否正常。
RST 的引脚可以使用图示的复位电路。在时钟频率小于 24MHZ 的情况下,该复位电路可以省略,该引脚直接接地即可。也可以连接到 MCU的 IO 引脚,受控复位。 当用户预省略 11.0592MHZ 的晶体时,可以使用外部的时钟信号输入,时钟信号从XTALIN 输入,XATLOUT 引脚悬空。
WAKE 引脚可以直接连接 MCU 的 IO 引脚用于 ATSTRO 芯片的休眠唤醒,唤醒方式为下降沿唤醒。当芯片运行时 PD_RUN 为高电平,休眠时为低电平,可以外接 LED用于调试观察芯片的工作状态,也可用或门同 ASTRO 的 SPI_SS引脚做或逻辑运算,或门输出信号输入到 WAKE 引脚,当芯片被 SPI_SS 片选信号选中的时候,将自动唤醒。或门选用74HCT32 四输入或门,或 74LS50~55 或非门等等。如用户 IO 资源丰富,则可直接用 IO完成以上功能。

单片机源程序如下:
  1. #include <reg51.h>
  2. #include<3310LCD_function.c>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. //ADC0809
  6. sbit ST=P1^1;
  7. sbit EOC=P1^0;
  8. sbit OE=P1^3;
  9. sbit CLK=P1^2;
  10. sbit in0=P2^5;
  11. sbit in1=P2^6;
  12. sbit in2=P2^7;
  13. //_____________________________________________________
  14. //顶盘电机引脚
  15. sbit U_ENA=P3^0;
  16. sbit U_ENB=P3^1;
  17. sbit U_INPUT1=P1^4;
  18. sbit U_INPUT2=P1^5;
  19. sbit U_INPUT3=P1^6;
  20. sbit U_INPUT4=P1^7;
  21. //顶盘电机转动参数
  22. char code STEP_TABLE3[]={0xcf,0x6f,0x3f,0x9f};//正转
  23. char code STEP_TABLE4[]={0xcf,0x9f,0x3f,0x6f};//反转
  24. //______________________________________________________
  25. /*void delay(uchar i);延时函数
  26. 输入参数:i      
  27.           i 的时间1ms
  28. ———————————————————————————————————————————————————————*/
  29. void delay_1ms(void)//1ms延时函数
  30. {
  31.         unsigned int i;
  32.         for (i=0;i<500;i++)          ;
  33. ;
  34. }
  35. void delay(uint ms)//1ms延时函数
  36. {
  37.         unsigned int i,k;
  38.         for(k=0;k<ms;k++){
  39.         for (i=0;i<121;i++);
  40.         }

  41. }
  42. void u_delay()
  43. {
  44.         uchar i,j;
  45.         for (j=0;j<16;j++)
  46.                 for (i=0;i<121;i++);
  47. }
  48. void d_delay()
  49. {
  50. uchar i;
  51. for(i=0;i<255;i++);
  52. for(i=0;i<170;i++);
  53. }
  54. /*系统初始化
  55. ——————————————————————————————————————————————————————*/
  56. /*********系统初始化***********/

  57. void sys_init()
  58. {
  59. EA = 1;                     //开总中断
  60. TMOD = 0x02;                //设定定时器T0工作方式  
  61. TH0=235;                    //利用T0中断产生CLK信号
  62. TL0=235;
  63. TR0=1;                      //启动定时器T0
  64. ET0=1;
  65. ST=0;
  66. OE=0;  
  67. }
  68. //AD转化
  69. //输入参数 IN           ;选择要转换的通道
  70. //——————————————————————————————————————
  71. uint  change_ad(IN)
  72. {        
  73. uchar AD_DATA;
  74.         switch(IN){
  75.           case 0: in0=in1=in2=0;  break;
  76.           case 1: in0=1;in1=in2=0;break;
  77.           case 2: in0=in2=0;in1=1;break;
  78.           case 3: in0=in1=1;in2=0;break;
  79.           case 4: in0=in1=0;in2=1;break;
  80.           case 5: in0=in2=1;in1=0;break;
  81.               
  82.         }
  83.         ST=0;delay(10);
  84.         ST=1;delay(10);        
  85.         ST=0;
  86. //        LCD_write_english_string(0,1,"v:");
  87.         while(0==EOC);
  88. //        LCD_write_english_string(0,2,"v:");
  89.          OE=1;
  90.          AD_DATA=P0;
  91.     delay(5);
  92.     OE=0;
  93. return AD_DATA;
  94. }
  95. ///////////////////////////
  96. void U_turn(long int angle,unsigned char direction) //angle为转过的角度,direction为转动方向
  97. {
  98.         long int i;
  99.         uchar k=0,zi=0;
  100.         U_ENA = 1; //打开输出使能
  101.         U_ENB = 1;
  102.         switch(direction)
  103.         {
  104.                 case 1:                //angle = angle*5/9;          //每转一下1.8度
  105.                                         for(i=0;i<angle;i++){
  106.                                             for(zi=0;zi<4;zi++){
  107.                                                 P1 = STEP_TABLE3[zi];
  108.                                                 u_delay();        //延时一点时间,让电机内的磁场能够建立
  109.                                             }
  110.                                         }                                       
  111.                                         break;
  112.                 case 2:                //angle = angle*5/9;          //每转一下1.8度
  113.                                         for(i=0;i<angle;i++){
  114.                                             for(k=0;k<4;k++){
  115.                                                 P1 = STEP_TABLE4[k];
  116.                                                 u_delay();        //延时一点时间,让电机内的磁场能够建立
  117.                                             }
  118.                                         }               
  119.                                         break;
  120.                 default:   break;
  121.         }        
  122. }  
  123. ////////////////////////

  124. U_stop()
  125. {
  126.         U_ENA = 0; //打开输出使能
  127.         U_ENB = 0;
  128. }
  129. /*MAIN()主函数
  130. ______________________________________*/
  131. main()
  132. {        
  133.     uchar i,k;
  134.          uint  a,b,c,ad_data;
  135.         sys_init();
  136.         res=0;
  137.         for(k=0;k<250;k++);
  138.         res=1;                  
  139.           LCD_init();  //初始化LCD模块
  140.         LCD_clear(); //清屏幕        
  141.           LCD_write_english_string(0,0,"    v1-5:");
  142. while(1){
  143. for(i=0;i<4;i++){
  144.          ad_data=change_ad(i);
  145.         delay(5);        
  146.         a=(ad_data*100/255)*5/100;
  147.         b=(ad_data*100/255)*5%100/10;        
  148.         c=(ad_data*100/255)*5%10;        
  149.         LCD_write_english_string(0,0+i,"v:");
  150.         LCD_set_XY(12,0+i);
  151.         LCD_write_char(a+48);        
  152.         LCD_write_english_string(18,0+i,".");        
  153.         LCD_write_char(b+48);
  154.         LCD_write_char(c+48);
  155.         delay(5);
  156.         }                        
  157.           }
  158. }
  159. /***********T0中断服务程序************/

  160. void t0(void) interrupt 1 using 0
  161. {
  162. CLK=~CLK;
  163. }  

复制代码

Keil代码下载:
代码.7z (401.6 KB, 下载次数: 149)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:276694 发表于 2018-8-6 22:00 | 显示全部楼层
好资料,51黑有你更精彩!!!
回复

使用道具 举报

ID:475425 发表于 2019-2-9 17:15 | 显示全部楼层
楼主我需要芯片
回复

使用道具 举报

ID:105944 发表于 2021-11-1 10:21 | 显示全部楼层
能分享一下原理图吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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