Test
Dependencies: mbed-dev-OS5_10_4
MySources/AdInit.cpp
- Committer:
- kevman
- Date:
- 2020-08-07
- Revision:
- 0:014fad4dfb9d
File content as of revision 0:014fad4dfb9d:
/*------------------------------------------------------------------------------- Programm Name: AdInit.cpp Version: 1.0 Sprache: C++ Compiler: mbed Autor: PS Copyright: PS Funktion: Init-Funktion für den A/D Wandlerzugriff 30.06.2017: -------------------------------------------------------------------------------*/ #include "Headers.h" bool fChnValid[8]; /*------------------------------------------------------------------------------- Analog-Digital Konverter initialisieren -------------------------------------------------------------------------------*/ void InitAdValues() { int i,j; AdVal = new (AD_VAL); for(i=0;i<ANZ_POT*4;i++) { g_fARead[i] = false; MVars.dbAdSum[i] = 0.; for(j=0;j<16;j++) { AdVal->AdResult[i][j] = 0.0; } } for(i=0;i<ANZ_POT*4;i++) { for(j=0;j<64;j++) AdVal->AdRingBuf[i][j] = 0L; } g_nAdSetPos = 0; g_nAdGetPos = 0; g_nAdCount = 0; g_nAdResultCount = 0; AdVal->FKoeff[0] = -0.7128E-3; AdVal->FKoeff[1] = 0.01879; AdVal->FKoeff[2] = 0.06321; AdVal->FKoeff[3] = 0.125; AdVal->FKoeff[4] = 0.1806; AdVal->FKoeff[5] = 0.20305; AdVal->FKoeff[6] = 0.1806; AdVal->FKoeff[7] = 0.125; AdVal->FKoeff[8] = 0.06321; AdVal->FKoeff[9] = 0.01879; AdVal->FKoeff[10] = -0.7128E-3; AdVal->nStartFk = 11; AdVal->nEndeFk = 5; AdVal->dbUNoiseGainFaktor = 0.1; AdVal->dbINoiseGainFaktor = 1.0; MVars.AdConvTime = 0x7F; // Startwert, längste Wandlungszeit ohne Chop Mode 0x80 ist Chopper } /*------------------------------------------------------------------------------- Interrupt für den A/D Wandler einrichten. InterruptIn AdcRdy(PTB10) liegt hier auf PTB10, muss je nach Hardware angepasst werden -------------------------------------------------------------------------------*/ int InitSpiAd(void) { Adc0Cs = true; Adc1Cs = true; AdcRdy0.mode(PullUp); AdcRdy1.mode(PullUp); Ad0CsUp(); AdSckUp(); printf("Nach Set Irq's\n"); return(true); } /*------------------------------------------------------------------------------- Interrupt für den A/D Wandler einrichten. InterruptIn AdcRdy(PTB10) liegt hier auf PTB10, muss je nach Hardware angepasst werden -------------------------------------------------------------------------------*/ int ConnectIrq(void) { AdcRdy0.fall(&Rdy0Fall); AdcRdy1.fall(&Rdy1Fall); return(true); } /*------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ void AdReset() { // macht einen kompletten Reset auf den Wandler DoAdReset(); printf("Nach AdReset CommonWrite Hex 00\n"); wait(2.0); } /*------------------------------------------------------------------------------- Macht einen Reset des A/D Wandlers -------------------------------------------------------------------------------*/ void DoAdReset() { int i; AdSckUp(); AdMosiDown(); Ad0CsDown(); Ad1CsDown(); short_delay(2); for(i=0;i<8;i++) { AdSckDown(); short_delay(2); // min. 50ns SCK low AdSckUp(); short_delay(2); // min. 50ns SCK high } AdMosiUp(); for(i=0;i<32;i++) { AdSckDown(); short_delay(2); // min. 50ns SCK low AdSckUp(); short_delay(2); // min. 50ns SCK high } Ad0CsUp(); Ad1CsUp(); } /*------------------------------------------------------------------------------- // Rdy ist der Interrupt von AD7734 #define Ad0IsRdyUp() (GPIOB_PDIR & 0x000000400) -------------------------------------------------------------------------------*/ int AdIsRdyUp(int Chn) { if(Chn == 0) return(Ad0IsRdyUp()); else return(Ad1IsRdyUp()); } /*------------------------------------------------------------------------------- -------------------------------------------------------------------------------*/ void Ad7739Init(int EcmWinCall) { // Power on Reset uint8_t i, j; for(i=0;i<8;i++) fChnValid[i] = false; // Conversiontime zuerst setzen, da dies auf die Kalibrierzeiten wirkt SetAdConversionTime(); // die ersten vier Kanäle sind aktiv for(i=0;i<3;i++) { fChnValid[i] = true; MVars.m_fChnValid[i] = true; } #ifdef SIO_DEBUG STemp[0] = 0x00; for(i=0;i<8;i++) { sprintf(SDebug, "Chn%d: %d", i, fChnValid[i]); strcat(STemp, SDebug); } printf("%s \r\n",STemp); #endif ReadAdRevisionRegister(0); ReadAdRevisionRegister(1); // Self Calibration for(i=0;i<2;i++) { Ad7739OutWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_MODE, 0)),i); //Mode Register 0x38 Ad7739OutWrite(0x82,i); // ADC Zero-Scale schreibt nur in das erste, das genuegt nMyTimer = 0; while( (AdIsRdyUp(i) && (nMyTimer < 2000))); // && Ad1IsRdyUp()); if(nMyTimer >=2000) printf("Self Calibration finish on Timer \r\n"); } /* #ifdef SIO_DEBUG printf("Nach SelfCalibration %d\r\n", nMyTimer); #endif Status0 = ReadAdStatusRegister(0); Status1 = ReadAdStatusRegister(1); #ifdef TFT_DEBUG printf("St0: %d St1: %d \n", Status0, Status1); #endif */ // Fullscale Calibration for(i = 0; i < 2; i++) // muss nur für die erste Adresse geschrieben werden gilt für acht Kanäle { Ad7739OutWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_MODE, 0)),i); Ad7739OutWrite(0xA2,i); // ADC Full-Scale und 24 Bit nMyTimer = 0; while( (AdIsRdyUp(i) && (nMyTimer < 2000))); // && Ad1IsRdyUp()); if(nMyTimer >=2000) printf("FullScale Calibration finish on Timer \r\n"); } /* #ifdef SIO_DEBUG printf("Nach FullScaleCalibration %d\r\n", nMyTimer); #endif Status0 = ReadAdStatusRegister(0); Status1 = ReadAdStatusRegister(1); #ifdef TFT_DEBUG printf("St0: %d St1: %d \n", Status0, Status1); #endif */ // // Channel Setup Register 0x28 bis 0x2F // Schreiben des Channel Setup Registers 0x28 bis 0x2F // Bit 2 setzt den +-2,5V Bereich, Bit 3 enabled den Kanal, Bit 5 und Bit 6 setzen den Differential Mode // beide auf 0 heißt single ended for(i=0;i<4;i++) // Wandler 0 { Ad7739OutWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_C_SET, i)),0); // Geht an Wandler Diff Mode AI0 Ad7739OutWrite(0x08,0); // 08 = +- 10V, 0A = +- 5V nMyTimer = 0; while( (AdIsRdyUp(0) && (nMyTimer < 2000))); // && Ad1IsRdyUp()); if(nMyTimer >=2000) printf("ADC0 active and Range on Timer \r\n"); short_delay(10); } for(i=0;i<4;i++) // Wandler 1 { Ad7739OutWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_C_SET, i)),1); // Geht an Wandler Diff Mode AI0 Ad7739OutWrite(0x00,1); // 08 = +- 10V, 0A = +- 5V, zweiter Wandler wird nicht gebraucht nMyTimer = 0; while( (AdIsRdyUp(1) && (nMyTimer < 2000))); // && Ad1IsRdyUp()); short_delay(10); if(nMyTimer >=2000) printf("ADC1 active and Range on Timer \r\n"); } printf("Nach Setup AD 1 %d\r\n", nMyTimer); // IO Register for(j=0;j<2;j++) { Ad7739OutWrite(AD7739_WRITE_OP(AD7739_ADDR_IO),j); Ad7739OutWrite(0x30,j); // 0x08 sagt, daß der Ready Pin low geht, wenn alle Kanäle konvertiert sind } printf("Nach IO Register \r\n"); AdSckUp(); AdMosiDown(); ReadAdIoPortRegister(0); ReadAdIoPortRegister(1); ReadAdRevisionRegister(0); ReadAdRevisionRegister(1); ReadAdTestRegister(0); ReadAdChnZeroScaleRegister(0); ReadAdChnZeroScaleRegister(1); /* while(true) { AdReadChannels(0,0,0); // Kanal, Wandler, ohne/mit Status AdReadChannels(0,1,0); // Kanal, Wandler, ohne/mit Status } */ } /*------------------------------------------------------------------------------- Setzt die Wandlungszeit für die A/D Wandler -------------------------------------------------------------------------------*/ void SetAdConversionTime() { int i; uint8_t AdConversionTime; // Wandlungszeit FF bedeutet Chopper ist an und 7F ist dei max. Wandlungszeit // Die minimale Wandlungszeit ist 0x02, d.h. mit Chopper ist es 0x82, ohne 0x02 // AdConversionTime = MVars.AdConvTime; AdConversionTime = 0x7F; for(i = 0; i < 4; i++) { Ad7739CommonWrite(AD7739_WRITE_OP(AD7739_CHANNEL(AD7739_ADDR_C_CT, i))); //0x30 conversion time Ad7739CommonWrite(AdConversionTime); // ReadAdConvTimeRegister(); } }