To be debugged

Dependencies:   FreescaleIAP mbed-rtos mbed

Fork of TFR_BAE_vr1_1_Debug153 by Bragadeesh S

Committer:
Bragadeesh153
Date:
Wed Feb 03 18:41:17 2016 +0000
Revision:
9:f66c57a01e05
Parent:
8:aad4f22221b1
To be debugged

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sakthipriya 0:7b4c00e3912f 1 /*------------------------------------------------------------------------------------------------------------------------------------------------------
sakthipriya 0:7b4c00e3912f 2 -------------------------------------------CONTROL ALGORITHM------------------------------------------------------------------------------------------*/
sakthipriya 0:7b4c00e3912f 3 #include <mbed.h>
sakthipriya 0:7b4c00e3912f 4 #include <math.h>
sakthipriya 0:7b4c00e3912f 5
sakthipriya 0:7b4c00e3912f 6 #include "pni.h" //pni header file
sakthipriya 0:7b4c00e3912f 7 #include "pin_config.h"
sakthipriya 0:7b4c00e3912f 8 #include "ACS.h"
sakthipriya 6:036d08b62785 9 #include "EPS.h"
sakthipriya 0:7b4c00e3912f 10
sakthipriya 0:7b4c00e3912f 11 //********************************flags******************************************//
sakthipriya 0:7b4c00e3912f 12 extern uint32_t BAE_STATUS;
sakthipriya 0:7b4c00e3912f 13 extern uint32_t BAE_ENABLE;
sakthipriya 0:7b4c00e3912f 14 extern char ACS_INIT_STATUS;
sakthipriya 0:7b4c00e3912f 15 extern char ACS_DATA_ACQ_STATUS;
sakthipriya 0:7b4c00e3912f 16 extern char ACS_ATS_STATUS;
sakthipriya 0:7b4c00e3912f 17 extern char ACS_MAIN_STATUS;
sakthipriya 0:7b4c00e3912f 18 extern char ACS_STATUS;
sakthipriya 0:7b4c00e3912f 19
sakthipriya 0:7b4c00e3912f 20 extern char ACS_ATS_ENABLE;
sakthipriya 0:7b4c00e3912f 21 extern char ACS_DATA_ACQ_ENABLE;
sakthipriya 0:7b4c00e3912f 22 extern char ACS_STATE;
sakthipriya 0:7b4c00e3912f 23
sakthipriya 0:7b4c00e3912f 24 DigitalOut phase_TR_x(PIN27); // PHASE pin for x-torquerod
sakthipriya 0:7b4c00e3912f 25 DigitalOut phase_TR_y(PIN28); // PHASE pin for y-torquerod
sakthipriya 0:7b4c00e3912f 26 DigitalOut phase_TR_z(PIN86); // PHASE pin for z-torquerod
Bragadeesh153 9:f66c57a01e05 27 DigitalOut TRZ_EN(PIN88);
sakthipriya 0:7b4c00e3912f 28
Bragadeesh153 9:f66c57a01e05 29 //extern PwmOut PWM1; //x //Functions used to generate PWM signal
Bragadeesh153 9:f66c57a01e05 30 //extern PwmOut PWM2; //y
Bragadeesh153 9:f66c57a01e05 31 //extern PwmOut PWM3; //z //PWM output comes from pins p6
Bragadeesh153 9:f66c57a01e05 32
Bragadeesh153 9:f66c57a01e05 33 PwmOut PWM1(PIN93); //x //Functions used to generate PWM signal
Bragadeesh153 9:f66c57a01e05 34 PwmOut PWM2(PIN94); //y
Bragadeesh153 9:f66c57a01e05 35 PwmOut PWM3(PIN95); //z //PWM output comes from pins p6
sakthipriya 0:7b4c00e3912f 36
sakthipriya 0:7b4c00e3912f 37 int g_err_flag_TR_x=0; // setting x-flag to zero
sakthipriya 0:7b4c00e3912f 38 int g_err_flag_TR_y=0; // setting y-flag to zero
sakthipriya 0:7b4c00e3912f 39 int g_err_flag_TR_z=0; // setting z-flag to zero
sakthipriya 0:7b4c00e3912f 40
sakthipriya 0:7b4c00e3912f 41 extern float data[6];
sakthipriya 6:036d08b62785 42 extern BAE_HK_actual actual_data;
sakthipriya 0:7b4c00e3912f 43
sakthipriya 0:7b4c00e3912f 44
sakthipriya 0:7b4c00e3912f 45 //DigitalOut gpo1(PTC0); // enable of att sens2 switch
sakthipriya 0:7b4c00e3912f 46 //DigitalOut gpo2(PTC16); // enable of att sens switch
sakthipriya 0:7b4c00e3912f 47
sakthipriya 0:7b4c00e3912f 48
sakthipriya 0:7b4c00e3912f 49 Serial pc_acs(USBTX,USBRX); //for usb communication
sakthipriya 0:7b4c00e3912f 50 void inverse(float mat[3][3],float inv[3][3]);
sakthipriya 0:7b4c00e3912f 51
sakthipriya 0:7b4c00e3912f 52 int ctrl_count = 0;
sakthipriya 0:7b4c00e3912f 53 float bcopy[3];
sakthipriya 0:7b4c00e3912f 54 float moment[3];
sakthipriya 0:7b4c00e3912f 55 ///////algo working well
gkumar 8:aad4f22221b1 56 void FCTN_ACS_CNTRLALGO (float moment[3], float b1[3], float omega1[3], float b_old[3], int &alarmmode, int &flag_firsttime, int &controlmode)
sakthipriya 0:7b4c00e3912f 57 {
gkumar 8:aad4f22221b1 58 float db1[3]; // Unit: Tesla/Second
gkumar 8:aad4f22221b1 59 float sampling_time=10; // Unit: Seconds. Digital Control law excuted once in 10 seconds
gkumar 8:aad4f22221b1 60 float MmntMax=1.1; // Unit: Ampere*Meter^2
gkumar 8:aad4f22221b1 61 float OmegaMax=1*3.1415/180.0; // Unit: Radians/Second
gkumar 8:aad4f22221b1 62 float normalising_fact;
gkumar 8:aad4f22221b1 63 float b1_copy[3], omega1_copy[3], db1_copy[3];
gkumar 8:aad4f22221b1 64 int i, j;
gkumar 8:aad4f22221b1 65 if(flag_firsttime==1)
gkumar 8:aad4f22221b1 66 {
gkumar 8:aad4f22221b1 67 for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 68 {
gkumar 8:aad4f22221b1 69 db1[i]=0; // Unit: Tesla/Second
gkumar 8:aad4f22221b1 70 }
gkumar 8:aad4f22221b1 71 flag_firsttime=0;
gkumar 8:aad4f22221b1 72 }
sakthipriya 0:7b4c00e3912f 73 else
sakthipriya 0:7b4c00e3912f 74 {
sakthipriya 0:7b4c00e3912f 75 for(i=0;i<3;i++)
sakthipriya 0:7b4c00e3912f 76 {
gkumar 8:aad4f22221b1 77 db1[i]= (b1[i]-b_old[i])/sampling_time; // Unit: Tesla/Second
sakthipriya 0:7b4c00e3912f 78 }
gkumar 8:aad4f22221b1 79 }
gkumar 8:aad4f22221b1 80
gkumar 8:aad4f22221b1 81 if(max_array(omega1)<(0.8*OmegaMax) && alarmmode==1)
sakthipriya 0:7b4c00e3912f 82 {
gkumar 8:aad4f22221b1 83 alarmmode=0;
sakthipriya 0:7b4c00e3912f 84 }
gkumar 8:aad4f22221b1 85 else if(max_array(omega1)>OmegaMax && alarmmode==0)
sakthipriya 0:7b4c00e3912f 86 {
gkumar 8:aad4f22221b1 87 alarmmode=1;
sakthipriya 0:7b4c00e3912f 88 }
gkumar 8:aad4f22221b1 89
gkumar 8:aad4f22221b1 90 for (i=0;i<3;i++)
sakthipriya 0:7b4c00e3912f 91 {
gkumar 8:aad4f22221b1 92 b1_copy[i]=b1[i];
gkumar 8:aad4f22221b1 93 db1_copy[i]=db1[i];
gkumar 8:aad4f22221b1 94 omega1_copy[i]=omega1[i];
sakthipriya 0:7b4c00e3912f 95 }
gkumar 8:aad4f22221b1 96
gkumar 8:aad4f22221b1 97 if(alarmmode==0)
gkumar 8:aad4f22221b1 98 {
gkumar 8:aad4f22221b1 99 controlmode=0;
gkumar 8:aad4f22221b1 100 controlmodes(moment,b1,db1,omega1,controlmode,MmntMax);
gkumar 8:aad4f22221b1 101 for (i=0;i<3;i++)
gkumar 8:aad4f22221b1 102 {
gkumar 8:aad4f22221b1 103 b1[i]=b1_copy[i];
gkumar 8:aad4f22221b1 104 db1[i]=db1_copy[i];
gkumar 8:aad4f22221b1 105 omega1[i]=omega1_copy[i];
gkumar 8:aad4f22221b1 106 }
gkumar 8:aad4f22221b1 107 if(max_array(moment)>MmntMax)
gkumar 8:aad4f22221b1 108 {
gkumar 8:aad4f22221b1 109 controlmode=1;
gkumar 8:aad4f22221b1 110 controlmodes(moment,b1,db1,omega1,controlmode,MmntMax);
gkumar 8:aad4f22221b1 111 for (i=0;i<3;i++)
gkumar 8:aad4f22221b1 112 {
gkumar 8:aad4f22221b1 113 b1[i]=b1_copy[i];
gkumar 8:aad4f22221b1 114 db1[i]=db1_copy[i];
gkumar 8:aad4f22221b1 115 omega1[i]=omega1_copy[i];
gkumar 8:aad4f22221b1 116 }
gkumar 8:aad4f22221b1 117 if(max_array(moment)>MmntMax)
gkumar 8:aad4f22221b1 118 {
gkumar 8:aad4f22221b1 119 normalising_fact=max_array(moment)/MmntMax;
gkumar 8:aad4f22221b1 120 for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 121 {
gkumar 8:aad4f22221b1 122 moment[i]/=normalising_fact; // Unit: Ampere*Meter^2
gkumar 8:aad4f22221b1 123 }
gkumar 8:aad4f22221b1 124 }
gkumar 8:aad4f22221b1 125 }
gkumar 8:aad4f22221b1 126 }
gkumar 8:aad4f22221b1 127 else
gkumar 8:aad4f22221b1 128 {
gkumar 8:aad4f22221b1 129 controlmode=1;
gkumar 8:aad4f22221b1 130 controlmodes(moment,b1,db1,omega1,controlmode,MmntMax);
gkumar 8:aad4f22221b1 131 for (i=0;i<3;i++)
gkumar 8:aad4f22221b1 132 {
gkumar 8:aad4f22221b1 133 b1[i]=b1_copy[i];
gkumar 8:aad4f22221b1 134 db1[i]=db1_copy[i];
gkumar 8:aad4f22221b1 135 omega1[i]=omega1_copy[i];
gkumar 8:aad4f22221b1 136 }
gkumar 8:aad4f22221b1 137 if(max_array(moment)>MmntMax)
gkumar 8:aad4f22221b1 138 {
gkumar 8:aad4f22221b1 139 normalising_fact=max_array(moment)/MmntMax;
gkumar 8:aad4f22221b1 140 for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 141 {
gkumar 8:aad4f22221b1 142 moment[i]/=normalising_fact; // Unit: Ampere*Meter^2
gkumar 8:aad4f22221b1 143 }
gkumar 8:aad4f22221b1 144 }
gkumar 8:aad4f22221b1 145
gkumar 8:aad4f22221b1 146 }
gkumar 8:aad4f22221b1 147 for (i=0;i<3;i++)
sakthipriya 0:7b4c00e3912f 148 {
gkumar 8:aad4f22221b1 149 b_old[i]=b1[i];
sakthipriya 0:7b4c00e3912f 150 }
sakthipriya 0:7b4c00e3912f 151 }
gkumar 8:aad4f22221b1 152
gkumar 8:aad4f22221b1 153 void inverse(float mat[3][3],float inv[3][3],int &singularity_flag)
sakthipriya 0:7b4c00e3912f 154 {
sakthipriya 0:7b4c00e3912f 155 int i,j;
sakthipriya 0:7b4c00e3912f 156 float det=0;
sakthipriya 0:7b4c00e3912f 157 for(i=0;i<3;i++)
sakthipriya 0:7b4c00e3912f 158 {
sakthipriya 0:7b4c00e3912f 159 for(j=0;j<3;j++)
gkumar 8:aad4f22221b1 160 {
sakthipriya 0:7b4c00e3912f 161 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]);
gkumar 8:aad4f22221b1 162 }
sakthipriya 0:7b4c00e3912f 163 }
sakthipriya 0:7b4c00e3912f 164 det+=(mat[0][0]*inv[0][0])+(mat[0][1]*inv[1][0])+(mat[0][2]*inv[2][0]);
gkumar 8:aad4f22221b1 165 if (det==0)
gkumar 8:aad4f22221b1 166 {
gkumar 8:aad4f22221b1 167 singularity_flag=1;
gkumar 8:aad4f22221b1 168 }
gkumar 8:aad4f22221b1 169 else
gkumar 8:aad4f22221b1 170 {
gkumar 8:aad4f22221b1 171 singularity_flag=0;
gkumar 8:aad4f22221b1 172 for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 173 {
gkumar 8:aad4f22221b1 174 for(j=0;j<3;j++)
gkumar 8:aad4f22221b1 175 {
gkumar 8:aad4f22221b1 176 inv[i][j]/=det;
gkumar 8:aad4f22221b1 177 }
gkumar 8:aad4f22221b1 178 }
sakthipriya 0:7b4c00e3912f 179 }
sakthipriya 0:7b4c00e3912f 180 }
sakthipriya 0:7b4c00e3912f 181
gkumar 8:aad4f22221b1 182 float max_array(float arr[3])
gkumar 8:aad4f22221b1 183 {
gkumar 8:aad4f22221b1 184 int i;
gkumar 8:aad4f22221b1 185 float temp_max=fabs(arr[0]);
gkumar 8:aad4f22221b1 186 for(i=1;i<3;i++)
gkumar 8:aad4f22221b1 187 {
gkumar 8:aad4f22221b1 188 if(fabs(arr[i])>temp_max)
gkumar 8:aad4f22221b1 189 {
gkumar 8:aad4f22221b1 190 temp_max=fabs(arr[i]);
gkumar 8:aad4f22221b1 191 }
gkumar 8:aad4f22221b1 192 }
gkumar 8:aad4f22221b1 193 return temp_max;
gkumar 8:aad4f22221b1 194 }
gkumar 8:aad4f22221b1 195
gkumar 8:aad4f22221b1 196
gkumar 8:aad4f22221b1 197 void controlmodes(float moment[3], float b[3], float db[3], float omega[3], int controlmode1, float MmntMax)
gkumar 8:aad4f22221b1 198 {
gkumar 8:aad4f22221b1 199 float bb[3]={0,0,0};
gkumar 8:aad4f22221b1 200 float d[3]={0,0,0};
gkumar 8:aad4f22221b1 201 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
gkumar 8:aad4f22221b1 202 float den=0,den2;
gkumar 8:aad4f22221b1 203 float bcopy[3];
gkumar 8:aad4f22221b1 204 int i, j;//temporary variables
gkumar 8:aad4f22221b1 205 float Mu[2],z[2],dv[2],v[2],u[2],tauc[3]={0,0,0},Mmnt[3];//outputs
gkumar 8:aad4f22221b1 206 float invJm[3][3];
gkumar 8:aad4f22221b1 207 float kmu2=0.07,gamma2=1.9e4,kz2=0.4e-2,kmu=0.003,gamma=5.6e4,kz=0.1e-4,kdetumble=2000000;
gkumar 8:aad4f22221b1 208 int singularity_flag=0;
gkumar 8:aad4f22221b1 209
gkumar 8:aad4f22221b1 210 if(controlmode1==0)
gkumar 8:aad4f22221b1 211 {
gkumar 8:aad4f22221b1 212 den=sqrt((b[0]*b[0])+(b[1]*b[1])+(b[2]*b[2]));
gkumar 8:aad4f22221b1 213 den2=(b[0]*db[0])+(b[1]*db[1])+(b[2]*db[2]);
gkumar 8:aad4f22221b1 214 if (den==0)
gkumar 8:aad4f22221b1 215 {
gkumar 8:aad4f22221b1 216 singularity_flag=1;
gkumar 8:aad4f22221b1 217 }
gkumar 8:aad4f22221b1 218 if (singularity_flag==0)
gkumar 8:aad4f22221b1 219 {
gkumar 8:aad4f22221b1 220 for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 221 {
gkumar 8:aad4f22221b1 222 db[i]=((db[i]*den*den)-(b[i]*(den2)))/(pow(den,3)); // Normalized db. Hence the unit is Second^(-1)
gkumar 8:aad4f22221b1 223 }
gkumar 8:aad4f22221b1 224 for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 225 {
gkumar 8:aad4f22221b1 226 b[i]/=den; // Mormalized b. Hence no unit.
gkumar 8:aad4f22221b1 227 }
gkumar 8:aad4f22221b1 228 if(b[2]>0.9 || b[2]<-0.9)
gkumar 8:aad4f22221b1 229 {
gkumar 8:aad4f22221b1 230 kz=kz2;
gkumar 8:aad4f22221b1 231 kmu=kmu2;
gkumar 8:aad4f22221b1 232 gamma=gamma2;
gkumar 8:aad4f22221b1 233 }
gkumar 8:aad4f22221b1 234 for(i=0;i<2;i++)
gkumar 8:aad4f22221b1 235 {
gkumar 8:aad4f22221b1 236 Mu[i]=b[i];
gkumar 8:aad4f22221b1 237 v[i]=-kmu*Mu[i];
gkumar 8:aad4f22221b1 238 dv[i]=-kmu*db[i];
gkumar 8:aad4f22221b1 239 z[i]=db[i]-v[i];
gkumar 8:aad4f22221b1 240 u[i]=-kz*z[i]+dv[i]-(Mu[i]/gamma);
gkumar 8:aad4f22221b1 241 }
gkumar 8:aad4f22221b1 242 inverse(Jm,invJm,singularity_flag);
gkumar 8:aad4f22221b1 243 for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 244 {
gkumar 8:aad4f22221b1 245 for(j=0;j<3;j++)
gkumar 8:aad4f22221b1 246 {
gkumar 8:aad4f22221b1 247 bb[i]+=omega[j]*(omega[(i+1)%3]*Jm[(i+2)%3][j]-omega[(i+2)%3]*Jm[(i+1)%3][j]);
gkumar 8:aad4f22221b1 248 }
gkumar 8:aad4f22221b1 249 }
gkumar 8:aad4f22221b1 250 for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 251 {
gkumar 8:aad4f22221b1 252 for(j=0;j<3;j++)
gkumar 8:aad4f22221b1 253 {
gkumar 8:aad4f22221b1 254 d[i]+=bb[j]*invJm[i][j];
gkumar 8:aad4f22221b1 255 }
gkumar 8:aad4f22221b1 256 }
gkumar 8:aad4f22221b1 257 bb[1]=u[0]-(d[1]*b[2])+(d[2]*b[1])-(omega[1]*db[2])+(omega[2]*db[1]);
gkumar 8:aad4f22221b1 258 bb[2]=u[1]-(d[2]*b[0])+(d[0]*b[2])-(omega[2]*db[0])+(omega[0]*db[2]);
gkumar 8:aad4f22221b1 259 bb[0]=0;
gkumar 8:aad4f22221b1 260 for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 261 {
gkumar 8:aad4f22221b1 262 d[i]=invJm[2][i];
gkumar 8:aad4f22221b1 263 invJm[1][i]=-b[2]*invJm[1][i]+b[1]*d[i];
gkumar 8:aad4f22221b1 264 invJm[2][i]=b[2]*invJm[0][i]-b[0]*d[i];
gkumar 8:aad4f22221b1 265 invJm[0][i]=b[i];
gkumar 8:aad4f22221b1 266 }
gkumar 8:aad4f22221b1 267 inverse(invJm,Jm,singularity_flag);
gkumar 8:aad4f22221b1 268 if (singularity_flag==0)
gkumar 8:aad4f22221b1 269 {
gkumar 8:aad4f22221b1 270 for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 271 {
gkumar 8:aad4f22221b1 272 for(j=0;j<3;j++)
gkumar 8:aad4f22221b1 273 {
gkumar 8:aad4f22221b1 274 tauc[i]+=Jm[i][j]*bb[j]; // Unit: Newton*Meter^2
gkumar 8:aad4f22221b1 275 }
gkumar 8:aad4f22221b1 276 }
gkumar 8:aad4f22221b1 277 for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 278 {
gkumar 8:aad4f22221b1 279 bcopy[i]=b[i]*den;
gkumar 8:aad4f22221b1 280 }
gkumar 8:aad4f22221b1 281 for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 282 {
gkumar 8:aad4f22221b1 283 Mmnt[i]=bcopy[(i+1)%3]*tauc[(i+2)%3]-bcopy[(i+2)%3]*tauc[(i+1)%3];
gkumar 8:aad4f22221b1 284 Mmnt[i]/=(den*den); // Unit: Ampere*Meter^2
gkumar 8:aad4f22221b1 285 }
gkumar 8:aad4f22221b1 286 }
gkumar 8:aad4f22221b1 287 }
gkumar 8:aad4f22221b1 288 if (singularity_flag==1)
gkumar 8:aad4f22221b1 289 {
gkumar 8:aad4f22221b1 290 for (i=0;i<3;i++)
gkumar 8:aad4f22221b1 291 {
gkumar 8:aad4f22221b1 292 Mmnt[i]=2*MmntMax;
gkumar 8:aad4f22221b1 293 }
gkumar 8:aad4f22221b1 294 }
gkumar 8:aad4f22221b1 295 }
gkumar 8:aad4f22221b1 296 else if(controlmode1==1)
gkumar 8:aad4f22221b1 297 {
gkumar 8:aad4f22221b1 298 for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 299 {
gkumar 8:aad4f22221b1 300 Mmnt[i]=-kdetumble*(b[(i+1)%3]*omega[(i+2)%3]-b[(i+2)%3]*omega[(i+1)%3]); // Unit: Ampere*Meter^2
gkumar 8:aad4f22221b1 301 }
gkumar 8:aad4f22221b1 302 }
gkumar 8:aad4f22221b1 303 for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 304 {
gkumar 8:aad4f22221b1 305 moment[i]=Mmnt[i]; // Unit: Ampere*Meter^2
gkumar 8:aad4f22221b1 306 }
gkumar 8:aad4f22221b1 307 }
gkumar 8:aad4f22221b1 308 //void FCTN_ACS_CNTRLALGO(float b[3],float omega[3])
gkumar 8:aad4f22221b1 309 //{
gkumar 8:aad4f22221b1 310 // float db[3];
gkumar 8:aad4f22221b1 311 // float bb[3]={0,0,0};
gkumar 8:aad4f22221b1 312 // float d[3]={0,0,0};
gkumar 8:aad4f22221b1 313 // float Jm[3][3]={{0.2730,0,0},{0,0.3018,0},{0,0,0.3031}};
gkumar 8:aad4f22221b1 314 // float den=0,den2;
gkumar 8:aad4f22221b1 315 // int i,j; //temporary variables
gkumar 8:aad4f22221b1 316 // float Mu[2],z[2],dv[2],v[2],u[2],tauc[3]={0,0,0}; //outputs
gkumar 8:aad4f22221b1 317 // float invJm[3][3];
gkumar 8:aad4f22221b1 318 // float kmu2=0.07,gamma2=1.9e4,kz2=0.4e-2,kmu=0.003,gamma=5.6e4,kz=0.1e-4;
gkumar 8:aad4f22221b1 319 //
gkumar 8:aad4f22221b1 320 // //................. calculating db values...........................
gkumar 8:aad4f22221b1 321 // if(ctrl_count!=0)
gkumar 8:aad4f22221b1 322 // {
gkumar 8:aad4f22221b1 323 // for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 324 // db[i]= (b[i]-bcopy[i])/10;
gkumar 8:aad4f22221b1 325 // }
gkumar 8:aad4f22221b1 326 // else
gkumar 8:aad4f22221b1 327 // {
gkumar 8:aad4f22221b1 328 // for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 329 // db[i]= 0;
gkumar 8:aad4f22221b1 330 // }
gkumar 8:aad4f22221b1 331 // ctrl_count++;
gkumar 8:aad4f22221b1 332 // //..................................................................
gkumar 8:aad4f22221b1 333 // printf("\n\r Entered cntrl algo\n\r");
gkumar 8:aad4f22221b1 334 // for(int i=0; i<3; i++)
gkumar 8:aad4f22221b1 335 // {
gkumar 8:aad4f22221b1 336 // printf("%f\t",omega[i]);
gkumar 8:aad4f22221b1 337 // }
gkumar 8:aad4f22221b1 338 // for(int i=0; i<3; i++)
gkumar 8:aad4f22221b1 339 // {
gkumar 8:aad4f22221b1 340 // printf("%f\t",b[i]);
gkumar 8:aad4f22221b1 341 // }
gkumar 8:aad4f22221b1 342 //
gkumar 8:aad4f22221b1 343 // //.........................algo......................................
gkumar 8:aad4f22221b1 344 // den=sqrt((b[0]*b[0])+(b[1]*b[1])+(b[2]*b[2]));
gkumar 8:aad4f22221b1 345 // den2=(b[0]*db[0])+(b[1]*db[1])+(b[2]*db[2]);
gkumar 8:aad4f22221b1 346 // for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 347 // {
gkumar 8:aad4f22221b1 348 // db[i]=((db[i]*den*den)-(b[i]*(den2)))/(pow(den,3));
gkumar 8:aad4f22221b1 349 // //db[i]/=den*den*den;
gkumar 8:aad4f22221b1 350 // }
gkumar 8:aad4f22221b1 351 // for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 352 // {
gkumar 8:aad4f22221b1 353 // b[i]/=den;
gkumar 8:aad4f22221b1 354 // }
gkumar 8:aad4f22221b1 355 // // select kz, kmu, gamma
gkumar 8:aad4f22221b1 356 // if(b[0]>0.9||b[0]<-0.9)
gkumar 8:aad4f22221b1 357 // {
gkumar 8:aad4f22221b1 358 // kz=kz2;
gkumar 8:aad4f22221b1 359 // kmu=kmu2;
gkumar 8:aad4f22221b1 360 // gamma=gamma2;
gkumar 8:aad4f22221b1 361 // }
gkumar 8:aad4f22221b1 362 // // calculate Mu, v, dv, z, u
gkumar 8:aad4f22221b1 363 // for(i=0;i<2;i++)
gkumar 8:aad4f22221b1 364 // {
gkumar 8:aad4f22221b1 365 // Mu[i]=b[i+1];
gkumar 8:aad4f22221b1 366 // v[i]=-kmu*Mu[i];
gkumar 8:aad4f22221b1 367 // dv[i]=-kmu*db[i+1];
gkumar 8:aad4f22221b1 368 // z[i]=db[i+1]-v[i];
gkumar 8:aad4f22221b1 369 // u[i]=-kz*z[i]+dv[i]-(Mu[i]/gamma);
gkumar 8:aad4f22221b1 370 // }
gkumar 8:aad4f22221b1 371 // inverse(Jm,invJm);
gkumar 8:aad4f22221b1 372 // for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 373 // {
gkumar 8:aad4f22221b1 374 // for(j=0;j<3;j++)
gkumar 8:aad4f22221b1 375 // bb[i]+=omega[j]*(omega[(i+1)%3]*Jm[(i+2)%3][j]-omega[(i+2)%3]*Jm[(i+1)%3][j]);
gkumar 8:aad4f22221b1 376 // }
gkumar 8:aad4f22221b1 377 // for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 378 // {
gkumar 8:aad4f22221b1 379 // for(j=0;j<3;j++)
gkumar 8:aad4f22221b1 380 // d[i]+=bb[j]*invJm[i][j];
gkumar 8:aad4f22221b1 381 // }
gkumar 8:aad4f22221b1 382 // bb[1]=u[0]+(d[0]*b[2])-(d[2]*b[0])-(omega[0]*db[2])+(omega[2]*db[0]);
gkumar 8:aad4f22221b1 383 // bb[2]=u[1]-(d[0]*b[1])+(d[1]*b[0])+(omega[0]*db[1])-(omega[1]*db[0]);
gkumar 8:aad4f22221b1 384 // bb[0]=0;
gkumar 8:aad4f22221b1 385 // for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 386 // {
gkumar 8:aad4f22221b1 387 // d[i]=invJm[1][i];
gkumar 8:aad4f22221b1 388 // invJm[1][i]=b[2]*invJm[0][i]-b[0]*invJm[2][i];
gkumar 8:aad4f22221b1 389 // invJm[2][i]=-b[1]*invJm[0][i]+b[0]*d[i];
gkumar 8:aad4f22221b1 390 // invJm[0][i]=b[i];
gkumar 8:aad4f22221b1 391 // }
gkumar 8:aad4f22221b1 392 // inverse(invJm,Jm);
gkumar 8:aad4f22221b1 393 // printf("\n \r calculating tauc");
gkumar 8:aad4f22221b1 394 // for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 395 // {
gkumar 8:aad4f22221b1 396 // for(j=0;j<3;j++)
gkumar 8:aad4f22221b1 397 // tauc[i]+=Jm[i][j]*bb[j]; // calculating torque values
gkumar 8:aad4f22221b1 398 // printf(" %f \t",tauc[i]);
gkumar 8:aad4f22221b1 399 // }
gkumar 8:aad4f22221b1 400 // //..........................tauc to moment conversion..........................
gkumar 8:aad4f22221b1 401 // printf("\n \r calculating moment");
gkumar 8:aad4f22221b1 402 // for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 403 // bcopy[i]=b[i]*den;
gkumar 8:aad4f22221b1 404 // for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 405 // {
gkumar 8:aad4f22221b1 406 // moment[i]=bcopy[(i+1)%3]*tauc[(i+2)%3]-bcopy[(i+2)%3]*tauc[(i+1)%3];
gkumar 8:aad4f22221b1 407 // moment[i]/=den;
gkumar 8:aad4f22221b1 408 // printf(" %f \t",moment[i]);
gkumar 8:aad4f22221b1 409 // }
gkumar 8:aad4f22221b1 410 // printf("\n\r exited control algo\n");
gkumar 8:aad4f22221b1 411 //}
gkumar 8:aad4f22221b1 412 //..........................function to find inverse..................
gkumar 8:aad4f22221b1 413 //void inverse(float mat[3][3],float inv[3][3])
gkumar 8:aad4f22221b1 414 //{
gkumar 8:aad4f22221b1 415 // int i,j;
gkumar 8:aad4f22221b1 416 // float det=0;
gkumar 8:aad4f22221b1 417 // for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 418 // {
gkumar 8:aad4f22221b1 419 // for(j=0;j<3;j++)
gkumar 8:aad4f22221b1 420 // 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]);
gkumar 8:aad4f22221b1 421 // }
gkumar 8:aad4f22221b1 422 // det+=(mat[0][0]*inv[0][0])+(mat[0][1]*inv[1][0])+(mat[0][2]*inv[2][0]);
gkumar 8:aad4f22221b1 423 // for(i=0;i<3;i++)
gkumar 8:aad4f22221b1 424 // {
gkumar 8:aad4f22221b1 425 // for(j=0;j<3;j++)
gkumar 8:aad4f22221b1 426 // inv[i][j]/=det;
gkumar 8:aad4f22221b1 427 // }
gkumar 8:aad4f22221b1 428 //}
gkumar 8:aad4f22221b1 429
sakthipriya 0:7b4c00e3912f 430
sakthipriya 0:7b4c00e3912f 431 I2C i2c (PTC9,PTC8); //PTC9-sda,PTC8-scl for the attitude sensors and battery gauge
sakthipriya 0:7b4c00e3912f 432
sakthipriya 0:7b4c00e3912f 433 void FCTN_ACS_INIT(void); //initialization of registers happens
sakthipriya 0:7b4c00e3912f 434 void FCTN_ATS_DATA_ACQ(); //data is obtained
sakthipriya 0:7b4c00e3912f 435 void T_OUT(); //timeout function to stop infinite loop
sakthipriya 0:7b4c00e3912f 436 Timeout to; //Timeout variable to
sakthipriya 0:7b4c00e3912f 437 int toFlag;
sakthipriya 0:7b4c00e3912f 438
sakthipriya 0:7b4c00e3912f 439 int count =0; // Time for which the BAE uC is running (in seconds)
sakthipriya 0:7b4c00e3912f 440 void T_OUT()
sakthipriya 0:7b4c00e3912f 441 {
sakthipriya 0:7b4c00e3912f 442 toFlag=0; //as T_OUT function gets called the while loop gets terminated
sakthipriya 0:7b4c00e3912f 443 }
sakthipriya 0:7b4c00e3912f 444
sakthipriya 0:7b4c00e3912f 445
sakthipriya 0:7b4c00e3912f 446 //DEFINING VARIABLES
sakthipriya 0:7b4c00e3912f 447 char cmd[2];
sakthipriya 0:7b4c00e3912f 448 char raw_gyro[6];
sakthipriya 0:7b4c00e3912f 449 char raw_mag[6];
sakthipriya 0:7b4c00e3912f 450 char store,status;
sakthipriya 0:7b4c00e3912f 451 int16_t bit_data;
sakthipriya 0:7b4c00e3912f 452 float gyro_data[3], mag_data[3],combined_values[6];
sakthipriya 0:7b4c00e3912f 453 float senstivity_gyro =6.5536; //senstivity is obtained from 2^15/5000dps
sakthipriya 0:7b4c00e3912f 454 float senstivity_mag =32.768; //senstivity is obtained from 2^15/1000microtesla
sakthipriya 0:7b4c00e3912f 455 float gyro_error[3]= {0,0,0}, mag_error[3]= {0,0,0};
sakthipriya 0:7b4c00e3912f 456
sakthipriya 0:7b4c00e3912f 457 void FCTN_ACS_INIT()
sakthipriya 0:7b4c00e3912f 458 {
Bragadeesh153 9:f66c57a01e05 459
Bragadeesh153 9:f66c57a01e05 460 TRZ_EN = 1;
sakthipriya 0:7b4c00e3912f 461 ACS_INIT_STATUS = 's'; //set ACS_INIT_STATUS flag
sakthipriya 3:07e15677a75c 462 //FLAG();
sakthipriya 0:7b4c00e3912f 463 pc_acs.printf("Attitude sensor init called \n \r");
sakthipriya 0:7b4c00e3912f 464 //FLAG();
sakthipriya 0:7b4c00e3912f 465 cmd[0]=RESETREQ;
sakthipriya 0:7b4c00e3912f 466 cmd[1]=BIT_RESREQ;
sakthipriya 0:7b4c00e3912f 467 i2c.write(SLAVE_ADDR,cmd,2); //When 0x01 is written in reset request register Emulates a hard power down/power up
sakthipriya 0:7b4c00e3912f 468 wait_ms(2000); //waiting for loading configuration file stored in EEPROM
sakthipriya 0:7b4c00e3912f 469 cmd[0]=SENTRALSTATUS;
sakthipriya 0:7b4c00e3912f 470 i2c.write(SLAVE_ADDR,cmd,1);
sakthipriya 0:7b4c00e3912f 471 i2c.read(SLAVE_ADDR_READ,&store,1);
sakthipriya 0:7b4c00e3912f 472 wait_ms(100);
sakthipriya 0:7b4c00e3912f 473 //to check whether EEPROM is uploaded
sakthipriya 0:7b4c00e3912f 474 switch((int)store) {
sakthipriya 0:7b4c00e3912f 475 case(3): {
sakthipriya 0:7b4c00e3912f 476 break;
sakthipriya 0:7b4c00e3912f 477 }
sakthipriya 0:7b4c00e3912f 478 case(11): {
sakthipriya 0:7b4c00e3912f 479 break;
sakthipriya 0:7b4c00e3912f 480 }
sakthipriya 0:7b4c00e3912f 481 default: {
sakthipriya 0:7b4c00e3912f 482 cmd[0]=RESETREQ;
sakthipriya 0:7b4c00e3912f 483 cmd[1]=BIT_RESREQ;
sakthipriya 0:7b4c00e3912f 484 i2c.write(SLAVE_ADDR,cmd,2);
sakthipriya 0:7b4c00e3912f 485 wait_ms(2000);
sakthipriya 0:7b4c00e3912f 486 }
sakthipriya 0:7b4c00e3912f 487 }
sakthipriya 0:7b4c00e3912f 488 pc_acs.printf("Sentral Status is %x\n \r",(int)store);
sakthipriya 0:7b4c00e3912f 489 cmd[0]=HOST_CTRL; //0x01 is written in HOST CONTROL register to enable the sensors
sakthipriya 0:7b4c00e3912f 490 cmd[1]=BIT_RUN_ENB;
sakthipriya 0:7b4c00e3912f 491 i2c.write(SLAVE_ADDR,cmd,2);
sakthipriya 0:7b4c00e3912f 492 wait_ms(100);
sakthipriya 0:7b4c00e3912f 493 cmd[0]=MAGRATE; //Output data rate of 100Hz is used for magnetometer
sakthipriya 0:7b4c00e3912f 494 cmd[1]=BIT_MAGODR;
sakthipriya 0:7b4c00e3912f 495 i2c.write(SLAVE_ADDR,cmd,2);
sakthipriya 0:7b4c00e3912f 496 wait_ms(100);
sakthipriya 0:7b4c00e3912f 497 cmd[0]=GYRORATE; //Output data rate of 150Hz is used for gyroscope
sakthipriya 0:7b4c00e3912f 498 cmd[1]=BIT_GYROODR;
sakthipriya 0:7b4c00e3912f 499 i2c.write(SLAVE_ADDR,cmd,2);
sakthipriya 0:7b4c00e3912f 500 wait_ms(100);
sakthipriya 0:7b4c00e3912f 501 cmd[0]=ALGO_CTRL; //When 0x00 is written to ALGO CONTROL register we get scaled sensor values
sakthipriya 0:7b4c00e3912f 502 cmd[1]=0x00;
sakthipriya 0:7b4c00e3912f 503 i2c.write(SLAVE_ADDR,cmd,2);
sakthipriya 0:7b4c00e3912f 504 wait_ms(100);
sakthipriya 0:7b4c00e3912f 505 cmd[0]=ENB_EVT; //enabling the error,gyro values and magnetometer values
sakthipriya 0:7b4c00e3912f 506 cmd[1]=BIT_EVT_ENB;
sakthipriya 0:7b4c00e3912f 507 i2c.write(SLAVE_ADDR,cmd,2);
sakthipriya 0:7b4c00e3912f 508 wait_ms(100);
sakthipriya 0:7b4c00e3912f 509 ACS_INIT_STATUS = 'c'; //set ACS_INIT_STATUS flag
sakthipriya 0:7b4c00e3912f 510 }
sakthipriya 0:7b4c00e3912f 511
sakthipriya 0:7b4c00e3912f 512 void FCTN_ATS_DATA_ACQ()
sakthipriya 0:7b4c00e3912f 513 {
sakthipriya 0:7b4c00e3912f 514 ACS_DATA_ACQ_STATUS = 's'; //set ACS_DATA_ACQ_STATUS flag for att sens 2
sakthipriya 0:7b4c00e3912f 515 if( ACS_ATS_ENABLE == 'e')
sakthipriya 0:7b4c00e3912f 516 {
sakthipriya 0:7b4c00e3912f 517 FLAG();
sakthipriya 0:7b4c00e3912f 518 pc_acs.printf("attitude sensor execution called \n \r");
sakthipriya 0:7b4c00e3912f 519 toFlag=1; //toFlag is set to 1 so that it enters while loop
sakthipriya 0:7b4c00e3912f 520 to.attach(&T_OUT,2); //after 2 seconds the while loop gets terminated
sakthipriya 0:7b4c00e3912f 521 while(toFlag) {
sakthipriya 0:7b4c00e3912f 522 cmd[0]=EVT_STATUS;
sakthipriya 0:7b4c00e3912f 523 i2c.write(SLAVE_ADDR,cmd,1);
sakthipriya 0:7b4c00e3912f 524 i2c.read(SLAVE_ADDR_READ,&status,1);
sakthipriya 0:7b4c00e3912f 525 wait_ms(100);
sakthipriya 0:7b4c00e3912f 526 pc_acs.printf("Event Status is %x\n \r",(int)status);
sakthipriya 0:7b4c00e3912f 527 //if the 6th and 4th bit are 1 then it implies that gyro and magnetometer values are ready to take
sakthipriya 0:7b4c00e3912f 528 if(((int)status&40)==40) {
sakthipriya 0:7b4c00e3912f 529 cmd[0]=GYRO_XOUT_H; //0x22 gyro LSB of x
sakthipriya 0:7b4c00e3912f 530 i2c.write(SLAVE_ADDR,cmd,1);
sakthipriya 0:7b4c00e3912f 531 i2c.read(SLAVE_ADDR_READ,raw_gyro,6);
sakthipriya 0:7b4c00e3912f 532 cmd[0]=MAG_XOUT_H; //LSB of x
sakthipriya 0:7b4c00e3912f 533 i2c.write(SLAVE_ADDR,cmd,1);
sakthipriya 0:7b4c00e3912f 534 i2c.read(SLAVE_ADDR_READ,raw_mag,6);
sakthipriya 0:7b4c00e3912f 535 // pc_acs.printf("\nGyro Values:\n");
sakthipriya 0:7b4c00e3912f 536 for(int i=0; i<3; i++) {
sakthipriya 0:7b4c00e3912f 537 //concatenating gyro LSB and MSB to get 16 bit signed data values
sakthipriya 0:7b4c00e3912f 538 bit_data= ((int16_t)raw_gyro[2*i+1]<<8)|(int16_t)raw_gyro[2*i];
sakthipriya 0:7b4c00e3912f 539 gyro_data[i]=(float)bit_data;
sakthipriya 0:7b4c00e3912f 540 gyro_data[i]=gyro_data[i]/senstivity_gyro;
sakthipriya 0:7b4c00e3912f 541 gyro_data[i]+=gyro_error[i];
sakthipriya 0:7b4c00e3912f 542 // pc_acs.printf("%f\t",gyro_data[i]);
sakthipriya 0:7b4c00e3912f 543 }
gkumar 8:aad4f22221b1 544 gyro_data[0] = (gyro_data[0] + 1.52) * (3.1415/180);
gkumar 8:aad4f22221b1 545 gyro_data[1] = (gyro_data[1] - 2.44) * (3.1415/180);
gkumar 8:aad4f22221b1 546 gyro_data[2] = (gyro_data[2] - 1.06) * (3.1415/180); // in radians
sakthipriya 0:7b4c00e3912f 547 // pc_acs.printf("\nMag Values:\n");
sakthipriya 0:7b4c00e3912f 548 for(int i=0; i<3; i++) {
sakthipriya 0:7b4c00e3912f 549 //concatenating mag LSB and MSB to get 16 bit signed data values
sakthipriya 0:7b4c00e3912f 550 bit_data= ((int16_t)raw_mag[2*i+1]<<8)|(int16_t)raw_mag[2*i];
sakthipriya 0:7b4c00e3912f 551 mag_data[i]=(float)bit_data;
sakthipriya 0:7b4c00e3912f 552 mag_data[i]=mag_data[i]/senstivity_mag;
sakthipriya 0:7b4c00e3912f 553 mag_data[i]+=mag_error[i];
sakthipriya 0:7b4c00e3912f 554 // pc_acs.printf("%f\t",mag_data[i]);
sakthipriya 0:7b4c00e3912f 555 }
gkumar 8:aad4f22221b1 556 mag_data[0] = ((mag_data[0] - 0.8089)/0.9566)/1000000;
gkumar 8:aad4f22221b1 557 mag_data[1] = ((mag_data[1] + 1.6722)/1.095)/1000000;
gkumar 8:aad4f22221b1 558 mag_data[2] = ((mag_data[2] + 4.7846 )/1.03)/1000000; // in Tesla
sakthipriya 0:7b4c00e3912f 559 for(int i=0; i<3; i++) {
sakthipriya 6:036d08b62785 560 // data[i]=gyro_data[i];
sakthipriya 6:036d08b62785 561 actual_data.AngularSpeed_actual[i] = gyro_data[i];
sakthipriya 6:036d08b62785 562 actual_data.Bvalue_actual[i] = mag_data[i];
sakthipriya 6:036d08b62785 563 //data[i+3]=mag_data[i];
sakthipriya 0:7b4c00e3912f 564 }
sakthipriya 0:7b4c00e3912f 565 // return(combined_values); //returning poiter combined values
sakthipriya 0:7b4c00e3912f 566 }
sakthipriya 0:7b4c00e3912f 567 //checking for the error
sakthipriya 0:7b4c00e3912f 568 else if (((int)status&2)==2) {
sakthipriya 0:7b4c00e3912f 569 FCTN_ACS_INIT(); //when there is any error then Again inilization is done to remove error
sakthipriya 0:7b4c00e3912f 570 }
sakthipriya 0:7b4c00e3912f 571 }
sakthipriya 0:7b4c00e3912f 572 }
sakthipriya 0:7b4c00e3912f 573 else //ACS_DATA_ACQ_STATUS = ACS_DATA_ACQ_FAILURE
sakthipriya 0:7b4c00e3912f 574 {
sakthipriya 0:7b4c00e3912f 575 ACS_DATA_ACQ_STATUS = 'f';
sakthipriya 0:7b4c00e3912f 576 }
sakthipriya 0:7b4c00e3912f 577 ACS_DATA_ACQ_STATUS = 'c'; //clear ACS_DATA_ACQ_STATUS flag for att sens 2
sakthipriya 0:7b4c00e3912f 578 }
sakthipriya 0:7b4c00e3912f 579
sakthipriya 0:7b4c00e3912f 580 void FCTN_ACS_GENPWM_MAIN(float Moment[3])
sakthipriya 0:7b4c00e3912f 581 {
gkumar 8:aad4f22221b1 582 printf("\n\rEntered executable PWMGEN function\n"); // entering the PWMGEN executable function
sakthipriya 0:7b4c00e3912f 583
sakthipriya 0:7b4c00e3912f 584 float l_duty_cycle_x=0; //Duty cycle of Moment in x direction
sakthipriya 0:7b4c00e3912f 585 float l_current_x=0; //Current sent in x TR's
sakthipriya 0:7b4c00e3912f 586 float l_duty_cycle_y=0; //Duty cycle of Moment in y direction
sakthipriya 0:7b4c00e3912f 587 float l_current_y=0; //Current sent in y TR's
sakthipriya 0:7b4c00e3912f 588 float l_duty_cycle_z=0; //Duty cycle of Moment in z direction
sakthipriya 0:7b4c00e3912f 589 float l_current_z=0; //Current sent in z TR's
sakthipriya 0:7b4c00e3912f 590
sakthipriya 0:7b4c00e3912f 591
gkumar 8:aad4f22221b1 592 //for(int i = 0 ; i<3;i++)
sakthipriya 0:7b4c00e3912f 593 {
sakthipriya 0:7b4c00e3912f 594 // printf(" %f \t ",Moment[i]); // taking the moment values from control algorithm as inputs
sakthipriya 0:7b4c00e3912f 595 }
sakthipriya 0:7b4c00e3912f 596
sakthipriya 0:7b4c00e3912f 597 //----------------------------- x-direction TR --------------------------------------------//
sakthipriya 0:7b4c00e3912f 598
sakthipriya 0:7b4c00e3912f 599
sakthipriya 0:7b4c00e3912f 600 float l_moment_x = Moment[0]; //Moment in x direction
sakthipriya 0:7b4c00e3912f 601
sakthipriya 0:7b4c00e3912f 602 phase_TR_x = 1; // setting the default current direction
sakthipriya 0:7b4c00e3912f 603 if (l_moment_x <0)
sakthipriya 0:7b4c00e3912f 604 {
sakthipriya 0:7b4c00e3912f 605 phase_TR_x = 0; // if the moment value is negative, we send the abs value of corresponding current in opposite direction by setting the phase pin high
sakthipriya 0:7b4c00e3912f 606 l_moment_x = abs(l_moment_x);
sakthipriya 0:7b4c00e3912f 607 }
sakthipriya 0:7b4c00e3912f 608
Bragadeesh153 9:f66c57a01e05 609 // l_current_x = l_moment_x * TR_CONSTANT ;
Bragadeesh153 9:f66c57a01e05 610
Bragadeesh153 9:f66c57a01e05 611 l_current_x = 0.153; //Moment and Current always have the linear relationship
sakthipriya 0:7b4c00e3912f 612 pc_acs.printf("current in trx is %f \r \n",l_current_x);
gkumar 8:aad4f22221b1 613 if( l_current_x>0 && l_current_x < 0.0016 ) //Current and Duty cycle have the linear relationship between 1% and 100%
sakthipriya 0:7b4c00e3912f 614 {
gkumar 8:aad4f22221b1 615 l_duty_cycle_x = 3*10000000*pow(l_current_x,3)- 90216*pow(l_current_x,2) + 697.78*l_current_x - 0.0048; // calculating upto 0.1% dutycycle by polynomial interpolation
sakthipriya 0:7b4c00e3912f 616 pc_acs.printf("DC for trx is %f \r \n",l_duty_cycle_x);
sakthipriya 0:7b4c00e3912f 617 PWM1.period(TIME_PERIOD);
sakthipriya 0:7b4c00e3912f 618 PWM1 = l_duty_cycle_x/100 ;
sakthipriya 0:7b4c00e3912f 619 }
gkumar 8:aad4f22221b1 620 else if (l_current_x >= 0.0016 && l_current_x < 0.0171)
sakthipriya 0:7b4c00e3912f 621 {
gkumar 8:aad4f22221b1 622 l_duty_cycle_x = - 76880*pow(l_current_x,3) + 1280.8*pow(l_current_x,2) + 583.78*l_current_x + 0.0281; // calculating upto 10% dutycycle by polynomial interpolation
sakthipriya 0:7b4c00e3912f 623 pc_acs.printf("DC for trx is %f \r \n",l_duty_cycle_x);
sakthipriya 0:7b4c00e3912f 624 PWM1.period(TIME_PERIOD);
sakthipriya 0:7b4c00e3912f 625 PWM1 = l_duty_cycle_x/100 ;
sakthipriya 0:7b4c00e3912f 626 }
gkumar 8:aad4f22221b1 627 else if(l_current_x >= 0.0171 && l_current_x < 0.1678)
sakthipriya 0:7b4c00e3912f 628 {
gkumar 8:aad4f22221b1 629 l_duty_cycle_x = 275.92*pow(l_current_x,2) + 546.13*l_current_x + 0.5316; // calculating upto 100% dutycycle by polynomial interpolation
sakthipriya 0:7b4c00e3912f 630 pc_acs.printf("DC for trx is %f \r \n",l_duty_cycle_x);
sakthipriya 0:7b4c00e3912f 631 PWM1.period(TIME_PERIOD);
sakthipriya 0:7b4c00e3912f 632 PWM1 = l_duty_cycle_x/100 ;
sakthipriya 0:7b4c00e3912f 633 }
sakthipriya 0:7b4c00e3912f 634 else if(l_current_x==0)
sakthipriya 0:7b4c00e3912f 635 {
sakthipriya 0:7b4c00e3912f 636 printf("\n \r l_current_x====0");
sakthipriya 0:7b4c00e3912f 637 l_duty_cycle_x = 0; // default value of duty cycle
sakthipriya 0:7b4c00e3912f 638 pc_acs.printf("DC for trx is %f \r \n",l_duty_cycle_x);
sakthipriya 0:7b4c00e3912f 639 PWM1.period(TIME_PERIOD);
sakthipriya 0:7b4c00e3912f 640 PWM1 = l_duty_cycle_x/100 ;
sakthipriya 0:7b4c00e3912f 641 }
sakthipriya 0:7b4c00e3912f 642 else //not necessary
sakthipriya 0:7b4c00e3912f 643 {
sakthipriya 0:7b4c00e3912f 644 g_err_flag_TR_x = 1;
sakthipriya 0:7b4c00e3912f 645 }
gkumar 8:aad4f22221b1 646
sakthipriya 0:7b4c00e3912f 647
sakthipriya 0:7b4c00e3912f 648 //------------------------------------- y-direction TR--------------------------------------//
sakthipriya 0:7b4c00e3912f 649
sakthipriya 0:7b4c00e3912f 650
gkumar 8:aad4f22221b1 651 float l_moment_y = Moment[1]; //Moment in y direction
sakthipriya 0:7b4c00e3912f 652
sakthipriya 0:7b4c00e3912f 653 phase_TR_y = 1; // setting the default current direction
Bragadeesh153 9:f66c57a01e05 654
Bragadeesh153 9:f66c57a01e05 655
sakthipriya 0:7b4c00e3912f 656 if (l_moment_y <0)
sakthipriya 0:7b4c00e3912f 657 {
sakthipriya 0:7b4c00e3912f 658 phase_TR_y = 0; //if the moment value is negative, we send the abs value of corresponding current in opposite direction by setting the phase pin high
sakthipriya 0:7b4c00e3912f 659 l_moment_y = abs(l_moment_y);
sakthipriya 0:7b4c00e3912f 660 }
sakthipriya 0:7b4c00e3912f 661
sakthipriya 0:7b4c00e3912f 662
Bragadeesh153 9:f66c57a01e05 663 //l_current_y = l_moment_y * TR_CONSTANT ; //Moment and Current always have the linear relationship
Bragadeesh153 9:f66c57a01e05 664
Bragadeesh153 9:f66c57a01e05 665 l_current_y = 0.153;
sakthipriya 0:7b4c00e3912f 666 pc_acs.printf("current in try is %f \r \n",l_current_y);
gkumar 8:aad4f22221b1 667 if( l_current_y>0 && l_current_y < 0.0016 ) //Current and Duty cycle have the linear relationship between 1% and 100%
sakthipriya 0:7b4c00e3912f 668 {
gkumar 8:aad4f22221b1 669 l_duty_cycle_y = 3*10000000*pow(l_current_y,3)- 90216*pow(l_current_y,2) + 697.78*l_current_y - 0.0048; // calculating upto 0.1% dutycycle by polynomial interpolation
sakthipriya 0:7b4c00e3912f 670 pc_acs.printf("DC for try is %f \r \n",l_duty_cycle_y);
sakthipriya 0:7b4c00e3912f 671 PWM2.period(TIME_PERIOD);
sakthipriya 0:7b4c00e3912f 672 PWM2 = l_duty_cycle_y/100 ;
sakthipriya 0:7b4c00e3912f 673 }
gkumar 8:aad4f22221b1 674 else if (l_current_y >= 0.0016 && l_current_y < 0.0171)
sakthipriya 0:7b4c00e3912f 675 {
gkumar 8:aad4f22221b1 676 l_duty_cycle_y = - 76880*pow(l_current_y,3) + 1280.8*pow(l_current_y,2) + 583.78*l_current_y + 0.0281; // calculating upto 10% dutycycle by polynomial interpolation
sakthipriya 0:7b4c00e3912f 677 pc_acs.printf("DC for try is %f \r \n",l_duty_cycle_y);
sakthipriya 0:7b4c00e3912f 678 PWM2.period(TIME_PERIOD);
sakthipriya 0:7b4c00e3912f 679 PWM2 = l_duty_cycle_y/100 ;
sakthipriya 0:7b4c00e3912f 680 }
gkumar 8:aad4f22221b1 681 else if(l_current_y >= 0.0171 && l_current_y < 0.1678)
sakthipriya 0:7b4c00e3912f 682 {
gkumar 8:aad4f22221b1 683 l_duty_cycle_y = 275.92*pow(l_current_y,2) + 546.13*l_current_y + 0.5316; // calculating upto 100% dutycycle by polynomial interpolation
sakthipriya 0:7b4c00e3912f 684 pc_acs.printf("DC for try is %f \r \n",l_duty_cycle_y);
sakthipriya 0:7b4c00e3912f 685 PWM2.period(TIME_PERIOD);
sakthipriya 0:7b4c00e3912f 686 PWM2 = l_duty_cycle_y/100 ;
gkumar 8:aad4f22221b1 687 }
sakthipriya 0:7b4c00e3912f 688 else if(l_current_y==0)
sakthipriya 0:7b4c00e3912f 689 {
sakthipriya 0:7b4c00e3912f 690 printf("\n \r l_current_y====0");
sakthipriya 0:7b4c00e3912f 691 l_duty_cycle_y = 0; // default value of duty cycle
sakthipriya 0:7b4c00e3912f 692 pc_acs.printf("DC for try is %f \r \n",l_duty_cycle_y);
sakthipriya 0:7b4c00e3912f 693 PWM2.period(TIME_PERIOD);
sakthipriya 0:7b4c00e3912f 694 PWM2 = l_duty_cycle_y/100 ;
sakthipriya 0:7b4c00e3912f 695 }
sakthipriya 0:7b4c00e3912f 696 else // not necessary
sakthipriya 0:7b4c00e3912f 697 {
sakthipriya 0:7b4c00e3912f 698 g_err_flag_TR_y = 1;
sakthipriya 0:7b4c00e3912f 699 }
gkumar 8:aad4f22221b1 700
sakthipriya 0:7b4c00e3912f 701 //----------------------------------------------- z-direction TR -------------------------//
sakthipriya 0:7b4c00e3912f 702
sakthipriya 0:7b4c00e3912f 703 float l_moment_z = Moment[2]; //Moment in z direction
sakthipriya 0:7b4c00e3912f 704
sakthipriya 0:7b4c00e3912f 705 phase_TR_z = 1; // setting the default current direction
sakthipriya 0:7b4c00e3912f 706 if (l_moment_z <0)
sakthipriya 0:7b4c00e3912f 707 {
sakthipriya 0:7b4c00e3912f 708 phase_TR_z = 0; //if the moment value is negative, we send the abs value of corresponding current in opposite direction by setting the phase pin high
sakthipriya 0:7b4c00e3912f 709 l_moment_z = abs(l_moment_z);
sakthipriya 0:7b4c00e3912f 710 }
sakthipriya 0:7b4c00e3912f 711
sakthipriya 0:7b4c00e3912f 712
Bragadeesh153 9:f66c57a01e05 713 // l_current_z = l_moment_z * TR_CONSTANT ; //Moment and Current always have the linear relationship
Bragadeesh153 9:f66c57a01e05 714
Bragadeesh153 9:f66c57a01e05 715 l_current_z = 0.153;
sakthipriya 0:7b4c00e3912f 716 pc_acs.printf("current in trz is %f \r \n",l_current_z);
gkumar 8:aad4f22221b1 717 if( l_current_z>0 && l_current_z < 0.0016 ) //Current and Duty cycle have the linear relationship between 1% and 100%
sakthipriya 0:7b4c00e3912f 718 {
gkumar 8:aad4f22221b1 719 l_duty_cycle_z = 3*10000000*pow(l_current_z,3)- 90216*pow(l_current_z,2) + 697.78*l_current_z - 0.0048; // calculating upto 0.1% dutycycle by polynomial interpolation
sakthipriya 0:7b4c00e3912f 720 pc_acs.printf("DC for trz is %f \r \n",l_duty_cycle_z);
sakthipriya 0:7b4c00e3912f 721 PWM3.period(TIME_PERIOD);
sakthipriya 0:7b4c00e3912f 722 PWM3 = l_duty_cycle_z/100 ;
sakthipriya 0:7b4c00e3912f 723 }
gkumar 8:aad4f22221b1 724 else if (l_current_z >= 0.0016 && l_current_z < 0.0171)
sakthipriya 0:7b4c00e3912f 725 {
gkumar 8:aad4f22221b1 726 l_duty_cycle_z = - 76880*pow(l_current_z,3) + 1280.8*pow(l_current_z,2) + 583.78*l_current_z + 0.0281; // calculating upto 10% dutycycle by polynomial interpolation
sakthipriya 0:7b4c00e3912f 727 pc_acs.printf("DC for trz is %f \r \n",l_duty_cycle_z);
sakthipriya 0:7b4c00e3912f 728 PWM3.period(TIME_PERIOD);
sakthipriya 0:7b4c00e3912f 729 PWM3 = l_duty_cycle_z/100 ;
sakthipriya 0:7b4c00e3912f 730 }
gkumar 8:aad4f22221b1 731 else if(l_current_z >= 0.0171 && l_current_z < 0.1678)
sakthipriya 0:7b4c00e3912f 732 {
gkumar 8:aad4f22221b1 733 l_duty_cycle_z = 275.92*pow(l_current_z,2) + 546.13*l_current_z + 0.5316; // calculating upto 100% dutycycle by polynomial interpolation
sakthipriya 0:7b4c00e3912f 734 pc_acs.printf("DC for trz is %f \r \n",l_duty_cycle_z);
sakthipriya 0:7b4c00e3912f 735 PWM3.period(TIME_PERIOD);
sakthipriya 0:7b4c00e3912f 736 PWM3 = l_duty_cycle_z/100 ;
sakthipriya 0:7b4c00e3912f 737 }
sakthipriya 0:7b4c00e3912f 738 else if(l_current_z==0)
sakthipriya 0:7b4c00e3912f 739 {
sakthipriya 0:7b4c00e3912f 740 printf("\n \r l_current_z====0");
sakthipriya 0:7b4c00e3912f 741 l_duty_cycle_z = 0; // default value of duty cycle
sakthipriya 0:7b4c00e3912f 742 pc_acs.printf("DC for trz is %f \r \n",l_duty_cycle_z);
sakthipriya 0:7b4c00e3912f 743 PWM3.period(TIME_PERIOD);
sakthipriya 0:7b4c00e3912f 744 PWM3 = l_duty_cycle_z/100 ;
sakthipriya 0:7b4c00e3912f 745 }
sakthipriya 0:7b4c00e3912f 746 else // not necessary
sakthipriya 0:7b4c00e3912f 747 {
sakthipriya 0:7b4c00e3912f 748 g_err_flag_TR_z = 1;
sakthipriya 0:7b4c00e3912f 749 }
sakthipriya 0:7b4c00e3912f 750
sakthipriya 0:7b4c00e3912f 751 //-----------------------------------------exiting the function-----------------------------------//
sakthipriya 0:7b4c00e3912f 752
sakthipriya 0:7b4c00e3912f 753 printf("\n\rExited executable PWMGEN function\n\r"); // stating the successful exit of TR function
gkumar 8:aad4f22221b1 754
Bragadeesh153 9:f66c57a01e05 755 //PWM1 = 0.95;
Bragadeesh153 9:f66c57a01e05 756 //PWM2 = 0.95;
Bragadeesh153 9:f66c57a01e05 757 //PWM3 = 0.95;
Bragadeesh153 9:f66c57a01e05 758
sakthipriya 0:7b4c00e3912f 759
sakthipriya 0:7b4c00e3912f 760 }
sakthipriya 0:7b4c00e3912f 761
sakthipriya 0:7b4c00e3912f 762