if (Flags.MAS) { k_V_f=ADCBUF0<<2; // 4.12 pu 4096=1.0=6V fs=ADCBUF1<<2; // 4.12 pu 4096=1.0=20 Hz thetasinc=__builtin_mulss(Ktheta,fs)>>12; if (Flags.FrontRev) thetas+=thetasinc; else thetas-=thetasinc; sinthetas=SinusTable[thetas>>8]; costhetas=SinusTable[((thetas>>8)+64) & 255]; Vds=k_V_f; Valphas=__builtin_mulss(Vds,costhetas)>>12; Vbetas =__builtin_mulss(Vds,sinthetas)>>12; Vas=Valphas; tmp1=-(Valphas/2); tmp2=(__builtin_mulss(SQRT3_2,Vbetas))>>12; Vbs=tmp1+tmp2; Vcs=tmp1-tmp2; tmp1=(__builtin_mulss(ByEs2,Vas))>>12; PDC1=800+tmp1; tmp1=+(__builtin_mulss(ByEs2,Vbs))>>12; PDC2=800+tmp1; tmp1=(__builtin_mulss(ByEs2,Vcs))>>12; PDC3=800+tmp1; } |
else { // actionneur à plot (MRV linéaire 6/4) k_V_f =ADCBUF0<<1; fs =ADCBUF1; fs=fs*(fs>>4); CaptIR =ADCBUF3; // capteur pour l'autopilotage : > 3V trait noir donc commutation if (CaptIR>512) Flags.CaptIRState=1; else Flags.CaptIRState=0; PDC1=k_V_f; // meme tension pour les 3 phases, mais chacun son tour PDC2=k_V_f; PDC3=k_V_f; if (Flags.MRV_autopilotage) { if (Flags.CaptIRState!=Flags.OldCaptIRState && Flags.CaptIRState) // change d'etat { if (++Sequence>=3) Sequence=0; if (Sequence==0) OVDCON=0x0300; // phase A active only if (Sequence==1) OVDCON=0x0C00; // phase B active only if (Sequence==2) OVDCON=0x3000; // phase C active only } Flags.OldCaptIRState=Flags.CaptIRState; } else { SeqMaxDelay=fs+1; // la vitesse de deroulement des sequences, plus fs est grande plus c'est lent ! // ds le mode MRV, si on appuie sur (TogglesAlim ie PB3) // alors on toggles du mode demo (inversion au bout de 20 pas), vers le mode normal (vitesse unidirectionnelle) if (TogglesAlim!=Flags.OldTogglesAlimState && TogglesAlim) // change d'etat vers appuyé { if (Flags.ModeFrontRev) {Flags.ModeFrontRev=0; BugLED=0;} // allume la LED else { Flags.ModeFrontRev=1; BugLED=1; FrontRearCounter=FrontRearCounterMax; } } Flags.OldTogglesAlimState=TogglesAlim; if (!--SeqDelayCounter) { SeqDelayCounter=SeqMaxDelay; if (Flags.FrontRev) {if (++Sequence>=3) Sequence=0; } else {if (--Sequence<0) Sequence=2; } if (Flags.ModeFrontRev) if (!--FrontRearCounter) { FrontRearCounter=FrontRearCounterMax; if (Flags.FrontRev) Flags.FrontRev=0; // change de direction : recule else Flags.FrontRev=1; // change de direction : avance } if (Sequence==0) OVDCON=0x0300; // phase A active only if (Sequence==1) OVDCON=0x0C00; // phase B active only if (Sequence==2) OVDCON=0x3000; // phase C active only } } } |
Last update : 26/12/2007