Test

Dependencies:   mbed-dev-OS5_10_4

Committer:
kevman
Date:
Fri Aug 07 07:24:21 2020 +0000
Revision:
0:014fad4dfb9d
Test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 0:014fad4dfb9d 1 /*-------------------------------------------------------------------------------
kevman 0:014fad4dfb9d 2 Programm Name: AdInit.cpp
kevman 0:014fad4dfb9d 3 Version: 1.0
kevman 0:014fad4dfb9d 4 Sprache: C++
kevman 0:014fad4dfb9d 5 Compiler: mbed
kevman 0:014fad4dfb9d 6 Autor: PS
kevman 0:014fad4dfb9d 7 Copyright: PS
kevman 0:014fad4dfb9d 8
kevman 0:014fad4dfb9d 9
kevman 0:014fad4dfb9d 10 Funktion: Init-Funktion für den A/D Wandlerzugriff
kevman 0:014fad4dfb9d 11
kevman 0:014fad4dfb9d 12 30.06.2017:
kevman 0:014fad4dfb9d 13
kevman 0:014fad4dfb9d 14 -------------------------------------------------------------------------------*/
kevman 0:014fad4dfb9d 15 #include "Headers.h"
kevman 0:014fad4dfb9d 16
kevman 0:014fad4dfb9d 17 bool fChnValid[8];
kevman 0:014fad4dfb9d 18
kevman 0:014fad4dfb9d 19
kevman 0:014fad4dfb9d 20 /*-------------------------------------------------------------------------------
kevman 0:014fad4dfb9d 21 Analog-Digital Konverter initialisieren
kevman 0:014fad4dfb9d 22 -------------------------------------------------------------------------------*/
kevman 0:014fad4dfb9d 23 void InitAdValues()
kevman 0:014fad4dfb9d 24 {
kevman 0:014fad4dfb9d 25 int i,j;
kevman 0:014fad4dfb9d 26
kevman 0:014fad4dfb9d 27 AdVal = new (AD_VAL);
kevman 0:014fad4dfb9d 28 for(i=0;i<ANZ_POT*4;i++)
kevman 0:014fad4dfb9d 29 {
kevman 0:014fad4dfb9d 30 g_fARead[i] = false;
kevman 0:014fad4dfb9d 31 MVars.dbAdSum[i] = 0.;
kevman 0:014fad4dfb9d 32 for(j=0;j<16;j++)
kevman 0:014fad4dfb9d 33 {
kevman 0:014fad4dfb9d 34 AdVal->AdResult[i][j] = 0.0;
kevman 0:014fad4dfb9d 35 }
kevman 0:014fad4dfb9d 36 }
kevman 0:014fad4dfb9d 37 for(i=0;i<ANZ_POT*4;i++)
kevman 0:014fad4dfb9d 38 {
kevman 0:014fad4dfb9d 39 for(j=0;j<64;j++)
kevman 0:014fad4dfb9d 40 AdVal->AdRingBuf[i][j] = 0L;
kevman 0:014fad4dfb9d 41 }
kevman 0:014fad4dfb9d 42 g_nAdSetPos = 0;
kevman 0:014fad4dfb9d 43 g_nAdGetPos = 0;
kevman 0:014fad4dfb9d 44 g_nAdCount = 0;
kevman 0:014fad4dfb9d 45
kevman 0:014fad4dfb9d 46 g_nAdResultCount = 0;
kevman 0:014fad4dfb9d 47
kevman 0:014fad4dfb9d 48 AdVal->FKoeff[0] = -0.7128E-3;
kevman 0:014fad4dfb9d 49 AdVal->FKoeff[1] = 0.01879;
kevman 0:014fad4dfb9d 50 AdVal->FKoeff[2] = 0.06321;
kevman 0:014fad4dfb9d 51 AdVal->FKoeff[3] = 0.125;
kevman 0:014fad4dfb9d 52 AdVal->FKoeff[4] = 0.1806;
kevman 0:014fad4dfb9d 53 AdVal->FKoeff[5] = 0.20305;
kevman 0:014fad4dfb9d 54 AdVal->FKoeff[6] = 0.1806;
kevman 0:014fad4dfb9d 55 AdVal->FKoeff[7] = 0.125;
kevman 0:014fad4dfb9d 56 AdVal->FKoeff[8] = 0.06321;
kevman 0:014fad4dfb9d 57 AdVal->FKoeff[9] = 0.01879;
kevman 0:014fad4dfb9d 58 AdVal->FKoeff[10] = -0.7128E-3;
kevman 0:014fad4dfb9d 59
kevman 0:014fad4dfb9d 60 AdVal->nStartFk = 11;
kevman 0:014fad4dfb9d 61 AdVal->nEndeFk = 5;
kevman 0:014fad4dfb9d 62
kevman 0:014fad4dfb9d 63 AdVal->dbUNoiseGainFaktor = 0.1;
kevman 0:014fad4dfb9d 64 AdVal->dbINoiseGainFaktor = 1.0;
kevman 0:014fad4dfb9d 65
kevman 0:014fad4dfb9d 66 MVars.AdConvTime = 0x7F; // Startwert, längste Wandlungszeit ohne Chop Mode 0x80 ist Chopper
kevman 0:014fad4dfb9d 67 }
kevman 0:014fad4dfb9d 68
kevman 0:014fad4dfb9d 69
kevman 0:014fad4dfb9d 70 /*-------------------------------------------------------------------------------
kevman 0:014fad4dfb9d 71 Interrupt für den A/D Wandler einrichten. InterruptIn AdcRdy(PTB10) liegt hier
kevman 0:014fad4dfb9d 72 auf PTB10, muss je nach Hardware angepasst werden
kevman 0:014fad4dfb9d 73 -------------------------------------------------------------------------------*/
kevman 0:014fad4dfb9d 74 int InitSpiAd(void)
kevman 0:014fad4dfb9d 75 {
kevman 0:014fad4dfb9d 76 Adc0Cs = true;
kevman 0:014fad4dfb9d 77 Adc1Cs = true;
kevman 0:014fad4dfb9d 78
kevman 0:014fad4dfb9d 79 AdcRdy0.mode(PullUp);
kevman 0:014fad4dfb9d 80 AdcRdy1.mode(PullUp);
kevman 0:014fad4dfb9d 81
kevman 0:014fad4dfb9d 82 Ad0CsUp();
kevman 0:014fad4dfb9d 83 AdSckUp();
kevman 0:014fad4dfb9d 84 printf("Nach Set Irq's\n");
kevman 0:014fad4dfb9d 85 return(true);
kevman 0:014fad4dfb9d 86 }
kevman 0:014fad4dfb9d 87 /*-------------------------------------------------------------------------------
kevman 0:014fad4dfb9d 88 Interrupt für den A/D Wandler einrichten. InterruptIn AdcRdy(PTB10) liegt hier
kevman 0:014fad4dfb9d 89 auf PTB10, muss je nach Hardware angepasst werden
kevman 0:014fad4dfb9d 90 -------------------------------------------------------------------------------*/
kevman 0:014fad4dfb9d 91 int ConnectIrq(void)
kevman 0:014fad4dfb9d 92 {
kevman 0:014fad4dfb9d 93 AdcRdy0.fall(&Rdy0Fall);
kevman 0:014fad4dfb9d 94 AdcRdy1.fall(&Rdy1Fall);
kevman 0:014fad4dfb9d 95 return(true);
kevman 0:014fad4dfb9d 96 }
kevman 0:014fad4dfb9d 97
kevman 0:014fad4dfb9d 98 /*-------------------------------------------------------------------------------
kevman 0:014fad4dfb9d 99 -------------------------------------------------------------------------------*/
kevman 0:014fad4dfb9d 100 void AdReset()
kevman 0:014fad4dfb9d 101 {
kevman 0:014fad4dfb9d 102 // macht einen kompletten Reset auf den Wandler
kevman 0:014fad4dfb9d 103 DoAdReset();
kevman 0:014fad4dfb9d 104 printf("Nach AdReset CommonWrite Hex 00\n");
kevman 0:014fad4dfb9d 105
kevman 0:014fad4dfb9d 106 wait(2.0);
kevman 0:014fad4dfb9d 107
kevman 0:014fad4dfb9d 108 }
kevman 0:014fad4dfb9d 109 /*-------------------------------------------------------------------------------
kevman 0:014fad4dfb9d 110 Macht einen Reset des A/D Wandlers
kevman 0:014fad4dfb9d 111 -------------------------------------------------------------------------------*/
kevman 0:014fad4dfb9d 112 void DoAdReset()
kevman 0:014fad4dfb9d 113 {
kevman 0:014fad4dfb9d 114 int i;
kevman 0:014fad4dfb9d 115
kevman 0:014fad4dfb9d 116 AdSckUp();
kevman 0:014fad4dfb9d 117 AdMosiDown();
kevman 0:014fad4dfb9d 118 Ad0CsDown();
kevman 0:014fad4dfb9d 119 Ad1CsDown();
kevman 0:014fad4dfb9d 120 short_delay(2);
kevman 0:014fad4dfb9d 121
kevman 0:014fad4dfb9d 122 for(i=0;i<8;i++)
kevman 0:014fad4dfb9d 123 {
kevman 0:014fad4dfb9d 124 AdSckDown();
kevman 0:014fad4dfb9d 125 short_delay(2); // min. 50ns SCK low
kevman 0:014fad4dfb9d 126 AdSckUp();
kevman 0:014fad4dfb9d 127 short_delay(2); // min. 50ns SCK high
kevman 0:014fad4dfb9d 128 }
kevman 0:014fad4dfb9d 129 AdMosiUp();
kevman 0:014fad4dfb9d 130 for(i=0;i<32;i++)
kevman 0:014fad4dfb9d 131 {
kevman 0:014fad4dfb9d 132 AdSckDown();
kevman 0:014fad4dfb9d 133 short_delay(2); // min. 50ns SCK low
kevman 0:014fad4dfb9d 134 AdSckUp();
kevman 0:014fad4dfb9d 135 short_delay(2); // min. 50ns SCK high
kevman 0:014fad4dfb9d 136 }
kevman 0:014fad4dfb9d 137 Ad0CsUp();
kevman 0:014fad4dfb9d 138 Ad1CsUp();
kevman 0:014fad4dfb9d 139 }
kevman 0:014fad4dfb9d 140
kevman 0:014fad4dfb9d 141 /*-------------------------------------------------------------------------------
kevman 0:014fad4dfb9d 142 // Rdy ist der Interrupt von AD7734
kevman 0:014fad4dfb9d 143 #define Ad0IsRdyUp() (GPIOB_PDIR & 0x000000400)
kevman 0:014fad4dfb9d 144 -------------------------------------------------------------------------------*/
kevman 0:014fad4dfb9d 145 int AdIsRdyUp(int Chn)
kevman 0:014fad4dfb9d 146 {
kevman 0:014fad4dfb9d 147 if(Chn == 0)
kevman 0:014fad4dfb9d 148 return(Ad0IsRdyUp());
kevman 0:014fad4dfb9d 149 else
kevman 0:014fad4dfb9d 150 return(Ad1IsRdyUp());
kevman 0:014fad4dfb9d 151 }
kevman 0:014fad4dfb9d 152
kevman 0:014fad4dfb9d 153 /*-------------------------------------------------------------------------------
kevman 0:014fad4dfb9d 154 -------------------------------------------------------------------------------*/
kevman 0:014fad4dfb9d 155 void Ad7739Init(int EcmWinCall)
kevman 0:014fad4dfb9d 156 {
kevman 0:014fad4dfb9d 157 // Power on Reset
kevman 0:014fad4dfb9d 158 uint8_t i, j;
kevman 0:014fad4dfb9d 159
kevman 0:014fad4dfb9d 160 for(i=0;i<8;i++)
kevman 0:014fad4dfb9d 161 fChnValid[i] = false;
kevman 0:014fad4dfb9d 162
kevman 0:014fad4dfb9d 163
kevman 0:014fad4dfb9d 164
kevman 0:014fad4dfb9d 165
kevman 0:014fad4dfb9d 166 // Conversiontime zuerst setzen, da dies auf die Kalibrierzeiten wirkt
kevman 0:014fad4dfb9d 167 SetAdConversionTime();
kevman 0:014fad4dfb9d 168
kevman 0:014fad4dfb9d 169 // die ersten vier Kanäle sind aktiv
kevman 0:014fad4dfb9d 170 for(i=0;i<3;i++)
kevman 0:014fad4dfb9d 171 {
kevman 0:014fad4dfb9d 172 fChnValid[i] = true;
kevman 0:014fad4dfb9d 173 MVars.m_fChnValid[i] = true;
kevman 0:014fad4dfb9d 174 }
kevman 0:014fad4dfb9d 175
kevman 0:014fad4dfb9d 176 #ifdef SIO_DEBUG
kevman 0:014fad4dfb9d 177 STemp[0] = 0x00;
kevman 0:014fad4dfb9d 178 for(i=0;i<8;i++)
kevman 0:014fad4dfb9d 179 {
kevman 0:014fad4dfb9d 180 sprintf(SDebug, "Chn%d: %d", i, fChnValid[i]);
kevman 0:014fad4dfb9d 181 strcat(STemp, SDebug);
kevman 0:014fad4dfb9d 182 }
kevman 0:014fad4dfb9d 183 printf("%s \r\n",STemp);
kevman 0:014fad4dfb9d 184 #endif
kevman 0:014fad4dfb9d 185
kevman 0:014fad4dfb9d 186 ReadAdRevisionRegister(0);
kevman 0:014fad4dfb9d 187 ReadAdRevisionRegister(1);
kevman 0:014fad4dfb9d 188
kevman 0:014fad4dfb9d 189 // Self Calibration
kevman 0:014fad4dfb9d 190 for(i=0;i<2;i++)
kevman 0:014fad4dfb9d 191 {
kevman 0:014fad4dfb9d 192 Ad7739OutWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_MODE, 0)),i); //Mode Register 0x38
kevman 0:014fad4dfb9d 193 Ad7739OutWrite(0x82,i); // ADC Zero-Scale schreibt nur in das erste, das genuegt
kevman 0:014fad4dfb9d 194 nMyTimer = 0;
kevman 0:014fad4dfb9d 195 while( (AdIsRdyUp(i) && (nMyTimer < 2000))); // && Ad1IsRdyUp());
kevman 0:014fad4dfb9d 196 if(nMyTimer >=2000)
kevman 0:014fad4dfb9d 197 printf("Self Calibration finish on Timer \r\n");
kevman 0:014fad4dfb9d 198
kevman 0:014fad4dfb9d 199 }
kevman 0:014fad4dfb9d 200 /*
kevman 0:014fad4dfb9d 201 #ifdef SIO_DEBUG
kevman 0:014fad4dfb9d 202 printf("Nach SelfCalibration %d\r\n", nMyTimer);
kevman 0:014fad4dfb9d 203 #endif
kevman 0:014fad4dfb9d 204 Status0 = ReadAdStatusRegister(0);
kevman 0:014fad4dfb9d 205 Status1 = ReadAdStatusRegister(1);
kevman 0:014fad4dfb9d 206 #ifdef TFT_DEBUG
kevman 0:014fad4dfb9d 207 printf("St0: %d St1: %d \n", Status0, Status1);
kevman 0:014fad4dfb9d 208 #endif
kevman 0:014fad4dfb9d 209 */
kevman 0:014fad4dfb9d 210
kevman 0:014fad4dfb9d 211 // Fullscale Calibration
kevman 0:014fad4dfb9d 212 for(i = 0; i < 2; i++) // muss nur für die erste Adresse geschrieben werden gilt für acht Kanäle
kevman 0:014fad4dfb9d 213 {
kevman 0:014fad4dfb9d 214 Ad7739OutWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_MODE, 0)),i);
kevman 0:014fad4dfb9d 215 Ad7739OutWrite(0xA2,i); // ADC Full-Scale und 24 Bit
kevman 0:014fad4dfb9d 216 nMyTimer = 0;
kevman 0:014fad4dfb9d 217 while( (AdIsRdyUp(i) && (nMyTimer < 2000))); // && Ad1IsRdyUp());
kevman 0:014fad4dfb9d 218 if(nMyTimer >=2000)
kevman 0:014fad4dfb9d 219 printf("FullScale Calibration finish on Timer \r\n");
kevman 0:014fad4dfb9d 220 }
kevman 0:014fad4dfb9d 221 /*
kevman 0:014fad4dfb9d 222 #ifdef SIO_DEBUG
kevman 0:014fad4dfb9d 223 printf("Nach FullScaleCalibration %d\r\n", nMyTimer);
kevman 0:014fad4dfb9d 224 #endif
kevman 0:014fad4dfb9d 225 Status0 = ReadAdStatusRegister(0);
kevman 0:014fad4dfb9d 226 Status1 = ReadAdStatusRegister(1);
kevman 0:014fad4dfb9d 227 #ifdef TFT_DEBUG
kevman 0:014fad4dfb9d 228 printf("St0: %d St1: %d \n", Status0, Status1);
kevman 0:014fad4dfb9d 229 #endif
kevman 0:014fad4dfb9d 230 */
kevman 0:014fad4dfb9d 231
kevman 0:014fad4dfb9d 232 //
kevman 0:014fad4dfb9d 233 // Channel Setup Register 0x28 bis 0x2F
kevman 0:014fad4dfb9d 234
kevman 0:014fad4dfb9d 235 // Schreiben des Channel Setup Registers 0x28 bis 0x2F
kevman 0:014fad4dfb9d 236 // Bit 2 setzt den +-2,5V Bereich, Bit 3 enabled den Kanal, Bit 5 und Bit 6 setzen den Differential Mode
kevman 0:014fad4dfb9d 237 // beide auf 0 heißt single ended
kevman 0:014fad4dfb9d 238
kevman 0:014fad4dfb9d 239
kevman 0:014fad4dfb9d 240
kevman 0:014fad4dfb9d 241 for(i=0;i<4;i++) // Wandler 0
kevman 0:014fad4dfb9d 242 {
kevman 0:014fad4dfb9d 243 Ad7739OutWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_C_SET, i)),0); // Geht an Wandler Diff Mode AI0
kevman 0:014fad4dfb9d 244 Ad7739OutWrite(0x08,0); // 08 = +- 10V, 0A = +- 5V
kevman 0:014fad4dfb9d 245 nMyTimer = 0;
kevman 0:014fad4dfb9d 246 while( (AdIsRdyUp(0) && (nMyTimer < 2000))); // && Ad1IsRdyUp());
kevman 0:014fad4dfb9d 247 if(nMyTimer >=2000)
kevman 0:014fad4dfb9d 248 printf("ADC0 active and Range on Timer \r\n");
kevman 0:014fad4dfb9d 249 short_delay(10);
kevman 0:014fad4dfb9d 250 }
kevman 0:014fad4dfb9d 251 for(i=0;i<4;i++) // Wandler 1
kevman 0:014fad4dfb9d 252 {
kevman 0:014fad4dfb9d 253 Ad7739OutWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_C_SET, i)),1); // Geht an Wandler Diff Mode AI0
kevman 0:014fad4dfb9d 254 Ad7739OutWrite(0x00,1); // 08 = +- 10V, 0A = +- 5V, zweiter Wandler wird nicht gebraucht
kevman 0:014fad4dfb9d 255 nMyTimer = 0;
kevman 0:014fad4dfb9d 256 while( (AdIsRdyUp(1) && (nMyTimer < 2000))); // && Ad1IsRdyUp());
kevman 0:014fad4dfb9d 257 short_delay(10);
kevman 0:014fad4dfb9d 258 if(nMyTimer >=2000)
kevman 0:014fad4dfb9d 259 printf("ADC1 active and Range on Timer \r\n");
kevman 0:014fad4dfb9d 260 }
kevman 0:014fad4dfb9d 261
kevman 0:014fad4dfb9d 262 printf("Nach Setup AD 1 %d\r\n", nMyTimer);
kevman 0:014fad4dfb9d 263
kevman 0:014fad4dfb9d 264
kevman 0:014fad4dfb9d 265
kevman 0:014fad4dfb9d 266 // IO Register
kevman 0:014fad4dfb9d 267 for(j=0;j<2;j++)
kevman 0:014fad4dfb9d 268 {
kevman 0:014fad4dfb9d 269 Ad7739OutWrite(AD7739_WRITE_OP(AD7739_ADDR_IO),j);
kevman 0:014fad4dfb9d 270 Ad7739OutWrite(0x30,j); // 0x08 sagt, daß der Ready Pin low geht, wenn alle Kanäle konvertiert sind
kevman 0:014fad4dfb9d 271 }
kevman 0:014fad4dfb9d 272 printf("Nach IO Register \r\n");
kevman 0:014fad4dfb9d 273
kevman 0:014fad4dfb9d 274 AdSckUp();
kevman 0:014fad4dfb9d 275 AdMosiDown();
kevman 0:014fad4dfb9d 276
kevman 0:014fad4dfb9d 277 ReadAdIoPortRegister(0);
kevman 0:014fad4dfb9d 278 ReadAdIoPortRegister(1);
kevman 0:014fad4dfb9d 279 ReadAdRevisionRegister(0);
kevman 0:014fad4dfb9d 280 ReadAdRevisionRegister(1);
kevman 0:014fad4dfb9d 281
kevman 0:014fad4dfb9d 282 ReadAdTestRegister(0);
kevman 0:014fad4dfb9d 283
kevman 0:014fad4dfb9d 284 ReadAdChnZeroScaleRegister(0);
kevman 0:014fad4dfb9d 285 ReadAdChnZeroScaleRegister(1);
kevman 0:014fad4dfb9d 286
kevman 0:014fad4dfb9d 287
kevman 0:014fad4dfb9d 288 /* while(true)
kevman 0:014fad4dfb9d 289 {
kevman 0:014fad4dfb9d 290 AdReadChannels(0,0,0); // Kanal, Wandler, ohne/mit Status
kevman 0:014fad4dfb9d 291 AdReadChannels(0,1,0); // Kanal, Wandler, ohne/mit Status
kevman 0:014fad4dfb9d 292 }
kevman 0:014fad4dfb9d 293 */
kevman 0:014fad4dfb9d 294 }
kevman 0:014fad4dfb9d 295 /*-------------------------------------------------------------------------------
kevman 0:014fad4dfb9d 296 Setzt die Wandlungszeit für die A/D Wandler
kevman 0:014fad4dfb9d 297 -------------------------------------------------------------------------------*/
kevman 0:014fad4dfb9d 298 void SetAdConversionTime()
kevman 0:014fad4dfb9d 299 {
kevman 0:014fad4dfb9d 300 int i;
kevman 0:014fad4dfb9d 301 uint8_t AdConversionTime;
kevman 0:014fad4dfb9d 302
kevman 0:014fad4dfb9d 303
kevman 0:014fad4dfb9d 304 // Wandlungszeit FF bedeutet Chopper ist an und 7F ist dei max. Wandlungszeit
kevman 0:014fad4dfb9d 305 // Die minimale Wandlungszeit ist 0x02, d.h. mit Chopper ist es 0x82, ohne 0x02
kevman 0:014fad4dfb9d 306 // AdConversionTime = MVars.AdConvTime;
kevman 0:014fad4dfb9d 307 AdConversionTime = 0x7F;
kevman 0:014fad4dfb9d 308 for(i = 0; i < 4; i++)
kevman 0:014fad4dfb9d 309 {
kevman 0:014fad4dfb9d 310 Ad7739CommonWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_C_CT, i))); //0x30 conversion time
kevman 0:014fad4dfb9d 311 Ad7739CommonWrite(AdConversionTime);
kevman 0:014fad4dfb9d 312 // ReadAdConvTimeRegister();
kevman 0:014fad4dfb9d 313 }
kevman 0:014fad4dfb9d 314 }