init

Files at this revision

API Documentation at this revision

Comitter:
gert_lauritsen
Date:
Thu Nov 04 18:02:10 2021 +0000
Parent:
1:40a3c90aa02f
Commit message:
pub

Changed in this revision

Gen.cpp Show diff for this revision Revisions of this file
GenCtrl.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/Gen.cpp	Fri Apr 15 12:44:25 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,285 +0,0 @@
-//---------------------------------------------------------------------------------------------------------------------
-//                       :   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++;
-}
-
-//---------------------------------------------------------------------------------------------------------------------
-//---------------------------------------------------------------------------------------------------------------------
-
--- /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++;
+}
+
+//---------------------------------------------------------------------------------------------------------------------
+//---------------------------------------------------------------------------------------------------------------------
+