AS3935 Lightning sensor library
Fork of AS3935 by
include the mbed library with this snippet
#include "mbed.h" #include "AS3935.h" // frdm-kl25z sd card connections for spi1 // ------------------------------------------------ // Header -- kl25z -- SD/MMC // J2-20 -- PTE1 -- MOSI // J9-13 -- PTE4 -- CS // J2-14 -- GND -- Vss (GND) // J9-9 -- PTE2 -- SCK // J9-11 -- PTE3 -- MISO AS3935 ld(PTE1, PTE3, PTE2, PTE4, "ld", 100000); // MOSI, MISO, SCK, CS, SPI bus freq (hz) InterruptIn IntLightning(PTA12); //IRQ AS3935 DigitalOut led1(LED_RED); Serial pc(USBTX, USBRX); void DetectLightning() { char OriginInt; wait_ms(2); OriginInt = ld.interruptSource(); if (OriginInt == 1) { // pc.printf(" Noise level too high\r\n"); } if (OriginInt == 4) { // pc.printf(" Disturber\r\n"); } if (OriginInt == 8) { // detection // pc.printf(" Lightning detection\r\n"); pc.printf(" Lightning detection, distance=%dkm\r\n", ld.lightningDistanceKm()); ld.clearStats(); } } int main() { pc.baud(9600); pc.printf("\r\nstart lightning detector\r\n"); //initialisations ld.reset(); ld.setTuneCap(5); // 500kHz ld.powerUp(); ld.setIndoors(); ld.setMinimumLightnings(1); //ld.setSpikeRejection(2); ld.setNoiseFloor(2); ld.disableDisturbers(); //ld.enableDisturbers(); ld.setWatchdogThreshold(2); wait_ms(10); IntLightning.rise(&DetectLightning); int MinBlysk = ld.getMinimumLightnings(); int Noise = ld.getNoiseFloor(); int TuneCap = ld.getTuneCap(); int SpikeRej = ld.getSpikeRejection(); int WatchDog = ld.getWatchdogThreshold(); pc.printf(" Min wylad: %i", MinBlysk); pc.printf("\r\n"); pc.printf(" Noise: %i", Noise); pc.printf("\r\n"); pc.printf(" Tune CAP: %i", TuneCap); pc.printf("\r\n"); pc.printf(" Spike rej: %i", SpikeRej); pc.printf("\r\n"); pc.printf(" Watchdog: %i", WatchDog); pc.printf("\r\n"); while(1) { led1 = ! led1; wait(0.2); } }
Revision 9:19a323b1c508, committed 2015-06-18
- Comitter:
- cmkachur
- Date:
- Thu Jun 18 15:47:39 2015 +0000
- Parent:
- 8:60e1b6b39e1c
- Child:
- 10:bf33e2946bab
- Commit message:
- Update calibrate RCO method. Measure the TRC oscillator.
Changed in this revision
AS3935.cpp | Show annotated file Show diff for this revision Revisions of this file |
AS3935.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/AS3935.cpp Wed Jun 17 15:04:28 2015 +0000 +++ b/AS3935.cpp Thu Jun 18 15:47:39 2015 +0000 @@ -88,7 +88,7 @@ regval >>= (_ffsz(mask)); return regval; } - +#if 0 void AS3935::reset() { m_Cs = 0; @@ -97,7 +97,7 @@ m_Cs = 1; wait_ms(2); } - +#endif void AS3935::presetDefault() { m_Cs = 0; @@ -341,35 +341,40 @@ registerWrite(AS3935_CL_STAT,0); registerWrite(AS3935_CL_STAT,1); } + +static void intrPulseCntr(void) {sgIntrPulseCount++;} -int AS3935::calibrateRCOs (void) +int AS3935::calibrateRCOs (InterruptIn &intrIn) { int rc; uint8_t trco; uint8_t srco; - m_Cs = 0; - m_Spi.write(0x3D); // Direct Command Calibrate RCO - m_Spi.write(0x96); - m_Cs = 1; - wait_ms(1); // wait 1ms - registerWrite(AS3935_DISP_SRCO, 0x40); // ERRATA: after power down mode - wait_ms(2); // wait 1ms - registerWrite(AS3935_DISP_SRCO, 0x00); // ERRATA: after power down mode - wait_ms(1); - // cal sequence from acurite follows - registerWrite(AS3935_DISP_SRCO, 0x48); - wait_ms(1); - registerWrite(AS3935_DISP_LCO, 0x8); - wait_ms(1); - registerWrite(AS3935_DISP_TRCO, 0x28); - wait_ms(1); - registerWrite(AS3935_DISP_SRCO, 0x48); - wait_ms(1); - registerWrite(AS3935_DISP_LCO, 0x8); - wait_ms(1); + Timer pulseTimer; + int timeNow; + unsigned long measFreq; + + intrIn.rise(intrPulseCntr); + + _SPITransfer2(0x3D, 0x96); // send command to calibrate the internal RC oscillators + _SPITransfer2(8, 0x20); // put TRCO on the IRQ line for measurement + wait_ms(20); // wait for the chip to output the frequency, ususally ~2 ms - trco=registerRead(0x3A, 0x80); // Read out Calibration of TRCO done - srco=registerRead(0x3B, 0x80); // Readout Calibration of SRCO done + pulseTimer.reset(); + pulseTimer.start(); + sgIntrPulseCount = 0; // reset the interrupt counter which serves as our frequency\pulse counter + + timeNow = 0; + while (timeNow < 500) // wait for 0.5 seconds + { + timeNow = pulseTimer.read_ms(); + } + _SPITransfer2(8, 0); // stop the output of the frequncy on IRQ line + measFreq = sgIntrPulseCount << 1; // calculate the measure frequency based upon period of capture and freq scaler + + printf("timer RCO: %ld Hz\n\r", measFreq); + + trco=registerRead(0x3A, 0x80); // Read out Calibration of TRCO done + srco=registerRead(0x3B, 0x80); // Readout Calibration of SRCO done if(trco != 0x00 && srco != 0x00) { rc = 1; @@ -385,11 +390,6 @@ } -void intrPulseCntr(void) -{ - sgIntrPulseCount++; -} - unsigned long AS3935::tuneAntenna(InterruptIn &intrIn) { #define ANTENA_RES_FREQ (unsigned long)500000 @@ -403,10 +403,10 @@ unsigned long error; intrIn.rise(intrPulseCntr); + _SPITransfer2(3, 0x80); // set frequency division to 64 for (tunCapCnt = 0; tunCapCnt < 16; ++tunCapCnt) // loop for all possible values of the tuning capacitor { - _SPITransfer2(3, 0x80); _SPITransfer2(8, 0x80+tunCapCnt); // set the tuning cap and have the frequency output to the IRQ line wait_ms(20); // wait for the chip to output the frequency, ususally ~2 ms
--- a/AS3935.h Wed Jun 17 15:04:28 2015 +0000 +++ b/AS3935.h Thu Jun 18 15:47:39 2015 +0000 @@ -151,10 +151,10 @@ //clear internal accumulated lightning statistics void clearStats(); - int calibrateRCOs (void); + int calibrateRCOs (InterruptIn &intrIn); unsigned long tuneAntenna(InterruptIn &intrIn); - + /** Attach a function, lightning interrupt * @param fptr pointer to a void function, or 0 to set as none */ @@ -169,7 +169,8 @@ void attach(T *tptr, void (T::*mptr)(void)) { _func.attach(tptr, mptr); } - + + private: //I2C i2c; //DigitalOut _irq; @@ -184,6 +185,10 @@ char _rawRegisterRead(char reg); char _SPITransfer2(char high, char low); char _ffsz(char mask); + + + + }; /* !_AS3935_H_ */