Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: Gen.cpp
- Revision:
- 0:68589a6f09af
- Child:
- 1:40a3c90aa02f
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Gen.cpp Thu Feb 25 19:09:43 2016 +0000
@@ -0,0 +1,284 @@
+//---------------------------------------------------------------------------------------------------------------------
+// : 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) {
+ 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++;
+}
+
+//---------------------------------------------------------------------------------------------------------------------
+//---------------------------------------------------------------------------------------------------------------------
+