to junhao

Dependencies:   mbed

Committer:
xuzhang
Date:
Thu Mar 08 14:38:32 2018 +0000
Revision:
0:1b13f03ce7eb
synthesis for 10k

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xuzhang 0:1b13f03ce7eb 1 #include "mbed.h"
xuzhang 0:1b13f03ce7eb 2 #include "math.h"
xuzhang 0:1b13f03ce7eb 3 #include "cal.h"
xuzhang 0:1b13f03ce7eb 4
xuzhang 0:1b13f03ce7eb 5 //calcualte |Zx|,Cx, Rx
xuzhang 0:1b13f03ce7eb 6 void cal_Zx (
xuzhang 0:1b13f03ce7eb 7 double z, double a,double f,int type, //input
xuzhang 0:1b13f03ce7eb 8 double Ro,//constant
xuzhang 0:1b13f03ce7eb 9 double *ZxMag, double *Cx, double *Rx//output
xuzhang 0:1b13f03ce7eb 10 )
xuzhang 0:1b13f03ce7eb 11 { //unit&description:
xuzhang 0:1b13f03ce7eb 12 // z ohm, magnitude of impedance of Zx+Ro
xuzhang 0:1b13f03ce7eb 13 // a degree, angle of Zx+Ro. angle is measured at 10kHz
xuzhang 0:1b13f03ce7eb 14 // f Hz, the frequency when measure z and a
xuzhang 0:1b13f03ce7eb 15 // type 1-series or 2-parallel
xuzhang 0:1b13f03ce7eb 16 // Ro ohm, split resistor 33ohm typically
xuzhang 0:1b13f03ce7eb 17 // *ZxMag ohm, magnitude of DUT
xuzhang 0:1b13f03ce7eb 18 // *Cx F, cap of DUT
xuzhang 0:1b13f03ce7eb 19 // *Rx ohm, resistance of DUT
xuzhang 0:1b13f03ce7eb 20 double w=2*M_PI*f;
xuzhang 0:1b13f03ce7eb 21 double arad=a/180*M_PI;
xuzhang 0:1b13f03ce7eb 22
xuzhang 0:1b13f03ce7eb 23 double Rx2=0,Cx2=0;
xuzhang 0:1b13f03ce7eb 24 double Zx=0;
xuzhang 0:1b13f03ce7eb 25
xuzhang 0:1b13f03ce7eb 26 double Re=0,Im=0;
xuzhang 0:1b13f03ce7eb 27 double arad2=0;
xuzhang 0:1b13f03ce7eb 28 double temp;
xuzhang 0:1b13f03ce7eb 29 if (type!=1&&type!=2)
xuzhang 0:1b13f03ce7eb 30 printf("wrong type");
xuzhang 0:1b13f03ce7eb 31 else if(type==1){//series
xuzhang 0:1b13f03ce7eb 32 Rx2=z*cos(arad)-Ro;
xuzhang 0:1b13f03ce7eb 33 Cx2=1/(z*sin(arad)*w);
xuzhang 0:1b13f03ce7eb 34 Zx=sqrt(Rx2*Rx2+(z*sin(arad))*(z*sin(arad)));
xuzhang 0:1b13f03ce7eb 35 }
xuzhang 0:1b13f03ce7eb 36 else{//if type==2 parallel
xuzhang 0:1b13f03ce7eb 37 Re=z*cos(arad)-Ro;//real part of Zx parallel
xuzhang 0:1b13f03ce7eb 38 Im=z*sin(arad);
xuzhang 0:1b13f03ce7eb 39 Zx=sqrt(Re*Re+Im*Im);
xuzhang 0:1b13f03ce7eb 40 arad2=atan2(Im,Re);
xuzhang 0:1b13f03ce7eb 41 Rx2=Zx/cos(arad2);
xuzhang 0:1b13f03ce7eb 42 Cx2=sin(arad2)/(Zx*w);
xuzhang 0:1b13f03ce7eb 43 }
xuzhang 0:1b13f03ce7eb 44 *ZxMag=Zx;
xuzhang 0:1b13f03ce7eb 45 *Cx=Cx2;
xuzhang 0:1b13f03ce7eb 46 *Rx=Rx2;
xuzhang 0:1b13f03ce7eb 47 }
xuzhang 0:1b13f03ce7eb 48
xuzhang 0:1b13f03ce7eb 49 double cal_z(double Vin,double Vo,double Rs)
xuzhang 0:1b13f03ce7eb 50 {
xuzhang 0:1b13f03ce7eb 51 return Vin/Vo*Rs;
xuzhang 0:1b13f03ce7eb 52
xuzhang 0:1b13f03ce7eb 53 }
xuzhang 0:1b13f03ce7eb 54
xuzhang 0:1b13f03ce7eb 55
xuzhang 0:1b13f03ce7eb 56 double pwToAngle(int pw)
xuzhang 0:1b13f03ce7eb 57 { //angle,pw is measured at 10kHz
xuzhang 0:1b13f03ce7eb 58 //10kHz=100us=1e-4s
xuzhang 0:1b13f03ce7eb 59 //unit pw: number of counts, 50us=320counts
xuzhang 0:1b13f03ce7eb 60 // angle degree
xuzhang 0:1b13f03ce7eb 61 //pw id pulse width of level 0
xuzhang 0:1b13f03ce7eb 62 double angle=1;
xuzhang 0:1b13f03ce7eb 63 double temp=0;
xuzhang 0:1b13f03ce7eb 64 if (pw>=320||pw<=480)
xuzhang 0:1b13f03ce7eb 65 {
xuzhang 0:1b13f03ce7eb 66 //angle=(pw-320)/320*180;
xuzhang 0:1b13f03ce7eb 67 temp=(double)pw;//+0.5
xuzhang 0:1b13f03ce7eb 68 angle=temp/16*9-180;
xuzhang 0:1b13f03ce7eb 69 return angle;
xuzhang 0:1b13f03ce7eb 70 }
xuzhang 0:1b13f03ce7eb 71 else if (pw>=160||pw<=320)
xuzhang 0:1b13f03ce7eb 72 {
xuzhang 0:1b13f03ce7eb 73 //angle=(320-pw)/320*180;
xuzhang 0:1b13f03ce7eb 74 temp=(double)pw;//+0.5
xuzhang 0:1b13f03ce7eb 75 angle=180-temp/16*9;
xuzhang 0:1b13f03ce7eb 76 return angle;
xuzhang 0:1b13f03ce7eb 77 }
xuzhang 0:1b13f03ce7eb 78 else //if the pw is in the above range
xuzhang 0:1b13f03ce7eb 79 {//the result angle must be in 0~90
xuzhang 0:1b13f03ce7eb 80 printf ("wrong pw");
xuzhang 0:1b13f03ce7eb 81 return 0;
xuzhang 0:1b13f03ce7eb 82 }
xuzhang 0:1b13f03ce7eb 83 }
xuzhang 0:1b13f03ce7eb 84
xuzhang 0:1b13f03ce7eb 85 int check_angle(double angle)
xuzhang 0:1b13f03ce7eb 86 { //absolute angle must be within (0,90)
xuzhang 0:1b13f03ce7eb 87 //the excat angle of RC is (-90,0)
xuzhang 0:1b13f03ce7eb 88 //0 wrong angle, 1 correct
xuzhang 0:1b13f03ce7eb 89 if (angle>90 || angle <0)
xuzhang 0:1b13f03ce7eb 90 return 0;
xuzhang 0:1b13f03ce7eb 91 else
xuzhang 0:1b13f03ce7eb 92 return 1;
xuzhang 0:1b13f03ce7eb 93 }