Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FreescaleIAP mbed-rtos mbed
Fork of workinQM_10thDec by
Diff: ACS.cpp
- Revision:
- 49:61c9f28332ba
- Parent:
- 39:670133e7ffd8
- Child:
- 52:daa685b0e390
diff -r 9fd15e3e0b53 -r 61c9f28332ba ACS.cpp
--- a/ACS.cpp Fri Jul 08 08:25:39 2016 +0000
+++ b/ACS.cpp Thu Jul 14 23:04:26 2016 +0000
@@ -2,6 +2,12 @@
-------------------------------------------CONTROL ALGORITHM------------------------------------------------------------------------------------------*/
#include <mbed.h>
#include <math.h>
+Timer timer_SENSOR_DATA_ACQ;
+Timer timer_controlmodes;
+Timer timer_SENSOR_INIT;
+Timer timer_CONFIG_UPLOAD;
+
+Serial acs_pc(USBTX,USBRX);
#include "pni.h" //pni header file
#include "pin_config.h"
@@ -21,16 +27,16 @@
extern uint8_t ACS_STATUS;
extern uint8_t ACS_DETUMBLING_ALGO_TYPE;//////
-extern DigitalInOut ATS1_SW_ENABLE; // enable of att sens2 switch
-extern DigitalInOut ATS2_SW_ENABLE; // enable of att sens switch
+extern DigitalOut ATS1_SW_ENABLE; // enable of att sens2 switch
+extern DigitalOut ATS2_SW_ENABLE; // enable of att sens switch
extern uint8_t ACS_ATS_ENABLE;
extern uint8_t ACS_DATA_ACQ_ENABLE;
extern uint8_t ACS_STATE;
-DigitalInOut phase_TR_x(PIN27); // PHASE pin for x-torquerod
-DigitalInOut phase_TR_y(PIN28); // PHASE pin for y-torquerod
-DigitalInOut phase_TR_z(PIN86); // PHASE pin for z-torquerod
+DigitalOut phase_TR_x(PIN27); // PHASE pin for x-torquerod
+DigitalOut phase_TR_y(PIN28); // PHASE pin for y-torquerod
+DigitalOut phase_TR_z(PIN86); // PHASE pin for z-torquerod
extern PwmOut PWM1; //x //Functions used to generate PWM signal
extern PwmOut PWM2; //y
@@ -68,9 +74,8 @@
uint8_t invjm_mms[9];
uint8_t jm_mms[9];
uint8_t bb_mms[3];
-uint8_t singularity_flag=0;
+uint8_t singularity_flag_mms=0;
uint8_t B_SCZ_ANGLE = 0x00;
-
uint8_t ACS_MAG_TIME_DELAY;// = 65;
uint8_t ACS_DEMAG_TIME_DELAY;// = 65;
uint16_t ACS_Z_FIXED_MOMENT;// = 1.3;
@@ -81,12 +86,12 @@
uint8_t ACS_TR_Y_PWM; //*
uint8_t ACS_TR_Z_PWM; //*
//change
-uint16_t ACS_MM_X_COMSN = 1;
-uint16_t ACS_MM_Y_COMSN = 1;
-uint16_t ACS_MG_X_COMSN = 1;
-uint16_t ACS_MG_Y_COMSN = 1;
-uint16_t ACS_MM_Z_COMSN = 1;
-uint16_t ACS_MG_Z_COMSN = 1;
+uint16_t ACS_MM_X_COMSN = 0;
+uint16_t ACS_MM_Y_COMSN = 0;
+uint16_t ACS_MG_X_COMSN = 0;
+uint16_t ACS_MG_Y_COMSN = 0;
+uint16_t ACS_MM_Z_COMSN = 0;
+uint16_t ACS_MG_Z_COMSN = 0;
uint8_t float_to_uint8(float min,float max,float val)
{
@@ -106,186 +111,145 @@
for(int i=0;i<d1;i++)
for(int j=0;j<d2;j++)
{
- printf("\n\r%f",*((arr+(i*d1))+j));
+ acs_pc.printf("\n\r%f",*((arr+(i*d1))+j));
valarr[i*d1+j] = (uint8_t)float_to_uint8(min[i*d1+j],max[i*d1+j],*((arr+(i*d1))+j));
- printf("\n\r%d",valarr[i*d1+j]);
+ acs_pc.printf("\n\r%d",valarr[i*d1+j]);
}
}
-Serial pc_acs(USBTX,USBRX); //for usb communication
+//Serial pc(USBTX,USBRX); //for usb communication
//CONTROL_ALGO
float moment[3]; // Unit: Ampere*Meter^2//*
float b_old[3]={1.15e-5,-0.245e-5,1.98e-5}; // Unit: Tesla
-float db[3];//*
+//float db[3];//*
uint8_t flag_firsttime=1, alarmmode=0;
-
-void controlmodes(float b[3], float db[3], float omega[3], uint8_t controlmode1); //*
-float max_array(float arr[3]);
-void inverse(float mat[3][3],float inv[3][3]);
+//void controllermodes(float moment[3],float b[3], float db[3], float omega[3], uint8_t controlmode1,uint8_t detumblingalgo);
+void inversec(float mat[3][3],float inv[3][3],int *singularity_flag);
+float max_array(float arr[3]);
-//CONTROLALGO PARAMETERS
-void FCTN_ACS_CNTRLALGO (float moment[3],float b[3] ,float omega[3],uint8_t nominal,uint8_t detumbling,uint8_t ACS_DETUMBLING_ALGO_TYPE)
+void FCTN_ACS_CNTRLALGO (float moment[3], float b1[3], float omega1[3], uint8_t nominal , uint8_t detumbling , uint8_t ACS_DETUMBLING_ALGO_TYPE )
{
-
+ float db1[3]; // Unit: Tesla/Second
float normalising_fact;
- float b_copy[3], omega_copy[3], db_copy[3];
- int i;
+ float b1_copy[3], omega1_copy[3], db1_copy[3];
+ int i, j;
if(flag_firsttime==1)
{
for(i=0;i<3;i++)
{
- db[i]=0; // Unit: Tesla/Second
+ db1[i]=0; // Unit: Tesla/Second
}
- flag_firsttime=0;
+ flag_firsttime=0;
}
else
{
for(i=0;i<3;i++)
{
- db[i]= (b[i]-b_old[i])/sampling_time; // Unit: Tesla/Second
+ db1[i]= (b1[i]-b_old[i])/sampling_time; // Unit: Tesla/Second
}
}
- if(nominal == 0)
-
- {
-
- if(max_array(omega)<(0.8*OmegaMax) && alarmmode==1)
- {
- alarmmode=0;
- }
- else if(max_array(omega)>OmegaMax&& alarmmode==0)
- {
- alarmmode=1;
- }
-
- }
-
+ if(nominal == 0)
+ {
+ if(max_array(omega1)<(0.8*OmegaMax) && alarmmode==1)
+ {
+ alarmmode=0;
+ }
+ else if(max_array(omega1)>OmegaMax && alarmmode==0)
+ {
+ alarmmode=1;
+ }
+
+ }
+
for (i=0;i<3;i++)
{
- b_copy[i]=b[i];
- db_copy[i]=db[i];
- omega_copy[i]=omega[i];
+ b1_copy[i]=b1[i];
+ db1_copy[i]=db1[i];
+ omega1_copy[i]=omega1[i];
}
if(((alarmmode==0)|| (nominal == 1))&&(detumbling==0))
{
- controlmode_mms = 0;
- controlmodes(moment,b,db,omega,0x00,ACS_DETUMBLING_ALGO_TYPE);
+ //*controlmode=0;
+ controlmode_mms =0;
+ controllermodes(moment,b1,db1,omega1,controlmode_mms,ACS_DETUMBLING_ALGO_TYPE);
for (i=0;i<3;i++)
{
- b[i]=b_copy[i];
- db[i]=db_copy[i];
- omega[i]=omega_copy[i];
+ b1[i]=b1_copy[i];
+ db1[i]=db1_copy[i];
+ omega1[i]=omega1_copy[i];
}
if(max_array(moment)>MmntMax)
{
+ //*controlmode=1;
controlmode_mms = 1;
- controlmodes(moment,b,db,omega,0x01,ACS_DETUMBLING_ALGO_TYPE);
- for (i=0;i<3;i++)
- {
- b[i]=b_copy[i];
- db[i]=db_copy[i];
- omega[i]=omega_copy[i];
- }
+ controllermodes(moment,b1,db1,omega1,controlmode_mms,ACS_DETUMBLING_ALGO_TYPE);
+ for (i=0;i<3;i++)
+ {
+ b1[i]=b1_copy[i];
+ db1[i]=db1_copy[i];
+ omega1[i]=omega1_copy[i];
+ }
if(max_array(moment)>MmntMax)
{
normalising_fact=max_array(moment)/MmntMax;
for(i=0;i<3;i++)
- {
+ {
moment[i]/=normalising_fact; // Unit: Ampere*Meter^2
- }
+ }
}
}
- ACS_STATUS = 5;//*is this changed now
+
+ ACS_STATUS = 5;
}
else
{
+ //*controlmode=1;
controlmode_mms = 1;
- controlmodes(moment,b,db,omega,0x01,ACS_DETUMBLING_ALGO_TYPE);
- for (i=0;i<3;i++)
- {
- b[i]=b_copy[i];
- db[i]=db_copy[i];
- omega[i]=omega_copy[i];
- }
+ controllermodes(moment,b1,db1,omega1,controlmode_mms,ACS_DETUMBLING_ALGO_TYPE);
+ for (i=0;i<3;i++)
+ {
+ b1[i]=b1_copy[i];
+ db1[i]=db1_copy[i];
+ omega1[i]=omega1_copy[i];
+ }
if(max_array(moment)>MmntMax)
{
normalising_fact=max_array(moment)/MmntMax;
for(i=0;i<3;i++)
- {
+ {
moment[i]/=normalising_fact; // Unit: Ampere*Meter^2
- }
+ }
}
}
for (i=0;i<3;i++)
{
- b_old[i]=b[i];
+ b_old[i]=b1[i];
}
}
-void inverse(float mat[3][3],float inv[3][3],uint8_t &singularity_flag)
+void controllermodes(float moment[3], float b[3], float db[3], float omega[3], uint8_t controlmode1,uint8_t ACS_DETUMBLING_ALGO_TYPE)
{
- int i,j;
- float det=0;
- for(i=0;i<3;i++)
- {
- for(j=0;j<3;j++)
- {
- inv[j][i]=(mat[(i+1)%3][(j+1)%3]*mat[(i+2)%3][(j+2)%3])-(mat[(i+2)%3][(j+1)%3]*mat[(i+1)%3][(j+2)%3]);
- }
- }
- det+=(mat[0][0]*inv[0][0])+(mat[0][1]*inv[1][0])+(mat[0][2]*inv[2][0]);
- if (det==0)
- {
- singularity_flag=1;
- }
- else
- {
- singularity_flag=0;
- for(i=0;i<3;i++)
- {
- for(j=0;j<3;j++)
- {
- inv[i][j]/=det;
- }
- }
- }
-}
-float max_array(float arr[3])
-{
- int i;
- float temp_max=fabs(arr[0]);
- for(i=1;i<3;i++)
- {
- if(fabs(arr[i])>temp_max)
- {
- temp_max=fabs(arr[i]);
- }
- }
- return temp_max;
-}
-
-uint8_t singularity_flag_mms=0;
-
-void controlmodes(float moment[3],float b[3], float db[3], float omega[3], uint8_t controlmode1,uint8_t ACS_DETUMBLING_ALGO_TYPE)
-{
float bb[3]={0,0,0};
float d[3]={0,0,0};
- float Jm[3][3]={{0.2271,0.0014,-0.0026},{0.0014,0.2167,-0.004},{-0.0026,-0.004,0.2406}}; // Unit: Kilogram*Meter^2. Jm may change depending on the final satellite structure
float den=0,den2;
float bcopy[3];
int i, j;//temporary variables
float Mu[2],z[2],dv[2],v[2],u[2],tauc[3]={0,0,0},Mmnt[3];//outputs
float invJm[3][3];
+
float kmu2=0.07,gamma2=1.9e4,kz2=0.4e-2,kmu=0.003,gamma=5.6e4,kz=0.1e-4;
- //uint8_t singularity_flag=0;
+ float Jm[3][3]={{0.2271,0.0014,-0.0026},{0.0014,0.2167,-0.004},{-0.0026,-0.004,0.2406}}; // Unit: Kilogram*Meter^2. Jm may change depending on the final satellite structure
+
+ int singularity_flag = 0;
+ singularity_flag_mms=0;
if(controlmode1==0)
{
@@ -293,9 +257,10 @@
den2=(b[0]*db[0])+(b[1]*db[1])+(b[2]*db[2]);
if (den==0)
{
+ singularity_flag = 1;
singularity_flag_mms=1;
}
- if (singularity_flag_mms==0)
+ if (singularity_flag==0)
{
for(i=0;i<3;i++)
{
@@ -319,7 +284,7 @@
z[i]=db[i]-v[i];
u[i]=-kz*z[i]+dv[i]-(Mu[i]/gamma);
}
- inverse(Jm,invJm,singularity_flag_mms);
+ inversec(Jm,invJm,&singularity_flag);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
@@ -334,8 +299,8 @@
d[i]+=bb[j]*invJm[i][j];
}
}
- bb[1]=u[0]-(d[1]*b[2])+(d[2]*b[1])-(omega[1]*db[2])+(omega[2]*db[1]);
- bb[2]=u[1]-(d[2]*b[0])+(d[0]*b[2])-(omega[2]*db[0])+(omega[0]*db[2]);
+ bb[1]=u[0]-(d[1]*b[2])+(d[2]*b[1])+(omega[1]*db[2])-(omega[2]*db[1]);
+ bb[2]=u[1]-(d[2]*b[0])+(d[0]*b[2])+(omega[2]*db[0])-(omega[0]*db[2]);
bb[0]=0;
for(i=0;i<3;i++)
{
@@ -344,14 +309,13 @@
invJm[2][i]=b[2]*invJm[0][i]-b[0]*d[i];
invJm[0][i]=b[i];
}
- inverse(invJm,Jm,singularity_flag_mms);
-
- //00000
+ inversec(invJm,Jm,&singularity_flag);
+
float_to_uint8_ARRAY(3,3, (float*)invJm,max_invjm, min_invjm, invjm_mms);
float_to_uint8_ARRAY(3,3, (float*)Jm,max_jm, min_jm, jm_mms);
float_to_uint8_ARRAY(1,3, (float*)bb,max_bb, min_bb, bb_mms);
-
- if (singularity_flag_mms==0)
+ singularity_flag_mms = singularity_flag;
+ if (singularity_flag==0)
{
for(i=0;i<3;i++)
{
@@ -371,14 +335,14 @@
}
}
}
- if (singularity_flag_mms==1)
+ if (singularity_flag==1)
{
for (i=0;i<3;i++)
{
Mmnt[i]=2*MmntMax;
}
}
- ACS_STATUS = 5;
+ ACS_STATUS =5;
}
else if(controlmode1==1)
{
@@ -405,6 +369,51 @@
}
}
+void inversec(float mat[3][3],float inv[3][3],int *singularity_flag)
+{
+ int i,j;
+ float det=0;
+ for(i=0;i<3;i++)
+ {
+ for(j=0;j<3;j++)
+ {
+ inv[j][i]=(mat[(i+1)%3][(j+1)%3]*mat[(i+2)%3][(j+2)%3])-(mat[(i+2)%3][(j+1)%3]*mat[(i+1)%3][(j+2)%3]);
+ }
+ }
+ det+=(mat[0][0]*inv[0][0])+(mat[0][1]*inv[1][0])+(mat[0][2]*inv[2][0]);
+ if (det==0)
+ {
+ *singularity_flag=1;
+ }
+ else
+ {
+ *singularity_flag=0;
+ for(i=0;i<3;i++)
+ {
+ for(j=0;j<3;j++)
+ {
+ inv[i][j]/=det;
+ }
+ }
+ }
+}
+
+float max_array(float arr[3])
+{
+ int i;
+ float temp_max=fabs(arr[0]);
+ for(i=1;i<3;i++)
+ {
+ if(fabs(arr[i])>temp_max)
+ {
+ temp_max=fabs(arr[i]);
+ }
+ }
+ return temp_max;
+}
+
+
+
I2C i2c (PTC9,PTC8); //PTC9-sda,PTC8-scl for the attitude sensors and battery gauge
int FCTN_ACS_INIT(); //initialization of registers happens
@@ -444,8 +453,10 @@
cmd[0]=RESETREQ;
cmd[1]=BIT_RESREQ;
i2c.write(SLAVE_ADDR,cmd,2); //When 0x01 is written in reset request register Emulates a hard power down/power up
- wait_ms(575);
-
+ wait_ms(275);
+ //kick_WDOG();
+ acs_pc.printf("\n\r lvl5");
+ wait_ms(300);
//Verify magic number
@@ -456,14 +467,14 @@
if(value & 0x02)
{
- printf("Sentral already has eeprom firmware loaded.\n");
+ acs_pc.printf("Sentral already has eeprom firmware loaded.\n");
}
/* Write value 0x01 to the ResetReq register, address 0x9B. This will result
in a hard reset of the Sentral. This is unnecessary if the prior event was
a Reset. */
if(!(value & 0x08))
{
- printf("CPU is not in standby, issuing a shutdown request.\n");
+ acs_pc.printf("CPU is not in standby, issuing a shutdown request.\n");
//i2c_write(I2C_SLAVE_ADDR, 0x34, data, 1);
cmd[0]=HOST_CTRL; //0x00 is written in HOST CONTROL register to shut down
cmd[1]=0x00;
@@ -490,12 +501,15 @@
i2c.write(SLAVE_ADDR,cmd,2);
wait_ms(20);
+ //kick_WDOG();
+ acs_pc.printf("\n\r lvl6");
+
cmd[0]=UPLOAD_ADDR; //0x0000 is written in RAM register to enable upload
cmd[1]=0x0000;
i2c.write(SLAVE_ADDR,cmd,3);
wait_ms(100);
- printf("Uploading data...\n");
+ acs_pc.printf("Uploading data...\n");
#define TRASACTION_SIZE 3
@@ -538,12 +552,12 @@
if(actualCRC != EEPROMTextCRC)
{
- pc_acs.printf("Program crc (0x%.8X) does not match CRC reported by Sentral (0x%0.8X)\n", EEPROMTextCRC, actualCRC);
+ acs_pc.printf("Program crc (0x%.8X) does not match CRC reported by Sentral (0x%0.8X)\n", EEPROMTextCRC, actualCRC);
return 0;
}
else
{
- pc_acs.printf("Firmware Upload Complete.\n");
+ acs_pc.printf("Firmware Upload Complete.\n");
return 1;
}
@@ -557,13 +571,13 @@
int SENSOR_INIT()
{
-/// pc_acs.printf("Entered sensor init\n \r");
+/// acs_pc.printf("Entered sensor init\n \r");
cmd[0]=RESETREQ;
cmd[1]=BIT_RESREQ;
ack = i2c.write(SLAVE_ADDR,cmd,2); //When 0x01 is written in reset request register Emulates a hard power down/power up
//wait_ms(575); //waiting for loading configuration file stored in EEPROM
-/// pc_acs.printf("ACK for reset is %d\r\n",ack); //waiting for loading configuration file stored in EEPROM
+/// acs_pc.printf("ACK for reset is %d\r\n",ack); //waiting for loading configuration file stored in EEPROM
if( ack!=0)
{
@@ -574,7 +588,11 @@
return 0;
}
- wait_ms(575);
+
+ wait_ms(275);
+ //kick_WDOG();
+ acs_pc.printf("\n\r lvl2");
+ wait_ms(300);
cmd[0]=SENTRALSTATUS;
ack = i2c.write(SLAVE_ADDR,cmd,1);
@@ -595,7 +613,7 @@
return 0;
}
-/// pc_acs.printf("Sentral Status is %x\n \r",(int)store);
+/// acs_pc.printf("Sentral Status is %x\n \r",(int)store);
//to check whether EEPROM is uploaded properly
switch((int)store) {
@@ -615,8 +633,10 @@
if(ack!=0)
return 0;
}
- wait_ms(575);//should be 600
-
+ wait_ms(275);//should be 600
+ //kick_WDOG();
+ acs_pc.printf("\n\r lvl3");
+ wait_ms(300);
cmd[0]=SENTRALSTATUS;
ack = i2c.write(SLAVE_ADDR,cmd,1);
if( ack!=0)
@@ -632,7 +652,7 @@
if(ack!=0)
return 0;
}
-/// pc_acs.printf("Sentral Status is %x\n \r",(int)store);
+/// acs_pc.printf("Sentral Status is %x\n \r",(int)store);
}
}
@@ -650,9 +670,14 @@
if(ack!=0)
return 0;
}
- wait_ms(575);
+ wait_ms(275);
+ //kick_WDOG();
+ acs_pc.printf("\n\r lvl4");
+ wait_ms(300);
+ timer_SENSOR_INIT.start();
manual = CONFIG_UPLOAD();
+ timer_SENSOR_INIT.stop();
if(manual == 0)
{
@@ -738,16 +763,16 @@
return 0;
}
-/// pc_acs.printf("Sentral Status after initialising is %x\n \r",(int)store);
+/// acs_pc.printf("Sentral Status after initialising is %x\n \r",(int)store);
if( (int)store == 3) //Check if initialised properly and not in idle state
{
-/// pc_acs.printf("Exited sensor init successfully\n \r");
+/// acs_pc.printf("Exited sensor init successfully\n \r");
return 1;
}
-//// pc_acs.printf("Sensor init failed \n \r") ;
+//// acs_pc.printf("Sensor init failed \n \r") ;
return 0;
}
@@ -755,36 +780,37 @@
{
ACS_INIT_STATUS = 1; //set ACS_INIT_STATUS flag
-
int working=0;
-/// pc_acs.printf("Attitude sensor init called \n \r");
-/// pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
+/// acs_pc.printf("Attitude sensor init called \n \r");
+/// acs_pc.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
if(((ACS_ATS_STATUS & 0xC0) != 0xC0)&&( (ACS_ATS_STATUS & 0xC0) != 0x80)) //Sensor1 status is not 10 or 11
{
-/// pc_acs.printf("Sensor 1 marked working \n \r");
+/// acs_pc.printf("Sensor 1 marked working \n \r");
+ timer_SENSOR_INIT.start();
working = SENSOR_INIT();
+ timer_SENSOR_INIT.stop();
if(working ==1)
{
ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x70;
-/// pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS); //Sensor 1 INIT successful
-/// pc_acs.printf("Attitude sensor init exitting. Init successful. Ideal case.Sensor 1\n \r");
+/// acs_pc.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS); //Sensor 1 INIT successful
+/// acs_pc.printf("Attitude sensor init exitting. Init successful. Ideal case.Sensor 1\n \r");
ACS_INIT_STATUS = 0;
return 1;
}
-/// pc_acs.printf("Sensor 1 not working.Powering off.\n \r"); //Sensor 1 INIT failure and power off
+/// acs_pc.printf("Sensor 1 not working.Powering off.\n \r"); //Sensor 1 INIT failure and power off
ATS1_SW_ENABLE = 1;
ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0xC0;
}
-/// pc_acs.printf("Sensor 1 not working. Trying Sensor 2\n \r");
+/// acs_pc.printf("Sensor 1 not working. Trying Sensor 2\n \r");
if(( (ACS_ATS_STATUS & 0x0C) != 0x0C)&&( (ACS_ATS_STATUS & 0x0C) != 0x08)) //Sensor1 status is not 10 or 11
{
@@ -792,11 +818,15 @@
ATS2_SW_ENABLE = 0;
wait_ms(5);
+ timer_SENSOR_INIT.reset();
+ timer_SENSOR_INIT.start();
working = SENSOR_INIT();
+ timer_SENSOR_INIT.stop();
+
if(working ==1)
{
-/// pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
-/// pc_acs.printf("Attitude sensor init exitting. Init successful. Ideal case.Sensor 2\n \r"); //Sensor2 INIT successful
+/// acs_pc.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
+/// acs_pc.printf("Attitude sensor init exitting. Init successful. Ideal case.Sensor 2\n \r"); //Sensor2 INIT successful
ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x07;
ACS_INIT_STATUS = 0;
return 2;
@@ -810,8 +840,8 @@
}
-/// pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
-/// pc_acs.printf("Sensor 2 also not working.Exit init.\n \r");
+/// acs_pc.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
+/// acs_pc.printf("Sensor 2 also not working.Exit init.\n \r");
ACS_INIT_STATUS = 0; //set ACS_INIT_STATUS flag //Sensor 2 also not working
return 0;
@@ -821,7 +851,7 @@
int SENSOR_DATA_ACQ()
{
//int mag_only=0;
-/// pc_acs.printf("Entering Sensor data acq.\n \r");
+/// acs_pc.printf("Entering Sensor data acq.\n \r");
char status;
int sentral;
int event;
@@ -892,16 +922,18 @@
ATS2_SENTRAL_STATUS_RGTR = (uint8_t)sentral;
}
-/// pc_acs.printf("Event Status is %x\n \r",event);
-/// pc_acs.printf("Sentral Status is %x\n \r",sentral);
+/// acs_pc.printf("Event Status is %x\n \r",event);
+/// acs_pc.printf("Sentral Status is %x\n \r",sentral);
- if ( (event & 0x40 != 0x40 ) || (event & 0x08 != 0x08 ) || (event & 0x01 == 0x01 )|| (event & 0x02 == 0x02 )|| (sentral!= 3)) //check for any error in event status register
+ if ( ((event & 0x20 )!= 0x20 ) || ((event & 0x08) != 0x08 ) || ((event & 0x01) == 0x01 )|| ((event & 0x02) == 0x02 )|| (sentral!= 3)) //check for any error in event status register
{
-
+ timer_SENSOR_INIT.reset();
+ timer_SENSOR_INIT.start();
init = SENSOR_INIT();
+ timer_SENSOR_INIT.stop();
cmd[0]=EVT_STATUS;
ack = i2c.write(SLAVE_ADDR,cmd,1);
@@ -940,10 +972,10 @@
}
sentral = (int)status;
+ int poll_status;
+/// acs_pc.printf("Event Status after resetting and init is %x\n \r",event);
-/// pc_acs.printf("Event Status after resetting and init is %x\n \r",event);
-
- if ( (event & 0x40 != 0x40 ) || (event & 0x08 != 0x08) || (event & 0x01 == 0x01 )|| (event & 0x02 == 0x02 ) || (init == 0)||(sentral != 3)) //check for any error in event status
+ if ( ((event & 0x20) != 0x20 ) || ((event & 0x08) != 0x08) || ((event & 0x01) == 0x01 )|| ((event & 0x02) == 0x02 ) || (init == 0)||(sentral != 3)) //check for any error in event status
{
cmd[0]=ERROR;
@@ -1007,35 +1039,38 @@
{
if( (error&1 == 1) || (sensor&1 == 1) || (sensor&16 == 16) )
{
- pc_acs.printf("error in gyro alone..\n \r");
+ acs_pc.printf("error in gyro.\n \r");
gyro_error = 1;
}
if( (error&4 == 4) || (sensor&4 == 4) || (sensor&64 == 64) )
{
- pc_acs.printf("error in mag alone.Exiting.\n \r");
+ acs_pc.printf("error in mag.Exiting.\n \r");
mag_error = 1;
}
if( (gyro_error!=1)&&(mag_error!=1))
{
- pc_acs.printf("error in something else.Exiting.\n \r");
+ acs_pc.printf("error in something else.Exiting.\n \r");
return 0;
}
}
- if((event & 1 == 1 ))
+ if(((event & 1) == 1 ))
{
-/// pc_acs.printf("error in CPU Reset.\n \r");
+/// acs_pc.printf("error in CPU Reset.\n \r");
return 0;
}
-
- if((event & 8 != 8 )||(event & 32 != 32 ))
+ int poll =0;
+ poll_status =1;
+ while((poll<15)&&(((event & 8) != 8 )||((event & 32) != 32 )))
+ //if(((event & 8) != 8 )||((event & 32) != 32 ))
{
- pc_acs.printf("Data not ready waiting...\n \r");
+ poll++;
+ acs_pc.printf("Data not ready waiting...POLL#%d\n \r",poll);
//POLL
wait_ms(200);
@@ -1058,35 +1093,48 @@
}
event = (int)status;
- if(event & 32 != 32 )
+ if((event & 32) != 32 )
{
- pc_acs.printf("Mag data only ready.Read..\n \r");
+ acs_pc.printf("Gyro not ready..\n \r");
gyro_error = 1;
}
+ else
+ {
+ gyro_error = 0;
+ }
- if(event & 8 != 8 )
+ if((event & 8) != 8 )
{
- pc_acs.printf("Both data still not ready.Exiting..\n \r");
+ acs_pc.printf("Mag not ready..\n \r");
mag_error=1;
}
+ else
+ {
+ mag_error=0;
+ }
}
+
+ if(poll!=15)
+ {
+ poll_status = 0;
+ }
}
- if((mag_error !=1)&&(gyro_error!=1))
+ if(((mag_error !=1)&&(gyro_error!=1))&&(poll_status!=0))
{
- pc_acs.printf("Error in something else.Exiting.\n \r");
+ acs_pc.printf("Error in something else.Exiting.\n \r");
return 0;
}
- if((mag_error ==1)&&(gyro_error==1))
+ if(((mag_error ==1)&&(gyro_error==1))&&(poll_status!=0))
{
- pc_acs.printf("Error in both gyro and mag.Exiting.\n \r");
+ acs_pc.printf("Error in both gyro and mag.Exiting.\n \r");
return 0;
}
@@ -1107,7 +1155,7 @@
}
- // pc_acs.printf("\nGyro Values:\n");
+ // acs_pc.printf("\nGyro Values:\n");
if (gyro_error!=1)
{
for(int i=0; i<3; i++) {
@@ -1135,16 +1183,16 @@
if(mag_error == 1)
{
- pc_acs.printf("Gyro only successful.\n \r");
+ acs_pc.printf("Gyro only successful.\n \r");
return 1;
}
if(gyro_error == 1)
- {
- pc_acs.printf("Mag only successful.\n \r");
+ {
+ acs_pc.printf("Mag only successful.\n \r");
return 2;
}
- //pc_acs.printf("Reading data success.\n \r");
+ //acs_pc.printf("Reading data success.\n \r");
return 3;
}
@@ -1159,27 +1207,31 @@
int acq;
int init;
-//// pc_acs.printf("DATA_ACQ called \n \r");
-//// pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
+//// acs_pc.printf("DATA_ACQ called \n \r");
+//// acs_pc.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
if(( (ACS_ATS_STATUS & 0xC0) == 0x40))
{
-
+ timer_SENSOR_DATA_ACQ.start();
acq = SENSOR_DATA_ACQ();
+ timer_SENSOR_DATA_ACQ.stop();
+ //pc.pritnf("\n\r timer_SENSOR_DATA_ACQ is %f",timer_SENSOR_DATA_ACQ.read());
+
+
if(acq == 3)
{
ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x70;
//??ACS_DATA_ACQ_STATUS = 0; //clear ACS_DATA_ACQ_STATUS flag for att sens 2
-//// pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
-//// pc_acs.printf(" Sensor 1 data acq successful.Exit Data ACQ\n \r");
+//// acs_pc.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
+//// acs_pc.printf(" Sensor 1 data acq successful.Exit Data ACQ\n \r");
return 3;
}
else if((acq == 2)||(acq==1))
{
- pc_acs.printf(" Sensor 1 data partial success.Try other sensor.\n \r");
+ acs_pc.printf(" Sensor 1 data partial success.Try other sensor.\n \r");
if( (ACS_ATS_STATUS & 0x0F == 0x03) ||((ACS_ATS_STATUS & 0x0F == 0x02)&&(acq==1))||((ACS_ATS_STATUS & 0x0F == 0x01)&&(acq==2)) )
{
//other sensor both working, off or
@@ -1199,11 +1251,15 @@
ATS2_SW_ENABLE = 0; //switch on sensor 2
wait_ms(5);
-
- init = SENSOR_INIT(); //sensor 2 init
+
+ timer_SENSOR_INIT.reset();
+ timer_SENSOR_INIT.start();
+ init = SENSOR_INIT();
+ timer_SENSOR_INIT.stop();
+ //sensor 2 init
if( init == 0)
{
- pc_acs.printf(" Sensor 2 data acq failure.Go to sensor 1 again.\n \r");
+ acs_pc.printf(" Sensor 2 data acq failure.Go to sensor 1 again.\n \r");
ATS2_SW_ENABLE = 1;
wait_ms(5);
ATS1_SW_ENABLE = 0;
@@ -1224,7 +1280,7 @@
if(acq2 == 3)
{
ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x07;
- pc_acs.printf(" Sensor 2 data acq success.Exiting.\n \r"); //Sensor 2 working, exit
+ acs_pc.printf(" Sensor 2 data acq success.Exiting.\n \r"); //Sensor 2 working, exit
return 3;
}
else if(acq2 == 1)
@@ -1252,7 +1308,7 @@
}
else if(acq2 == 0) //Sensor 2 not working, switch back to sensor 1
{
- pc_acs.printf(" Sensor 2 data acq failure.Go to sensor 1 again.\n \r");
+ acs_pc.printf(" Sensor 2 data acq failure.Go to sensor 1 again.\n \r");
ATS2_SW_ENABLE = 1;
wait_ms(5); //In status change 00 to 01 for sensor 1, other two bits are same
ATS1_SW_ENABLE = 0;
@@ -1274,7 +1330,7 @@
ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x60;
return 2;
}
- pc_acs.printf(" Sensor 1 data partial success.Sensor 2 marked not working.Exiting.\n \r");
+ acs_pc.printf(" Sensor 1 data partial success.Sensor 2 marked not working.Exiting.\n \r");
return acq;
}
@@ -1282,7 +1338,7 @@
else if(acq == 0)
{
- pc_acs.printf(" Sensor 1 data acq failure.Try sensor 2.\n \r"); //Sensor 1 not working at all
+ acs_pc.printf(" Sensor 1 data acq failure.Try sensor 2.\n \r"); //Sensor 1 not working at all
ATS1_SW_ENABLE = 1;
wait_ms(5); //Switch ON sensor 2
ATS2_SW_ENABLE = 0;
@@ -1293,7 +1349,7 @@
init = SENSOR_INIT();
if( init == 0)
{
- pc_acs.printf(" Sensor 2 also data acq failure.\n \r");
+ acs_pc.printf(" Sensor 2 also data acq failure.\n \r");
ATS2_SW_ENABLE = 1;
ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x0C; //Sensor 2 also not working exit
return 0;
@@ -1304,7 +1360,7 @@
if(acq2 == 3)
{
ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x07;
- pc_acs.printf(" Sensor 2 data acq success.Exiting.\n \r"); //Sensor 2 working
+ acs_pc.printf(" Sensor 2 data acq success.Exiting.\n \r"); //Sensor 2 working
return 3;
}
else if(acq2 == 1)
@@ -1319,7 +1375,7 @@
}
else if(acq2 == 0)
{
- pc_acs.printf(" Sensor 2 data acq failure..\n \r");
+ acs_pc.printf(" Sensor 2 data acq failure..\n \r");
ATS2_SW_ENABLE = 1;
ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x0C;
@@ -1339,13 +1395,13 @@
if(acq == 3) //Both available read and exit
{
ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x07;
- pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
- pc_acs.printf(" Sensor 2 data acq successful.Exit Data ACQ\n \r");
+ acs_pc.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
+ acs_pc.printf(" Sensor 2 data acq successful.Exit Data ACQ\n \r");
return 3;
}
else if((acq == 2)||(acq==1)) //Only mag or only gyro
{
- pc_acs.printf(" Sensor 2 data partial success.Try other sensor.\n \r");
+ acs_pc.printf(" Sensor 2 data partial success.Try other sensor.\n \r");
if((ACS_ATS_STATUS & 0xF0 == 0x30) ||((ACS_ATS_STATUS & 0xF0 == 0x20)&&(acq==1))||((ACS_ATS_STATUS & 0xF0 == 0x10)&&(acq==2)) )
{
//other sensor both working, off or
@@ -1368,7 +1424,7 @@
if( init == 0)
{
- pc_acs.printf(" Sensor 1 data acq failure.Go to sensor 2 again.\n \r");
+ acs_pc.printf(" Sensor 1 data acq failure.Go to sensor 2 again.\n \r");
ATS1_SW_ENABLE = 1;
wait_ms(5);
ATS2_SW_ENABLE = 0;
@@ -1390,7 +1446,7 @@
if(acq2 == 3)
{
ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x70;
- pc_acs.printf(" Sensor 1 data acq success.Exiting.\n \r"); //Sensor 1 working, exit
+ acs_pc.printf(" Sensor 1 data acq success.Exiting.\n \r"); //Sensor 1 working, exit
return 3;
}
@@ -1419,7 +1475,7 @@
}
else if(acq2 == 0) //Sensor 1 not working, switch back to sensor 2
{
- pc_acs.printf(" Sensor 1 data acq failure.Go to sensor 2 again.\n \r");
+ acs_pc.printf(" Sensor 1 data acq failure.Go to sensor 2 again.\n \r");
ATS1_SW_ENABLE = 1;
wait_ms(5); //In status change 00 to 01 for sensor 2, other two bits are same
ATS2_SW_ENABLE = 0;
@@ -1441,14 +1497,14 @@
ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x06;
return 2;
}
- pc_acs.printf(" Sensor 2 data partial success.Sensor 1 marked not working.Exiting.\n \r");
+ acs_pc.printf(" Sensor 2 data partial success.Sensor 1 marked not working.Exiting.\n \r");
return acq;
}
}
else if(acq == 0)
{
- pc_acs.printf(" Sensor 2 data acq failure.Try sensor 1.\n \r"); //Sensor 2 not working at all
+ acs_pc.printf(" Sensor 2 data acq failure.Try sensor 1.\n \r"); //Sensor 2 not working at all
ATS2_SW_ENABLE = 1;
wait_ms(5); //Switch ON sensor 1
ATS1_SW_ENABLE = 0;
@@ -1459,7 +1515,7 @@
init = SENSOR_INIT();
if( init == 0)
{
- pc_acs.printf(" Sensor 1 also data acq failure.\n \r");
+ acs_pc.printf(" Sensor 1 also data acq failure.\n \r");
ATS2_SW_ENABLE = 1;
ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0xC0; //Sensor 1 also not working exit
return 0;
@@ -1470,7 +1526,7 @@
if(acq2 == 3)
{
ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x70;
- pc_acs.printf(" Sensor 1 data acq success.Exiting.\n \r"); //Sensor 1 working
+ acs_pc.printf(" Sensor 1 data acq success.Exiting.\n \r"); //Sensor 1 working
return 3;
}
else if(acq2 == 1)
@@ -1485,7 +1541,7 @@
}
else if(acq2 == 0)
{
- pc_acs.printf(" Sensor 1 data acq failure..\n \r");
+ acs_pc.printf(" Sensor 1 data acq failure..\n \r");
ATS1_SW_ENABLE = 1;
ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0xC0;
return 0;
@@ -1493,8 +1549,350 @@
}
}
}
- pc_acs.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
- pc_acs.printf(" Both sensors data acq failure.Exiting.\n \r");
+
+
+
+ if(( (ACS_ATS_STATUS & 0xC0) == 0x00))
+ {
+
+ ATS2_SW_ENABLE = 0;
+ wait_ms(10);
+ acq = SENSOR_DATA_ACQ();
+ if(acq == 3)
+ {
+
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x70;
+
+ //??ACS_DATA_ACQ_STATUS = 0; //clear ACS_DATA_ACQ_STATUS flag for att sens 2
+//// acs_pc.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
+//// acs_pc.printf(" Sensor 1 data acq successful.Exit Data ACQ\n \r");
+ return 3;
+ }
+ else if((acq == 2)||(acq==1))
+ {
+ acs_pc.printf(" Sensor 1 data partial success.Try other sensor.\n \r");
+ if( (ACS_ATS_STATUS & 0x0F == 0x03) ||((ACS_ATS_STATUS & 0x0F == 0x02)&&(acq==1))||((ACS_ATS_STATUS & 0x0F == 0x01)&&(acq==2)) )
+ {
+ //other sensor both working, off or
+ //other sensor gyro working, this sensor not working , off
+ //other sensor mag working, this sensor not working,off
+
+ ATS1_SW_ENABLE = 1; //switch off sensor 1
+ wait_ms(5);
+ if(acq == 1)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x10; //Update sensor 1 status
+ }
+ if(acq==2)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x20;
+ }
+
+ ATS2_SW_ENABLE = 0; //switch on sensor 2
+ wait_ms(5);
+
+ init = SENSOR_INIT(); //sensor 2 init
+ if( init == 0)
+ {
+ acs_pc.printf(" Sensor 2 data acq failure.Go to sensor 1 again.\n \r");
+ ATS2_SW_ENABLE = 1;
+ wait_ms(5);
+ ATS1_SW_ENABLE = 0;
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x0C; //Update not working and switch back to 1
+ if(acq == 1)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x50; //Update sensor 1 status
+ }
+ if(acq==2)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x60;
+ }
+ return acq;
+ }
+
+ int acq2;
+ acq2 = SENSOR_DATA_ACQ();
+ if(acq2 == 3)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x07;
+ acs_pc.printf(" Sensor 2 data acq success.Exiting.\n \r"); //Sensor 2 working, exit
+ return 3;
+ }
+ else if(acq2 == 1)
+ {
+ if(acq==2)
+ {
+ ATS2_SW_ENABLE = 1;
+ wait_ms(5);
+ ATS1_SW_ENABLE = 0; //Sensor 2 gyro only,sensor 1 mag only
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x01;
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x60;
+ return 3;
+ }
+ else
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x05; //Sensor 2 gyro only,sensor 1 gyro only
+ return 1;
+ }
+ }
+
+ else if(acq2==2) //Sensor 2 mag only, exit in both cases
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x06;
+ return 2;
+ }
+ else if(acq2 == 0) //Sensor 2 not working, switch back to sensor 1
+ {
+ acs_pc.printf(" Sensor 2 data acq failure.Go to sensor 1 again.\n \r");
+ ATS2_SW_ENABLE = 1;
+ wait_ms(5); //In status change 00 to 01 for sensor 1, other two bits are same
+ ATS1_SW_ENABLE = 0;
+ wait_ms(5);
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x3F)|0x40;
+ return acq;
+ }
+
+ }
+ else //Sensor 2 not working or both sensors gyro/mag ONLY
+ {
+ if(acq == 1)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x50; //return Sensor 2 status and update acq
+ return 1;
+ }
+ if(acq==2)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x60;
+ return 2;
+ }
+ acs_pc.printf(" Sensor 1 data partial success.Sensor 2 marked not working.Exiting.\n \r");
+ return acq;
+
+ }
+ }
+
+ else if(acq == 0)
+ {
+ acs_pc.printf(" Sensor 1 data acq failure.Try sensor 2.\n \r"); //Sensor 1 not working at all
+ ATS1_SW_ENABLE = 1;
+ wait_ms(5); //Switch ON sensor 2
+ ATS2_SW_ENABLE = 0;
+ wait_ms(5);
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0xC0;
+ if( (ACS_ATS_STATUS & 0x0C) == 0x00) //Sensor 2 is 00XX
+ {
+ init = SENSOR_INIT();
+ if( init == 0)
+ {
+ acs_pc.printf(" Sensor 2 also data acq failure.\n \r");
+ ATS2_SW_ENABLE = 1;
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x0C; //Sensor 2 also not working exit
+ return 0;
+ }
+
+ int acq2;
+ acq2 = SENSOR_DATA_ACQ();
+ if(acq2 == 3)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x07;
+ acs_pc.printf(" Sensor 2 data acq success.Exiting.\n \r"); //Sensor 2 working
+ return 3;
+ }
+ else if(acq2 == 1)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x05;
+ return 1;
+ }
+ else if(acq2 == 2)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x06;
+ return 2;
+ }
+ else if(acq2 == 0)
+ {
+ acs_pc.printf(" Sensor 2 data acq failure..\n \r");
+ ATS2_SW_ENABLE = 1;
+
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x0C;
+ return 0;
+ }
+
+ }
+
+ }
+
+
+ }
+
+ if(( (ACS_ATS_STATUS & 0x0C) == 0x00))
+ {
+ ATS2_SW_ENABLE = 0;
+ wait_ms(10);
+ acq = SENSOR_DATA_ACQ(); //make ATS2 on //acquire data 3 full success, 0 full failure , 1 gyro only , 2 mag only
+ if(acq == 3) //Both available read and exit
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x07;
+ acs_pc.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
+ acs_pc.printf(" Sensor 2 data acq successful.Exit Data ACQ\n \r");
+ return 3;
+ }
+ else if((acq == 2)||(acq==1)) //Only mag or only gyro
+ {
+ acs_pc.printf(" Sensor 2 data partial success.Try other sensor.\n \r");
+ if((ACS_ATS_STATUS & 0xF0 == 0x30) ||((ACS_ATS_STATUS & 0xF0 == 0x20)&&(acq==1))||((ACS_ATS_STATUS & 0xF0 == 0x10)&&(acq==2)) )
+ {
+ //other sensor both working, off or
+ //other sensor gyro working, this sensor not working , off
+ //other sensor mag working, this sensor not working,off
+ ATS2_SW_ENABLE = 1; //switch off sensor 2
+ wait_ms(5);
+ if(acq == 1)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x01; //Update sensor 2 status
+ }
+ if(acq==2)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x02;
+ }
+
+ ATS1_SW_ENABLE = 0; //switch on sensor 1
+ wait_ms(5);
+ init = SENSOR_INIT(); //sensor 2 init
+
+ if( init == 0)
+ {
+ acs_pc.printf(" Sensor 1 data acq failure.Go to sensor 2 again.\n \r");
+ ATS1_SW_ENABLE = 1;
+ wait_ms(5);
+ ATS2_SW_ENABLE = 0;
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0xC0; //Update not working and switch back to 2
+ if(acq == 1)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x05; //Update sensor 1 status
+ }
+ if(acq==2)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x06;
+ }
+ return acq;
+ }
+
+ int acq2;
+ acq2 = SENSOR_DATA_ACQ();
+
+ if(acq2 == 3)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x70;
+ acs_pc.printf(" Sensor 1 data acq success.Exiting.\n \r"); //Sensor 1 working, exit
+ return 3;
+ }
+
+ else if(acq2 == 1)
+ {
+ if(acq==2)
+ {
+ ATS1_SW_ENABLE = 1;
+ wait_ms(5);
+ ATS2_SW_ENABLE = 0; //Sensor 1 gyro only,sensor 2 mag only
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x10;
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x06;
+ return 3;
+ }
+ else
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x50; //Sensor 1 gyro only,sensor 2 gyro only
+ return 1;
+ }
+ }
+
+ else if(acq2==2) //Sensor 1 mag only, exit in both cases
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x60;
+ return 2;
+ }
+ else if(acq2 == 0) //Sensor 1 not working, switch back to sensor 2
+ {
+ acs_pc.printf(" Sensor 1 data acq failure.Go to sensor 2 again.\n \r");
+ ATS1_SW_ENABLE = 1;
+ wait_ms(5); //In status change 00 to 01 for sensor 2, other two bits are same
+ ATS2_SW_ENABLE = 0;
+ wait_ms(5);
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF3)|0x04;
+ return acq;
+ }
+
+ }
+ else //Sensor 1 not working or both sensors gyro/mag ONLY
+ {
+ if(acq == 1)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x05; //return Sensor 1 status and update acq
+ return 1;
+ }
+ if(acq==2)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x06;
+ return 2;
+ }
+ acs_pc.printf(" Sensor 2 data partial success.Sensor 1 marked not working.Exiting.\n \r");
+ return acq;
+
+ }
+ }
+ else if(acq == 0)
+ {
+ acs_pc.printf(" Sensor 2 data acq failure.Try sensor 1.\n \r"); //Sensor 2 not working at all
+ ATS2_SW_ENABLE = 1;
+ wait_ms(5); //Switch ON sensor 1
+ ATS1_SW_ENABLE = 0;
+ wait_ms(5);
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0xF0)|0x0C;
+ if((ACS_ATS_STATUS & 0xC0) == 0x00) //Sensor 1 is 00XX
+ {
+ init = SENSOR_INIT();
+ if( init == 0)
+ {
+ acs_pc.printf(" Sensor 1 also data acq failure.\n \r");
+ ATS2_SW_ENABLE = 1;
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0xC0; //Sensor 1 also not working exit
+ return 0;
+ }
+
+ int acq2;
+ acq2 = SENSOR_DATA_ACQ();
+ if(acq2 == 3)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x70;
+ acs_pc.printf(" Sensor 1 data acq success.Exiting.\n \r"); //Sensor 1 working
+ return 3;
+ }
+ else if(acq2 == 1)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x50;
+ return 1;
+ }
+ else if(acq2 == 2)
+ {
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0x60;
+ return 2;
+ }
+ else if(acq2 == 0)
+ {
+ acs_pc.printf(" Sensor 1 data acq failure..\n \r");
+ ATS1_SW_ENABLE = 1;
+ ACS_ATS_STATUS = (ACS_ATS_STATUS&0x0F)|0xC0;
+ return 0;
+ }
+ }
+ }
+ }
+
+
+
+
+
+ acs_pc.printf("ATS Status is %x\n\n \r",(int)ACS_ATS_STATUS);
+ acs_pc.printf(" Both sensors data acq failure.Exiting.\n \r");
return 0;
}
@@ -1559,7 +1957,7 @@
{
g_err_flag_TR_x = 1;
}
- pc_acs.printf("DC for trx is %f \r \n",l_duty_cycle_x);
+ acs_pc.printf("DC for trx is %f \r \n",l_duty_cycle_x);
//------------------------------------- y-direction TR--------------------------------------//
@@ -1609,7 +2007,7 @@
{
g_err_flag_TR_y = 1;
}
- pc_acs.printf("DC for try is %f \r \n",l_duty_cycle_y);
+ acs_pc.printf("DC for try is %f \r \n",l_duty_cycle_y);
//----------------------------------------------- z-direction TR -------------------------//
@@ -1659,7 +2057,7 @@
{
g_err_flag_TR_z = 1;
}
- pc_acs.printf("DC for trz is %f \r \n",l_duty_cycle_z);
+ acs_pc.printf("DC for trz is %f \r \n",l_duty_cycle_z);
//changed
if(phase_TR_x)
