Science fair: hur exakt är AC line frekvensen? (2 / 4 steg)
Steg 2: Skiss
Uno kommer att ansvara för gör räkna. Vi kommer använda seriell anslutning (via USB) från Uno tillbaka till en värddator.
Denna skiss kommer att utföra räkningarna av AC cykler på grundval av andra-av-andra (GPS). Helst som en andra har andra än 60 cyklar, en linje med deltan skrivs ut på den seriella porten. Värden kan titta på den seriella porten och samla deltorna på sin fritid.
Vi ska också ange förlust av GPS PPS signalering, vilket kan hända om GPS förlorar sin fix.
#include < Serial.h >
#define PPS_PIN 2
#define AC_PIN 3
#define PPS_IRQ 0
#define AC_IRQ 1
#define NOMINAL_FREQUENCY 60
#define PPS_COMPLAINT_RATE 1500
osignerade långa last_pps_complaint;
unsigned int ac_cycle_count, last_ac_cycle_count;
booleska pps_occurred;
void pps_isr() {
last_ac_cycle_count = ac_cycle_count;
ac_cycle_count = 0;
pps_occurred = sant;
}
void ac_isr() {
ac_cycle_count ++;
}
void setup() {
pinMode (PPS_PIN, indata);
pinMode (AC_PIN, INPUT_PULLUP);
Serial.BEGIN(9600);
pps_occurred = false;
ac_cycle_count = 0;
last_pps_complaint = 0;
attachInterrupt (PPS_IRQ, pps_isr, RISING);
attachInterrupt (AC_IRQ, ac_isr, RISING);
}
void loop() {
om (pps_occurred) {
pps_occurred = false;
last_pps_complaint = millis(); ingen ursäkt att klaga, faktiskt.
int delta = NOMINAL_FREQUENCY - last_ac_cycle_count;
om (delta) {
Serial.Print(delta);
Serial.Print("\r\n");
}
} annat {
om (millis() - last_pps_complaint > PPS_COMPLAINT_RATE) {
last_pps_complaint = millis();
Serial.Print ("missade PPS\r\n");
}
}
}