init

Committer:
gert_lauritsen
Date:
Thu Feb 25 19:09:43 2016 +0000
Revision:
0:68589a6f09af
Child:
1:40a3c90aa02f
Generator ctrl

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 0:68589a6f09af 66 CalRec.Vset =(Vset*VinGain)/VoltPrCount;
gert_lauritsen 0:68589a6f09af 67 }
gert_lauritsen 0:68589a6f09af 68
gert_lauritsen 0:68589a6f09af 69 void GenCtrl::SetVCal(float Vset,float Vmax,float StartPower,float RunPower,float RotorMaxCurrent){
gert_lauritsen 0:68589a6f09af 70 CalRec.Vset =(Vset*VinGain)/VoltPrCount;
gert_lauritsen 0:68589a6f09af 71 CalRec.VMax =(Vmax*VinGain)/VoltPrCount;
gert_lauritsen 0:68589a6f09af 72 CalRec.VmaxRep =3; //3 sek før den går i overvoltage
gert_lauritsen 0:68589a6f09af 73 CalRec.StartPower =StartPower/(VinFromCount*IoutCalFaktor);
gert_lauritsen 0:68589a6f09af 74 CalRec.PWMRotaryBlok=MinStartPWM; //minimal PWM
gert_lauritsen 0:68589a6f09af 75 CalRec.IRotorMax =RotorMaxCurrent/IRotorCalFaktor;
gert_lauritsen 0:68589a6f09af 76 CalRec.Kp =7;
gert_lauritsen 0:68589a6f09af 77 CalRec.RunPower =RunPower/(VinFromCount*IoutCalFaktor);
gert_lauritsen 0:68589a6f09af 78 }
gert_lauritsen 0:68589a6f09af 79
gert_lauritsen 0:68589a6f09af 80 //-------------------------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 81 //
gert_lauritsen 0:68589a6f09af 82 void GenCtrl::Blink()
gert_lauritsen 0:68589a6f09af 83 {
gert_lauritsen 0:68589a6f09af 84 static char state;
gert_lauritsen 0:68589a6f09af 85 state=!state;
gert_lauritsen 0:68589a6f09af 86 LED=state;
gert_lauritsen 0:68589a6f09af 87 }
gert_lauritsen 0:68589a6f09af 88
gert_lauritsen 0:68589a6f09af 89 void GenCtrl::Timer() {
gert_lauritsen 0:68589a6f09af 90 //General timer 1gg/sec
gert_lauritsen 0:68589a6f09af 91 if ((LastRpm<1000) && (!NotInRegArea)) NotInRegArea=1; //Hvis motoren er stoppet
gert_lauritsen 0:68589a6f09af 92
gert_lauritsen 0:68589a6f09af 93 if ((NotInRegArea) && (!softstart)) { //Timeout på at holde reguleringen
gert_lauritsen 0:68589a6f09af 94 if (NotInRegArea<100) NotInRegArea++;
gert_lauritsen 0:68589a6f09af 95 }
gert_lauritsen 0:68589a6f09af 96 if ((NotInRegArea>IntoSoftStart) && (!softstart)) { //Slår over i softstart efter timeout
gert_lauritsen 0:68589a6f09af 97 if ((LastRpm>1000) || (ADCValue[AinVout]<LowCutPoint)) softstart=1; else softstart=2;
gert_lauritsen 0:68589a6f09af 98 softstartTimeOut=defsoftstartTimeOut; //Softstart er for at få generator stille op.
gert_lauritsen 0:68589a6f09af 99 }
gert_lauritsen 0:68589a6f09af 100 Vout=MessData.Vmon/MessData.Nstak;
gert_lauritsen 0:68589a6f09af 101 if (Vout>CalRec.VMax) { //Vmax nedluk
gert_lauritsen 0:68589a6f09af 102 if (vmaxdone<CalRec.VmaxRep) vmaxdone++;
gert_lauritsen 0:68589a6f09af 103 } //nedluk som følge af fejl
gert_lauritsen 0:68589a6f09af 104 else {
gert_lauritsen 0:68589a6f09af 105 vmaxdone=0;
gert_lauritsen 0:68589a6f09af 106 }
gert_lauritsen 0:68589a6f09af 107
gert_lauritsen 0:68589a6f09af 108 callback();
gert_lauritsen 0:68589a6f09af 109 }
gert_lauritsen 0:68589a6f09af 110
gert_lauritsen 0:68589a6f09af 111 void GenCtrl::AnalogIn()
gert_lauritsen 0:68589a6f09af 112 {
gert_lauritsen 0:68589a6f09af 113 //Sample Vout, Iout og Irotor bliver kaldt med ca 1khz
gert_lauritsen 0:68589a6f09af 114 static int PRotorCurrent;
gert_lauritsen 0:68589a6f09af 115
gert_lauritsen 0:68589a6f09af 116 ADCValue[AinVout] = Vin ->read_u16();
gert_lauritsen 0:68589a6f09af 117 ADCValue[AinCurrmon] = Iin ->read_u16();
gert_lauritsen 0:68589a6f09af 118 ADCValue[AinFieldmon] = Irotor->read_u16();
gert_lauritsen 0:68589a6f09af 119
gert_lauritsen 0:68589a6f09af 120 MessData.Vmon+=ADCValue[AinVout];
gert_lauritsen 0:68589a6f09af 121 MessData.Iin+=ADCValue[AinCurrmon];
gert_lauritsen 0:68589a6f09af 122 MessData.Irotor+=ADCValue[AinFieldmon];
gert_lauritsen 0:68589a6f09af 123 MessData.Nstak++;
gert_lauritsen 0:68589a6f09af 124 RotorCurrent[PRotorCurrent++]=ADCValue[AinFieldmon];
gert_lauritsen 0:68589a6f09af 125 if (PRotorCurrent>=RotorCurrentAdvLength) PRotorCurrent=0;
gert_lauritsen 0:68589a6f09af 126
gert_lauritsen 0:68589a6f09af 127 SetNewPwM();
gert_lauritsen 0:68589a6f09af 128 // Blink();
gert_lauritsen 0:68589a6f09af 129 }
gert_lauritsen 0:68589a6f09af 130
gert_lauritsen 0:68589a6f09af 131 void GenCtrl::ResetMessData(void)
gert_lauritsen 0:68589a6f09af 132 {
gert_lauritsen 0:68589a6f09af 133 MessData.Nstak=0;
gert_lauritsen 0:68589a6f09af 134 MessData.Vmon=0;
gert_lauritsen 0:68589a6f09af 135 MessData.Iin=0;
gert_lauritsen 0:68589a6f09af 136 MessData.Irotor=0;
gert_lauritsen 0:68589a6f09af 137 MessData.loadadvcount=0;
gert_lauritsen 0:68589a6f09af 138 MessData.loadadv=0;
gert_lauritsen 0:68589a6f09af 139 MessData.regadvcount=0;
gert_lauritsen 0:68589a6f09af 140 MessData.regadv=0;
gert_lauritsen 0:68589a6f09af 141 }
gert_lauritsen 0:68589a6f09af 142
gert_lauritsen 0:68589a6f09af 143 unsigned char GenCtrl::MaxValuePos(void)
gert_lauritsen 0:68589a6f09af 144 {
gert_lauritsen 0:68589a6f09af 145 //finder max i VinBuff (tager ca 10us)
gert_lauritsen 0:68589a6f09af 146 unsigned char BufPosition,i;
gert_lauritsen 0:68589a6f09af 147 unsigned int MaxValue;
gert_lauritsen 0:68589a6f09af 148 BufPosition=0;
gert_lauritsen 0:68589a6f09af 149 MaxValue=0;
gert_lauritsen 0:68589a6f09af 150 for (i=0; i<VinBuffLength; i++) {
gert_lauritsen 0:68589a6f09af 151 if (VinBuff[i]>MaxValue) {
gert_lauritsen 0:68589a6f09af 152 MaxValue=VinBuff[i];
gert_lauritsen 0:68589a6f09af 153 BufPosition=i;
gert_lauritsen 0:68589a6f09af 154 }
gert_lauritsen 0:68589a6f09af 155 }
gert_lauritsen 0:68589a6f09af 156 return BufPosition;
gert_lauritsen 0:68589a6f09af 157 }
gert_lauritsen 0:68589a6f09af 158
gert_lauritsen 0:68589a6f09af 159
gert_lauritsen 0:68589a6f09af 160 unsigned int GenCtrl::AdvRotorCurrent(void)
gert_lauritsen 0:68589a6f09af 161 {
gert_lauritsen 0:68589a6f09af 162 //Beregner middelstrømmen
gert_lauritsen 0:68589a6f09af 163 //Denne funktion er den der tager det meste af tiden
gert_lauritsen 0:68589a6f09af 164 //Når denne ændre fra Long til int falder tiden til 50us
gert_lauritsen 0:68589a6f09af 165 //For at dette skal kunne lade sig gøre er længden sat ned til 12 i stedet for 50
gert_lauritsen 0:68589a6f09af 166 unsigned char Ptail;
gert_lauritsen 0:68589a6f09af 167 unsigned int adv,outvalue;
gert_lauritsen 0:68589a6f09af 168 adv=0;
gert_lauritsen 0:68589a6f09af 169 for (Ptail=0; Ptail<RotorCurrentAdvLength; Ptail++) {
gert_lauritsen 0:68589a6f09af 170 adv+=RotorCurrent[Ptail];
gert_lauritsen 0:68589a6f09af 171 }
gert_lauritsen 0:68589a6f09af 172 outvalue=adv/RotorCurrentAdvLength;
gert_lauritsen 0:68589a6f09af 173 return outvalue;
gert_lauritsen 0:68589a6f09af 174 }
gert_lauritsen 0:68589a6f09af 175
gert_lauritsen 0:68589a6f09af 176 //-------------------------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 177 //Regulerings function
gert_lauritsen 0:68589a6f09af 178 //-------------------------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 179
gert_lauritsen 0:68589a6f09af 180
gert_lauritsen 0:68589a6f09af 181 void GenCtrl::SetNewPwM (void)
gert_lauritsen 0:68589a6f09af 182 {
gert_lauritsen 0:68589a6f09af 183 static unsigned int RegValue;
gert_lauritsen 0:68589a6f09af 184 static unsigned int RegError;
gert_lauritsen 0:68589a6f09af 185 static unsigned char PWMOut;
gert_lauritsen 0:68589a6f09af 186 static unsigned int pVinBuff,PRotorCurrent;
gert_lauritsen 0:68589a6f09af 187
gert_lauritsen 0:68589a6f09af 188 bool NotInRegArea=0;
gert_lauritsen 0:68589a6f09af 189
gert_lauritsen 0:68589a6f09af 190
gert_lauritsen 0:68589a6f09af 191 VinBuff[pVinBuff++]=ADCValue[AinVout]; //Vin kægges over...
gert_lauritsen 0:68589a6f09af 192 if (pVinBuff>=VinBuffLength) pVinBuff=0;
gert_lauritsen 0:68589a6f09af 193
gert_lauritsen 0:68589a6f09af 194 RotorCurrent[PRotorCurrent++]=ADCValue[AinFieldmon];
gert_lauritsen 0:68589a6f09af 195 if (PRotorCurrent>=RotorCurrentAdvLength-1) PRotorCurrent=0;
gert_lauritsen 0:68589a6f09af 196
gert_lauritsen 0:68589a6f09af 197 Vmax=VinBuff[MaxValuePos()]; //Max findes
gert_lauritsen 0:68589a6f09af 198
gert_lauritsen 0:68589a6f09af 199
gert_lauritsen 0:68589a6f09af 200 if (CalRec.Vset>Vmax) {
gert_lauritsen 0:68589a6f09af 201 RegError=CalRec.Vset-Vmax;
gert_lauritsen 0:68589a6f09af 202 RegValue=RegError*CalRec.Kp; //Det ændre ikke på det om vi bruger shift her
gert_lauritsen 0:68589a6f09af 203 if (RegValue>0xff) RegValue=0xff; //overflow af reguleringsloop
gert_lauritsen 0:68589a6f09af 204 } else RegValue=0;
gert_lauritsen 0:68589a6f09af 205
gert_lauritsen 0:68589a6f09af 206 if (vmaxdone>=CalRec.VmaxRep) RegValue=0; //AFbryder overspænding vmaxdone inc 1 gang/sek
gert_lauritsen 0:68589a6f09af 207
gert_lauritsen 0:68589a6f09af 208 if ((AdvRotorCurrent()>CalRec.IRotorMax) && (CalRec.IRotorMax>0)) {//begrænser Irotor
gert_lauritsen 0:68589a6f09af 209 PWMOut=0; //Sluk for strømmen
gert_lauritsen 0:68589a6f09af 210 }
gert_lauritsen 0:68589a6f09af 211
gert_lauritsen 0:68589a6f09af 212 else {
gert_lauritsen 0:68589a6f09af 213 if (Rotionprotech) { //Sætter en max
gert_lauritsen 0:68589a6f09af 214 if (RegValue>CalRec.PWMRotaryBlok) PWMOut=CalRec.PWMRotaryBlok;
gert_lauritsen 0:68589a6f09af 215 }
gert_lauritsen 0:68589a6f09af 216 if (softstart) {
gert_lauritsen 0:68589a6f09af 217 long PError, Power, RegPower;
gert_lauritsen 0:68589a6f09af 218 Power=(long) Vmax*ADCValue[AinCurrmon];
gert_lauritsen 0:68589a6f09af 219
gert_lauritsen 0:68589a6f09af 220 switch (softstart) {
gert_lauritsen 0:68589a6f09af 221 case 1:
gert_lauritsen 0:68589a6f09af 222 RegPower=CalRec.StartPower; //Max effekt i opstart
gert_lauritsen 0:68589a6f09af 223 break;
gert_lauritsen 0:68589a6f09af 224 case 2:
gert_lauritsen 0:68589a6f09af 225 RegPower=CalRec.StartPower;
gert_lauritsen 0:68589a6f09af 226 break;
gert_lauritsen 0:68589a6f09af 227 case 3:
gert_lauritsen 0:68589a6f09af 228 RegPower=CalRec.RunPower; //MaxEffekt når vi kører
gert_lauritsen 0:68589a6f09af 229 break;
gert_lauritsen 0:68589a6f09af 230 }
gert_lauritsen 0:68589a6f09af 231
gert_lauritsen 0:68589a6f09af 232 if (Power<=RegPower) { //Denne del taget 14us
gert_lauritsen 0:68589a6f09af 233 PError=RegPower-Power;
gert_lauritsen 0:68589a6f09af 234 PError>>=10;
gert_lauritsen 0:68589a6f09af 235 if (PError<255)
gert_lauritsen 0:68589a6f09af 236 PWMOut=PError; //Gange med gain der er 1/128
gert_lauritsen 0:68589a6f09af 237 else
gert_lauritsen 0:68589a6f09af 238 PWMOut=255;
gert_lauritsen 0:68589a6f09af 239 } else
gert_lauritsen 0:68589a6f09af 240 PWMOut=0;
gert_lauritsen 0:68589a6f09af 241
gert_lauritsen 0:68589a6f09af 242
gert_lauritsen 0:68589a6f09af 243 if (RegValue<PWMOut) {
gert_lauritsen 0:68589a6f09af 244 PWMOut=RegValue; //Vi går nu ud af softstart
gert_lauritsen 0:68589a6f09af 245 if (softstartTimeOut--==0) softstart=0;
gert_lauritsen 0:68589a6f09af 246 } else
gert_lauritsen 0:68589a6f09af 247 softstartTimeOut=defsoftstartTimeOut; //Softstart er for at få generator stille op.
gert_lauritsen 0:68589a6f09af 248
gert_lauritsen 0:68589a6f09af 249 if (Rotionprotech) { //Sætter en max i startupmode
gert_lauritsen 0:68589a6f09af 250 if (PWMOut>CalRec.PWMRotaryBlok) PWMOut=CalRec.PWMRotaryBlok;
gert_lauritsen 0:68589a6f09af 251 }
gert_lauritsen 0:68589a6f09af 252
gert_lauritsen 0:68589a6f09af 253 if (PWMOut>MaxStartPWM) {
gert_lauritsen 0:68589a6f09af 254 switch (softstart) {
gert_lauritsen 0:68589a6f09af 255 case 1:
gert_lauritsen 0:68589a6f09af 256 PWMOut=MaxStartPWM;
gert_lauritsen 0:68589a6f09af 257 break;//Max 75%
gert_lauritsen 0:68589a6f09af 258 case 2:
gert_lauritsen 0:68589a6f09af 259 PWMOut=MinStartPWM;
gert_lauritsen 0:68589a6f09af 260 break; //Max 10%
gert_lauritsen 0:68589a6f09af 261 case 3:
gert_lauritsen 0:68589a6f09af 262 PWMOut=MaxStartPWM;
gert_lauritsen 0:68589a6f09af 263 break; //Max 75%
gert_lauritsen 0:68589a6f09af 264 }
gert_lauritsen 0:68589a6f09af 265 }
gert_lauritsen 0:68589a6f09af 266 } else //hvis ikke startup
gert_lauritsen 0:68589a6f09af 267 PWMOut=RegValue;
gert_lauritsen 0:68589a6f09af 268
gert_lauritsen 0:68589a6f09af 269 if ((RegValue<0xff) & (ADCValue[AinVout]>LowCutPoint)) { //er indenfor reg slå softstart fra
gert_lauritsen 0:68589a6f09af 270 NotInRegArea=0;
gert_lauritsen 0:68589a6f09af 271 }
gert_lauritsen 0:68589a6f09af 272 }
gert_lauritsen 0:68589a6f09af 273 if ((NotInRegArea==0) && (RegValue>=0xff)) NotInRegArea=1; //Vi er udenfor regområde
gert_lauritsen 0:68589a6f09af 274 RotorPWM->write((float) PWMOut/255); //Sætter pwm på pin
gert_lauritsen 0:68589a6f09af 275 MessData.regadv+=RegValue;
gert_lauritsen 0:68589a6f09af 276 MessData.regadvcount++;
gert_lauritsen 0:68589a6f09af 277
gert_lauritsen 0:68589a6f09af 278 MessData.loadadv=PWMOut;
gert_lauritsen 0:68589a6f09af 279 MessData.loadadvcount++;
gert_lauritsen 0:68589a6f09af 280 }
gert_lauritsen 0:68589a6f09af 281
gert_lauritsen 0:68589a6f09af 282 //---------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 283 //---------------------------------------------------------------------------------------------------------------------
gert_lauritsen 0:68589a6f09af 284