Xu ZHANG
/
DEBUG_10K
to junhao
cal.cpp@0:1b13f03ce7eb, 2018-03-08 (annotated)
- Committer:
- xuzhang
- Date:
- Thu Mar 08 14:38:32 2018 +0000
- Revision:
- 0:1b13f03ce7eb
synthesis for 10k
Who changed what in which revision?
User | Revision | Line number | New 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 | } |