init

Committer:
gert_lauritsen
Date:
Thu Nov 04 18:02:10 2021 +0000
Revision:
2:9cbc61162554
Parent:
Gen.cpp@1:40a3c90aa02f
pub

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gert_lauritsen 0:68589a6f09af 1 //---------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 2 // : Headerfile
gert_lauritsen 0:68589a6f09af 3 // Title : Generator module
gert_lauritsen 0:68589a6f09af 4 // Filename : Gen.cpp
gert_lauritsen 0:68589a6f09af 5 // Author : Gert Lauritsen
gert_lauritsen 0:68589a6f09af 6 // Origin Date : 22/05/2015
gert_lauritsen 0:68589a6f09af 7 // Version : 1.000
gert_lauritsen 0:68589a6f09af 8 // Compiler : Keil
gert_lauritsen 0:68589a6f09af 9 // Target :
gert_lauritsen 0:68589a6f09af 10 // Notes : None
gert_lauritsen 0:68589a6f09af 11 //
gert_lauritsen 0:68589a6f09af 12 //---------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 13 //--------------------------------- MODULE REVISION LOG ---------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 14 //
gert_lauritsen 0:68589a6f09af 15 // Date Software Version Initials Description
gert_lauritsen 0:68589a6f09af 16 // 22/05/2015 1.0.0.0 GL Module Created.
gert_lauritsen 0:68589a6f09af 17 //
gert_lauritsen 0:68589a6f09af 18 //---------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 19 // @file Queue.h
gert_lauritsen 0:68589a6f09af 20 // @brief This module contains the
gert_lauritsen 0:68589a6f09af 21 // @Generator Control
gert_lauritsen 0:68589a6f09af 22 // @Styrer generator vha PWM af rotor strøm
gert_lauritsen 0:68589a6f09af 23 // @Måler Vout, Iout, Irotor,
gert_lauritsen 0:68589a6f09af 24 //
gert_lauritsen 0:68589a6f09af 25 //---------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 26
gert_lauritsen 0:68589a6f09af 27 //---------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 28 //Includes
gert_lauritsen 0:68589a6f09af 29 #include "GenCtrl.h"
gert_lauritsen 0:68589a6f09af 30 //---------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 31 #define defsoftstartTimeOut 50
gert_lauritsen 0:68589a6f09af 32 #define MaxStartPWM 192 //(75%)
gert_lauritsen 0:68589a6f09af 33 #define MinStartPWM 25 //Max 10%
gert_lauritsen 0:68589a6f09af 34 #define LowCutPoint 470
gert_lauritsen 0:68589a6f09af 35 #define IntoSoftStart 10 //[sek] Den tid det går fra den kommer ud af regmode til den går i startup
gert_lauritsen 0:68589a6f09af 36
gert_lauritsen 0:68589a6f09af 37
gert_lauritsen 0:68589a6f09af 38 //1,0,4,2,6,7,5,3
gert_lauritsen 0:68589a6f09af 39 #define AinVout 0
gert_lauritsen 0:68589a6f09af 40 #define AinCurrmon 1
gert_lauritsen 0:68589a6f09af 41 #define AinFieldmon 2
gert_lauritsen 0:68589a6f09af 42
gert_lauritsen 0:68589a6f09af 43 DigitalOut LED(p20);
gert_lauritsen 0:68589a6f09af 44 //-------------------------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 45 GenCtrl::GenCtrl(PinName PWMSignal,PinName VinSignal,PinName IInSignal,PinName IrotorSignal,GenCallback_type _callback)
gert_lauritsen 0:68589a6f09af 46 {
gert_lauritsen 0:68589a6f09af 47 RotorPWM=new PwmOut(PWMSignal);
gert_lauritsen 0:68589a6f09af 48 RotorPWM->period_us(100); //Periodetide for PWM 10khz
gert_lauritsen 0:68589a6f09af 49 RotorPWM->pulsewidth(0.75); //Slukke for den i første omgang
gert_lauritsen 0:68589a6f09af 50 softstart=1; //Starter i startupmode
gert_lauritsen 0:68589a6f09af 51 Vin = new mbed::AnalogIn(VinSignal);
gert_lauritsen 0:68589a6f09af 52 Iin = new mbed::AnalogIn(IInSignal);
gert_lauritsen 0:68589a6f09af 53 Irotor = new mbed::AnalogIn(IrotorSignal);
gert_lauritsen 0:68589a6f09af 54 Sampler.attach(this,&GenCtrl::AnalogIn,0.001); //1000hz samples
gert_lauritsen 0:68589a6f09af 55 GeneralTimer.attach(this,&GenCtrl::Timer,1); //1 sek timeTick
gert_lauritsen 0:68589a6f09af 56 callback=_callback;
gert_lauritsen 0:68589a6f09af 57 }
gert_lauritsen 0:68589a6f09af 58
gert_lauritsen 0:68589a6f09af 59 //-------------------------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 60 //Omregnings functioner:
gert_lauritsen 0:68589a6f09af 61 long PMax2Count(float P) {
gert_lauritsen 0:68589a6f09af 62 return P;
gert_lauritsen 0:68589a6f09af 63 }
gert_lauritsen 0:68589a6f09af 64
gert_lauritsen 0:68589a6f09af 65 void GenCtrl::NewVout(float Vset) {
gert_lauritsen 1:40a3c90aa02f 66 //softstart=1; //Starter i startupmode
gert_lauritsen 0:68589a6f09af 67 CalRec.Vset =(Vset*VinGain)/VoltPrCount;
gert_lauritsen 0:68589a6f09af 68 }
gert_lauritsen 0:68589a6f09af 69
gert_lauritsen 0:68589a6f09af 70 void GenCtrl::SetVCal(float Vset,float Vmax,float StartPower,float RunPower,float RotorMaxCurrent){
gert_lauritsen 0:68589a6f09af 71 CalRec.Vset =(Vset*VinGain)/VoltPrCount;
gert_lauritsen 0:68589a6f09af 72 CalRec.VMax =(Vmax*VinGain)/VoltPrCount;
gert_lauritsen 0:68589a6f09af 73 CalRec.VmaxRep =3; //3 sek før den går i overvoltage
gert_lauritsen 0:68589a6f09af 74 CalRec.StartPower =StartPower/(VinFromCount*IoutCalFaktor);
gert_lauritsen 0:68589a6f09af 75 CalRec.PWMRotaryBlok=MinStartPWM; //minimal PWM
gert_lauritsen 0:68589a6f09af 76 CalRec.IRotorMax =RotorMaxCurrent/IRotorCalFaktor;
gert_lauritsen 0:68589a6f09af 77 CalRec.Kp =7;
gert_lauritsen 0:68589a6f09af 78 CalRec.RunPower =RunPower/(VinFromCount*IoutCalFaktor);
gert_lauritsen 0:68589a6f09af 79 }
gert_lauritsen 0:68589a6f09af 80
gert_lauritsen 0:68589a6f09af 81 //-------------------------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 82 //
gert_lauritsen 0:68589a6f09af 83 void GenCtrl::Blink()
gert_lauritsen 0:68589a6f09af 84 {
gert_lauritsen 0:68589a6f09af 85 static char state;
gert_lauritsen 0:68589a6f09af 86 state=!state;
gert_lauritsen 0:68589a6f09af 87 LED=state;
gert_lauritsen 0:68589a6f09af 88 }
gert_lauritsen 0:68589a6f09af 89
gert_lauritsen 0:68589a6f09af 90 void GenCtrl::Timer() {
gert_lauritsen 0:68589a6f09af 91 //General timer 1gg/sec
gert_lauritsen 0:68589a6f09af 92 if ((LastRpm<1000) && (!NotInRegArea)) NotInRegArea=1; //Hvis motoren er stoppet
gert_lauritsen 0:68589a6f09af 93
gert_lauritsen 0:68589a6f09af 94 if ((NotInRegArea) && (!softstart)) { //Timeout på at holde reguleringen
gert_lauritsen 0:68589a6f09af 95 if (NotInRegArea<100) NotInRegArea++;
gert_lauritsen 0:68589a6f09af 96 }
gert_lauritsen 0:68589a6f09af 97 if ((NotInRegArea>IntoSoftStart) && (!softstart)) { //Slår over i softstart efter timeout
gert_lauritsen 0:68589a6f09af 98 if ((LastRpm>1000) || (ADCValue[AinVout]<LowCutPoint)) softstart=1; else softstart=2;
gert_lauritsen 0:68589a6f09af 99 softstartTimeOut=defsoftstartTimeOut; //Softstart er for at få generator stille op.
gert_lauritsen 0:68589a6f09af 100 }
gert_lauritsen 0:68589a6f09af 101 Vout=MessData.Vmon/MessData.Nstak;
gert_lauritsen 0:68589a6f09af 102 if (Vout>CalRec.VMax) { //Vmax nedluk
gert_lauritsen 0:68589a6f09af 103 if (vmaxdone<CalRec.VmaxRep) vmaxdone++;
gert_lauritsen 0:68589a6f09af 104 } //nedluk som følge af fejl
gert_lauritsen 0:68589a6f09af 105 else {
gert_lauritsen 0:68589a6f09af 106 vmaxdone=0;
gert_lauritsen 0:68589a6f09af 107 }
gert_lauritsen 0:68589a6f09af 108
gert_lauritsen 0:68589a6f09af 109 callback();
gert_lauritsen 0:68589a6f09af 110 }
gert_lauritsen 0:68589a6f09af 111
gert_lauritsen 0:68589a6f09af 112 void GenCtrl::AnalogIn()
gert_lauritsen 0:68589a6f09af 113 {
gert_lauritsen 0:68589a6f09af 114 //Sample Vout, Iout og Irotor bliver kaldt med ca 1khz
gert_lauritsen 0:68589a6f09af 115 static int PRotorCurrent;
gert_lauritsen 0:68589a6f09af 116
gert_lauritsen 0:68589a6f09af 117 ADCValue[AinVout] = Vin ->read_u16();
gert_lauritsen 0:68589a6f09af 118 ADCValue[AinCurrmon] = Iin ->read_u16();
gert_lauritsen 0:68589a6f09af 119 ADCValue[AinFieldmon] = Irotor->read_u16();
gert_lauritsen 0:68589a6f09af 120
gert_lauritsen 0:68589a6f09af 121 MessData.Vmon+=ADCValue[AinVout];
gert_lauritsen 0:68589a6f09af 122 MessData.Iin+=ADCValue[AinCurrmon];
gert_lauritsen 0:68589a6f09af 123 MessData.Irotor+=ADCValue[AinFieldmon];
gert_lauritsen 0:68589a6f09af 124 MessData.Nstak++;
gert_lauritsen 0:68589a6f09af 125 RotorCurrent[PRotorCurrent++]=ADCValue[AinFieldmon];
gert_lauritsen 0:68589a6f09af 126 if (PRotorCurrent>=RotorCurrentAdvLength) PRotorCurrent=0;
gert_lauritsen 0:68589a6f09af 127
gert_lauritsen 0:68589a6f09af 128 SetNewPwM();
gert_lauritsen 0:68589a6f09af 129 // Blink();
gert_lauritsen 0:68589a6f09af 130 }
gert_lauritsen 0:68589a6f09af 131
gert_lauritsen 0:68589a6f09af 132 void GenCtrl::ResetMessData(void)
gert_lauritsen 0:68589a6f09af 133 {
gert_lauritsen 0:68589a6f09af 134 MessData.Nstak=0;
gert_lauritsen 0:68589a6f09af 135 MessData.Vmon=0;
gert_lauritsen 0:68589a6f09af 136 MessData.Iin=0;
gert_lauritsen 0:68589a6f09af 137 MessData.Irotor=0;
gert_lauritsen 0:68589a6f09af 138 MessData.loadadvcount=0;
gert_lauritsen 0:68589a6f09af 139 MessData.loadadv=0;
gert_lauritsen 0:68589a6f09af 140 MessData.regadvcount=0;
gert_lauritsen 0:68589a6f09af 141 MessData.regadv=0;
gert_lauritsen 0:68589a6f09af 142 }
gert_lauritsen 0:68589a6f09af 143
gert_lauritsen 0:68589a6f09af 144 unsigned char GenCtrl::MaxValuePos(void)
gert_lauritsen 0:68589a6f09af 145 {
gert_lauritsen 0:68589a6f09af 146 //finder max i VinBuff (tager ca 10us)
gert_lauritsen 0:68589a6f09af 147 unsigned char BufPosition,i;
gert_lauritsen 0:68589a6f09af 148 unsigned int MaxValue;
gert_lauritsen 0:68589a6f09af 149 BufPosition=0;
gert_lauritsen 0:68589a6f09af 150 MaxValue=0;
gert_lauritsen 0:68589a6f09af 151 for (i=0; i<VinBuffLength; i++) {
gert_lauritsen 0:68589a6f09af 152 if (VinBuff[i]>MaxValue) {
gert_lauritsen 0:68589a6f09af 153 MaxValue=VinBuff[i];
gert_lauritsen 0:68589a6f09af 154 BufPosition=i;
gert_lauritsen 0:68589a6f09af 155 }
gert_lauritsen 0:68589a6f09af 156 }
gert_lauritsen 0:68589a6f09af 157 return BufPosition;
gert_lauritsen 0:68589a6f09af 158 }
gert_lauritsen 0:68589a6f09af 159
gert_lauritsen 0:68589a6f09af 160
gert_lauritsen 0:68589a6f09af 161 unsigned int GenCtrl::AdvRotorCurrent(void)
gert_lauritsen 0:68589a6f09af 162 {
gert_lauritsen 0:68589a6f09af 163 //Beregner middelstrømmen
gert_lauritsen 0:68589a6f09af 164 //Denne funktion er den der tager det meste af tiden
gert_lauritsen 0:68589a6f09af 165 //Når denne ændre fra Long til int falder tiden til 50us
gert_lauritsen 0:68589a6f09af 166 //For at dette skal kunne lade sig gøre er længden sat ned til 12 i stedet for 50
gert_lauritsen 0:68589a6f09af 167 unsigned char Ptail;
gert_lauritsen 0:68589a6f09af 168 unsigned int adv,outvalue;
gert_lauritsen 0:68589a6f09af 169 adv=0;
gert_lauritsen 0:68589a6f09af 170 for (Ptail=0; Ptail<RotorCurrentAdvLength; Ptail++) {
gert_lauritsen 0:68589a6f09af 171 adv+=RotorCurrent[Ptail];
gert_lauritsen 0:68589a6f09af 172 }
gert_lauritsen 0:68589a6f09af 173 outvalue=adv/RotorCurrentAdvLength;
gert_lauritsen 0:68589a6f09af 174 return outvalue;
gert_lauritsen 0:68589a6f09af 175 }
gert_lauritsen 0:68589a6f09af 176
gert_lauritsen 0:68589a6f09af 177 //-------------------------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 178 //Regulerings function
gert_lauritsen 0:68589a6f09af 179 //-------------------------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 180
gert_lauritsen 0:68589a6f09af 181
gert_lauritsen 0:68589a6f09af 182 void GenCtrl::SetNewPwM (void)
gert_lauritsen 0:68589a6f09af 183 {
gert_lauritsen 0:68589a6f09af 184 static unsigned int RegValue;
gert_lauritsen 0:68589a6f09af 185 static unsigned int RegError;
gert_lauritsen 0:68589a6f09af 186 static unsigned char PWMOut;
gert_lauritsen 0:68589a6f09af 187 static unsigned int pVinBuff,PRotorCurrent;
gert_lauritsen 0:68589a6f09af 188
gert_lauritsen 0:68589a6f09af 189 bool NotInRegArea=0;
gert_lauritsen 0:68589a6f09af 190
gert_lauritsen 0:68589a6f09af 191
gert_lauritsen 0:68589a6f09af 192 VinBuff[pVinBuff++]=ADCValue[AinVout]; //Vin kægges over...
gert_lauritsen 0:68589a6f09af 193 if (pVinBuff>=VinBuffLength) pVinBuff=0;
gert_lauritsen 0:68589a6f09af 194
gert_lauritsen 0:68589a6f09af 195 RotorCurrent[PRotorCurrent++]=ADCValue[AinFieldmon];
gert_lauritsen 0:68589a6f09af 196 if (PRotorCurrent>=RotorCurrentAdvLength-1) PRotorCurrent=0;
gert_lauritsen 0:68589a6f09af 197
gert_lauritsen 0:68589a6f09af 198 Vmax=VinBuff[MaxValuePos()]; //Max findes
gert_lauritsen 0:68589a6f09af 199
gert_lauritsen 0:68589a6f09af 200
gert_lauritsen 0:68589a6f09af 201 if (CalRec.Vset>Vmax) {
gert_lauritsen 0:68589a6f09af 202 RegError=CalRec.Vset-Vmax;
gert_lauritsen 0:68589a6f09af 203 RegValue=RegError*CalRec.Kp; //Det ændre ikke på det om vi bruger shift her
gert_lauritsen 0:68589a6f09af 204 if (RegValue>0xff) RegValue=0xff; //overflow af reguleringsloop
gert_lauritsen 0:68589a6f09af 205 } else RegValue=0;
gert_lauritsen 0:68589a6f09af 206
gert_lauritsen 0:68589a6f09af 207 if (vmaxdone>=CalRec.VmaxRep) RegValue=0; //AFbryder overspænding vmaxdone inc 1 gang/sek
gert_lauritsen 0:68589a6f09af 208
gert_lauritsen 0:68589a6f09af 209 if ((AdvRotorCurrent()>CalRec.IRotorMax) && (CalRec.IRotorMax>0)) {//begrænser Irotor
gert_lauritsen 0:68589a6f09af 210 PWMOut=0; //Sluk for strømmen
gert_lauritsen 0:68589a6f09af 211 }
gert_lauritsen 0:68589a6f09af 212
gert_lauritsen 0:68589a6f09af 213 else {
gert_lauritsen 0:68589a6f09af 214 if (Rotionprotech) { //Sætter en max
gert_lauritsen 0:68589a6f09af 215 if (RegValue>CalRec.PWMRotaryBlok) PWMOut=CalRec.PWMRotaryBlok;
gert_lauritsen 0:68589a6f09af 216 }
gert_lauritsen 0:68589a6f09af 217 if (softstart) {
gert_lauritsen 0:68589a6f09af 218 long PError, Power, RegPower;
gert_lauritsen 0:68589a6f09af 219 Power=(long) Vmax*ADCValue[AinCurrmon];
gert_lauritsen 0:68589a6f09af 220
gert_lauritsen 0:68589a6f09af 221 switch (softstart) {
gert_lauritsen 0:68589a6f09af 222 case 1:
gert_lauritsen 0:68589a6f09af 223 RegPower=CalRec.StartPower; //Max effekt i opstart
gert_lauritsen 0:68589a6f09af 224 break;
gert_lauritsen 0:68589a6f09af 225 case 2:
gert_lauritsen 0:68589a6f09af 226 RegPower=CalRec.StartPower;
gert_lauritsen 0:68589a6f09af 227 break;
gert_lauritsen 0:68589a6f09af 228 case 3:
gert_lauritsen 0:68589a6f09af 229 RegPower=CalRec.RunPower; //MaxEffekt når vi kører
gert_lauritsen 0:68589a6f09af 230 break;
gert_lauritsen 0:68589a6f09af 231 }
gert_lauritsen 0:68589a6f09af 232
gert_lauritsen 0:68589a6f09af 233 if (Power<=RegPower) { //Denne del taget 14us
gert_lauritsen 0:68589a6f09af 234 PError=RegPower-Power;
gert_lauritsen 0:68589a6f09af 235 PError>>=10;
gert_lauritsen 0:68589a6f09af 236 if (PError<255)
gert_lauritsen 0:68589a6f09af 237 PWMOut=PError; //Gange med gain der er 1/128
gert_lauritsen 0:68589a6f09af 238 else
gert_lauritsen 0:68589a6f09af 239 PWMOut=255;
gert_lauritsen 0:68589a6f09af 240 } else
gert_lauritsen 0:68589a6f09af 241 PWMOut=0;
gert_lauritsen 0:68589a6f09af 242
gert_lauritsen 0:68589a6f09af 243
gert_lauritsen 0:68589a6f09af 244 if (RegValue<PWMOut) {
gert_lauritsen 0:68589a6f09af 245 PWMOut=RegValue; //Vi går nu ud af softstart
gert_lauritsen 0:68589a6f09af 246 if (softstartTimeOut--==0) softstart=0;
gert_lauritsen 0:68589a6f09af 247 } else
gert_lauritsen 0:68589a6f09af 248 softstartTimeOut=defsoftstartTimeOut; //Softstart er for at få generator stille op.
gert_lauritsen 0:68589a6f09af 249
gert_lauritsen 0:68589a6f09af 250 if (Rotionprotech) { //Sætter en max i startupmode
gert_lauritsen 0:68589a6f09af 251 if (PWMOut>CalRec.PWMRotaryBlok) PWMOut=CalRec.PWMRotaryBlok;
gert_lauritsen 0:68589a6f09af 252 }
gert_lauritsen 0:68589a6f09af 253
gert_lauritsen 0:68589a6f09af 254 if (PWMOut>MaxStartPWM) {
gert_lauritsen 0:68589a6f09af 255 switch (softstart) {
gert_lauritsen 0:68589a6f09af 256 case 1:
gert_lauritsen 0:68589a6f09af 257 PWMOut=MaxStartPWM;
gert_lauritsen 0:68589a6f09af 258 break;//Max 75%
gert_lauritsen 0:68589a6f09af 259 case 2:
gert_lauritsen 0:68589a6f09af 260 PWMOut=MinStartPWM;
gert_lauritsen 0:68589a6f09af 261 break; //Max 10%
gert_lauritsen 0:68589a6f09af 262 case 3:
gert_lauritsen 0:68589a6f09af 263 PWMOut=MaxStartPWM;
gert_lauritsen 0:68589a6f09af 264 break; //Max 75%
gert_lauritsen 0:68589a6f09af 265 }
gert_lauritsen 0:68589a6f09af 266 }
gert_lauritsen 0:68589a6f09af 267 } else //hvis ikke startup
gert_lauritsen 0:68589a6f09af 268 PWMOut=RegValue;
gert_lauritsen 0:68589a6f09af 269
gert_lauritsen 0:68589a6f09af 270 if ((RegValue<0xff) & (ADCValue[AinVout]>LowCutPoint)) { //er indenfor reg slå softstart fra
gert_lauritsen 0:68589a6f09af 271 NotInRegArea=0;
gert_lauritsen 0:68589a6f09af 272 }
gert_lauritsen 0:68589a6f09af 273 }
gert_lauritsen 0:68589a6f09af 274 if ((NotInRegArea==0) && (RegValue>=0xff)) NotInRegArea=1; //Vi er udenfor regområde
gert_lauritsen 0:68589a6f09af 275 RotorPWM->write((float) PWMOut/255); //Sætter pwm på pin
gert_lauritsen 0:68589a6f09af 276 MessData.regadv+=RegValue;
gert_lauritsen 0:68589a6f09af 277 MessData.regadvcount++;
gert_lauritsen 0:68589a6f09af 278
gert_lauritsen 0:68589a6f09af 279 MessData.loadadv=PWMOut;
gert_lauritsen 0:68589a6f09af 280 MessData.loadadvcount++;
gert_lauritsen 0:68589a6f09af 281 }
gert_lauritsen 0:68589a6f09af 282
gert_lauritsen 0:68589a6f09af 283 //---------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 284 //---------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 285