ASTRO真太陽方位天文解算芯片
0.01 度精度、SPI 接口、高速計算、易用
—概述
ASTRO 系列真太陽方位解算芯片,是具有 SPI接口、0.01 角度精度的天文解算芯片。根據輸入的日期、時間、經度和緯度信息,芯片內建的 IP 核依據 VSOP87天文算法計算出太陽的高度角與方位角。芯片有 3.3V和 5V兩種,內建電源監控電路,當電壓低于 2.2V和3.7V時自動復位。該系列芯片提供商業級與工業級溫度范圍,采用 SOP 20 封裝。 該芯片自動識別閏年閏月,用戶需輸入格林尼治時間與經緯度,即可在全球范圍內應用。如搭配 GPS 模塊實時提供 GPS 標準時間和經緯度信息,即可構成移動的太陽方位計算系統。
—應用
光電式太陽能跟蹤系統的角度參考
時間天文計算式太陽能跟蹤系統的核心計算部件
太陽能路燈用小型跟蹤系統
太陽灶用經濟型跟蹤小系統
航海太陽導航計算
歷史未來世界各地太陽方位推算
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完成以上功能。
單片機源程序如下:
- #include <reg51.h>
- #include<3310LCD_function.c>
- #define uchar unsigned char
- #define uint unsigned int
- //ADC0809
- sbit ST=P1^1;
- sbit EOC=P1^0;
- sbit OE=P1^3;
- sbit CLK=P1^2;
- sbit in0=P2^5;
- sbit in1=P2^6;
- sbit in2=P2^7;
- //_____________________________________________________
- //頂盤電機引腳
- sbit U_ENA=P3^0;
- sbit U_ENB=P3^1;
- sbit U_INPUT1=P1^4;
- sbit U_INPUT2=P1^5;
- sbit U_INPUT3=P1^6;
- sbit U_INPUT4=P1^7;
- //頂盤電機轉動參數
- char code STEP_TABLE3[]={0xcf,0x6f,0x3f,0x9f};//正轉
- char code STEP_TABLE4[]={0xcf,0x9f,0x3f,0x6f};//反轉
- //______________________________________________________
- /*void delay(uchar i);延時函數
- 輸入參數:i
- i 的時間1ms
- ———————————————————————————————————————————————————————*/
- void delay_1ms(void)//1ms延時函數
- {
- unsigned int i;
- for (i=0;i<500;i++) ;
- ;
- }
- void delay(uint ms)//1ms延時函數
- {
- unsigned int i,k;
- for(k=0;k<ms;k++){
- for (i=0;i<121;i++);
- }
- }
- void u_delay()
- {
- uchar i,j;
- for (j=0;j<16;j++)
- for (i=0;i<121;i++);
- }
- void d_delay()
- {
- uchar i;
- for(i=0;i<255;i++);
- for(i=0;i<170;i++);
- }
- /*系統初始化
- ——————————————————————————————————————————————————————*/
- /*********系統初始化***********/
- void sys_init()
- {
- EA = 1; //開總中斷
- TMOD = 0x02; //設定定時器T0工作方式
- TH0=235; //利用T0中斷產生CLK信號
- TL0=235;
- TR0=1; //啟動定時器T0
- ET0=1;
- ST=0;
- OE=0;
- }
- //AD轉化
- //輸入參數 IN ;選擇要轉換的通道
- //——————————————————————————————————————
- uint change_ad(IN)
- {
- uchar AD_DATA;
- switch(IN){
- case 0: in0=in1=in2=0; break;
- case 1: in0=1;in1=in2=0;break;
- case 2: in0=in2=0;in1=1;break;
- case 3: in0=in1=1;in2=0;break;
- case 4: in0=in1=0;in2=1;break;
- case 5: in0=in2=1;in1=0;break;
-
- }
- ST=0;delay(10);
- ST=1;delay(10);
- ST=0;
- // LCD_write_english_string(0,1,"v:");
- while(0==EOC);
- // LCD_write_english_string(0,2,"v:");
- OE=1;
- AD_DATA=P0;
- delay(5);
- OE=0;
- return AD_DATA;
- }
- ///////////////////////////
- void U_turn(long int angle,unsigned char direction) //angle為轉過的角度,direction為轉動方向
- {
- long int i;
- uchar k=0,zi=0;
- U_ENA = 1; //打開輸出使能
- U_ENB = 1;
- switch(direction)
- {
- case 1: //angle = angle*5/9; //每轉一下1.8度
- for(i=0;i<angle;i++){
- for(zi=0;zi<4;zi++){
- P1 = STEP_TABLE3[zi];
- u_delay(); //延時一點時間,讓電機內的磁場能夠建立
- }
- }
- break;
- case 2: //angle = angle*5/9; //每轉一下1.8度
- for(i=0;i<angle;i++){
- for(k=0;k<4;k++){
- P1 = STEP_TABLE4[k];
- u_delay(); //延時一點時間,讓電機內的磁場能夠建立
- }
- }
- break;
- default: break;
- }
- }
- ////////////////////////
- U_stop()
- {
- U_ENA = 0; //打開輸出使能
- U_ENB = 0;
- }
- /*MAIN()主函數
- ______________________________________*/
- main()
- {
- uchar i,k;
- uint a,b,c,ad_data;
- sys_init();
- res=0;
- for(k=0;k<250;k++);
- res=1;
- LCD_init(); //初始化LCD模塊
- LCD_clear(); //清屏幕
- LCD_write_english_string(0,0," v1-5:");
- while(1){
- for(i=0;i<4;i++){
- ad_data=change_ad(i);
- delay(5);
- a=(ad_data*100/255)*5/100;
- b=(ad_data*100/255)*5%100/10;
- c=(ad_data*100/255)*5%10;
- LCD_write_english_string(0,0+i,"v:");
- LCD_set_XY(12,0+i);
- LCD_write_char(a+48);
- LCD_write_english_string(18,0+i,".");
- LCD_write_char(b+48);
- LCD_write_char(c+48);
- delay(5);
- }
- }
- }
- /***********T0中斷服務程序************/
- void t0(void) interrupt 1 using 0
- {
- CLK=~CLK;
- }
復制代碼
Keil代碼下載:
代碼.7z
(401.6 KB, 下載次數: 150)
2021-11-1 21:17 上傳
點擊文件名下載附件
|