To be debugged

Dependencies:   FreescaleIAP mbed-rtos mbed

Fork of TFR_BAE_vr1_1_Debug153 by Bragadeesh S

Committer:
gkumar
Date:
Mon Jan 25 17:27:26 2016 +0000
Revision:
8:aad4f22221b1
Parent:
6:036d08b62785
Child:
9:f66c57a01e05
Updated PWM and control algo codes

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