init
Diff: GenCtrl.cpp
- Revision:
- 2:9cbc61162554
- Parent:
- 1:40a3c90aa02f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GenCtrl.cpp Thu Nov 04 18:02:10 2021 +0000 @@ -0,0 +1,285 @@ +//--------------------------------------------------------------------------------------------------------------------- +// : Headerfile +// Title : Generator module +// Filename : Gen.cpp +// Author : Gert Lauritsen +// Origin Date : 22/05/2015 +// Version : 1.000 +// Compiler : Keil +// Target : +// Notes : None +// +//--------------------------------------------------------------------------------------------------------------------- +//--------------------------------- MODULE REVISION LOG --------------------------------------------------------------- +// +// Date Software Version Initials Description +// 22/05/2015 1.0.0.0 GL Module Created. +// +//--------------------------------------------------------------------------------------------------------------------- +// @file Queue.h +// @brief This module contains the +// @Generator Control +// @Styrer generator vha PWM af rotor strøm +// @Måler Vout, Iout, Irotor, +// +//--------------------------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------------------------------- +//Includes +#include "GenCtrl.h" +//--------------------------------------------------------------------------------------------------------------------- +#define defsoftstartTimeOut 50 +#define MaxStartPWM 192 //(75%) +#define MinStartPWM 25 //Max 10% +#define LowCutPoint 470 +#define IntoSoftStart 10 //[sek] Den tid det går fra den kommer ud af regmode til den går i startup + + +//1,0,4,2,6,7,5,3 +#define AinVout 0 +#define AinCurrmon 1 +#define AinFieldmon 2 + +DigitalOut LED(p20); +//------------------------------------------------------------------------------------------------------------------------------------- +GenCtrl::GenCtrl(PinName PWMSignal,PinName VinSignal,PinName IInSignal,PinName IrotorSignal,GenCallback_type _callback) +{ + RotorPWM=new PwmOut(PWMSignal); + RotorPWM->period_us(100); //Periodetide for PWM 10khz + RotorPWM->pulsewidth(0.75); //Slukke for den i første omgang + softstart=1; //Starter i startupmode + Vin = new mbed::AnalogIn(VinSignal); + Iin = new mbed::AnalogIn(IInSignal); + Irotor = new mbed::AnalogIn(IrotorSignal); + Sampler.attach(this,&GenCtrl::AnalogIn,0.001); //1000hz samples + GeneralTimer.attach(this,&GenCtrl::Timer,1); //1 sek timeTick + callback=_callback; +} + +//------------------------------------------------------------------------------------------------------------------------------------- +//Omregnings functioner: +long PMax2Count(float P) { + return P; +} + +void GenCtrl::NewVout(float Vset) { + //softstart=1; //Starter i startupmode + CalRec.Vset =(Vset*VinGain)/VoltPrCount; +} + +void GenCtrl::SetVCal(float Vset,float Vmax,float StartPower,float RunPower,float RotorMaxCurrent){ + CalRec.Vset =(Vset*VinGain)/VoltPrCount; + CalRec.VMax =(Vmax*VinGain)/VoltPrCount; + CalRec.VmaxRep =3; //3 sek før den går i overvoltage + CalRec.StartPower =StartPower/(VinFromCount*IoutCalFaktor); + CalRec.PWMRotaryBlok=MinStartPWM; //minimal PWM + CalRec.IRotorMax =RotorMaxCurrent/IRotorCalFaktor; + CalRec.Kp =7; + CalRec.RunPower =RunPower/(VinFromCount*IoutCalFaktor); +} + +//------------------------------------------------------------------------------------------------------------------------------------- +// +void GenCtrl::Blink() +{ + static char state; + state=!state; + LED=state; +} + +void GenCtrl::Timer() { +//General timer 1gg/sec + if ((LastRpm<1000) && (!NotInRegArea)) NotInRegArea=1; //Hvis motoren er stoppet + + if ((NotInRegArea) && (!softstart)) { //Timeout på at holde reguleringen + if (NotInRegArea<100) NotInRegArea++; + } + if ((NotInRegArea>IntoSoftStart) && (!softstart)) { //Slår over i softstart efter timeout + if ((LastRpm>1000) || (ADCValue[AinVout]<LowCutPoint)) softstart=1; else softstart=2; + softstartTimeOut=defsoftstartTimeOut; //Softstart er for at få generator stille op. + } + Vout=MessData.Vmon/MessData.Nstak; + if (Vout>CalRec.VMax) { //Vmax nedluk + if (vmaxdone<CalRec.VmaxRep) vmaxdone++; + } //nedluk som følge af fejl + else { + vmaxdone=0; + } + + callback(); +} + +void GenCtrl::AnalogIn() +{ +//Sample Vout, Iout og Irotor bliver kaldt med ca 1khz +static int PRotorCurrent; + + ADCValue[AinVout] = Vin ->read_u16(); + ADCValue[AinCurrmon] = Iin ->read_u16(); + ADCValue[AinFieldmon] = Irotor->read_u16(); + + MessData.Vmon+=ADCValue[AinVout]; + MessData.Iin+=ADCValue[AinCurrmon]; + MessData.Irotor+=ADCValue[AinFieldmon]; + MessData.Nstak++; + RotorCurrent[PRotorCurrent++]=ADCValue[AinFieldmon]; + if (PRotorCurrent>=RotorCurrentAdvLength) PRotorCurrent=0; + + SetNewPwM(); + // Blink(); +} + +void GenCtrl::ResetMessData(void) +{ + MessData.Nstak=0; + MessData.Vmon=0; + MessData.Iin=0; + MessData.Irotor=0; + MessData.loadadvcount=0; + MessData.loadadv=0; + MessData.regadvcount=0; + MessData.regadv=0; +} + +unsigned char GenCtrl::MaxValuePos(void) +{ +//finder max i VinBuff (tager ca 10us) + unsigned char BufPosition,i; + unsigned int MaxValue; + BufPosition=0; + MaxValue=0; + for (i=0; i<VinBuffLength; i++) { + if (VinBuff[i]>MaxValue) { + MaxValue=VinBuff[i]; + BufPosition=i; + } + } + return BufPosition; +} + + +unsigned int GenCtrl::AdvRotorCurrent(void) +{ +//Beregner middelstrømmen +//Denne funktion er den der tager det meste af tiden +//Når denne ændre fra Long til int falder tiden til 50us +//For at dette skal kunne lade sig gøre er længden sat ned til 12 i stedet for 50 + unsigned char Ptail; + unsigned int adv,outvalue; + adv=0; + for (Ptail=0; Ptail<RotorCurrentAdvLength; Ptail++) { + adv+=RotorCurrent[Ptail]; + } + outvalue=adv/RotorCurrentAdvLength; + return outvalue; +} + +//------------------------------------------------------------------------------------------------------------------------------------- +//Regulerings function +//------------------------------------------------------------------------------------------------------------------------------------- + + +void GenCtrl::SetNewPwM (void) +{ + static unsigned int RegValue; + static unsigned int RegError; + static unsigned char PWMOut; + static unsigned int pVinBuff,PRotorCurrent; + + bool NotInRegArea=0; + + + VinBuff[pVinBuff++]=ADCValue[AinVout]; //Vin kægges over... + if (pVinBuff>=VinBuffLength) pVinBuff=0; + + RotorCurrent[PRotorCurrent++]=ADCValue[AinFieldmon]; + if (PRotorCurrent>=RotorCurrentAdvLength-1) PRotorCurrent=0; + + Vmax=VinBuff[MaxValuePos()]; //Max findes + + + if (CalRec.Vset>Vmax) { + RegError=CalRec.Vset-Vmax; + RegValue=RegError*CalRec.Kp; //Det ændre ikke på det om vi bruger shift her + if (RegValue>0xff) RegValue=0xff; //overflow af reguleringsloop + } else RegValue=0; + + if (vmaxdone>=CalRec.VmaxRep) RegValue=0; //AFbryder overspænding vmaxdone inc 1 gang/sek + + if ((AdvRotorCurrent()>CalRec.IRotorMax) && (CalRec.IRotorMax>0)) {//begrænser Irotor + PWMOut=0; //Sluk for strømmen + } + + else { + if (Rotionprotech) { //Sætter en max + if (RegValue>CalRec.PWMRotaryBlok) PWMOut=CalRec.PWMRotaryBlok; + } + if (softstart) { + long PError, Power, RegPower; + Power=(long) Vmax*ADCValue[AinCurrmon]; + + switch (softstart) { + case 1: + RegPower=CalRec.StartPower; //Max effekt i opstart + break; + case 2: + RegPower=CalRec.StartPower; + break; + case 3: + RegPower=CalRec.RunPower; //MaxEffekt når vi kører + break; + } + + if (Power<=RegPower) { //Denne del taget 14us + PError=RegPower-Power; + PError>>=10; + if (PError<255) + PWMOut=PError; //Gange med gain der er 1/128 + else + PWMOut=255; + } else + PWMOut=0; + + + if (RegValue<PWMOut) { + PWMOut=RegValue; //Vi går nu ud af softstart + if (softstartTimeOut--==0) softstart=0; + } else + softstartTimeOut=defsoftstartTimeOut; //Softstart er for at få generator stille op. + + if (Rotionprotech) { //Sætter en max i startupmode + if (PWMOut>CalRec.PWMRotaryBlok) PWMOut=CalRec.PWMRotaryBlok; + } + + if (PWMOut>MaxStartPWM) { + switch (softstart) { + case 1: + PWMOut=MaxStartPWM; + break;//Max 75% + case 2: + PWMOut=MinStartPWM; + break; //Max 10% + case 3: + PWMOut=MaxStartPWM; + break; //Max 75% + } + } + } else //hvis ikke startup + PWMOut=RegValue; + + if ((RegValue<0xff) & (ADCValue[AinVout]>LowCutPoint)) { //er indenfor reg slå softstart fra + NotInRegArea=0; + } + } + if ((NotInRegArea==0) && (RegValue>=0xff)) NotInRegArea=1; //Vi er udenfor regområde + RotorPWM->write((float) PWMOut/255); //Sætter pwm på pin + MessData.regadv+=RegValue; + MessData.regadvcount++; + + MessData.loadadv=PWMOut; + MessData.loadadvcount++; +} + +//--------------------------------------------------------------------------------------------------------------------- +//--------------------------------------------------------------------------------------------------------------------- +