Arduino frekvens identifiering (3 / 4 steg)
Steg 3: sinusvåg frekvens identifiering
prevData = newData; //store tidigare värde
newData = ADCH; //get värde från A0
om (prevData < 127 & & newData > = 127) {//if ökar och passage mittpunkten
period = timer; //get perioden från nuvarande timer-värde
timer = 0; //reset timer
}
timer ++; //increment timer
Sedan i den huvudsakliga loop() funktionen beräknade jag frekvensen genom att dividera andelen timer perioden. Jag brukade Serial.print att skriva ut dessa resultat i Arduino seriell monitor.
frekvens = 38462/period; //timer rate/period
skriva ut resultaten
Serial.Print(Frequency);
Serial.println ("hz");
Fig 1 visar signalen till A0. Början och slutet av en cykel av timer framgår av bild anteckningen. Figur 2 visar utdata från seriella monitor (kommando/ctrl + SKIFT + m). Denna teknik fungerar bra för sinustoner, men när vågen blivit mer komplicerad (och cross 2.5V mer än två gånger i en cykel) denna teknik går sönder.
sinusvåg freq upptäckten med 38,5 kHz samplingsfrekvens och avbryter
av Amanda Ghassaei
Juli 2012
/*
* Detta program är fri programvara; Du kan vidaredistribuera det och/eller ändra
* det enligt villkoren i GNU General Public License som offentliggjorts av
* den Free Software Foundation; antingen version 3 av licensen, eller
* (på ditt alternativ) någon senare version.
*
*/
Clipping indicator variabler
booleska klippning = 0;
data storage variabler
byte newData = 0;
byte prevData = 0;
Freq variabler
unsigned int timer = 0; //counts period av wave
unsigned int period.
int frekvens;
void setup() {
Serial.BEGIN(9600);
pinMode (13, OUTPUT); //led indikator pin
(CLI); //diable avbrott
Ställ in kontinuerlig provtagning av analoga pin 0
Rensa ADCSRA och ADCSRB register
ADCSRA = 0;
ADCSRB = 0;
ADMUX | = (1 << REFS0); ange referens spänning
ADMUX | = (1 << ADLAR); Vänsterjustera ADC värde - så vi kan läsa högst 8 bitar från ADCH register endast
ADCSRA | = (1 << ADPS2) | (1 << ADPS0); ställa in ADC klockan med 32 prescaler - 16mHz/32 = 500 kHz
ADCSRA | = (1 << ADATE); enabble automatisk utlösare
ADCSRA | = (1 << Ebba Grön); Aktivera avbrott när mätningen är klar
ADCSRA | = (1 << ADEN); Aktivera ADC
ADCSRA | = (1 << ADSC); Starta ADC mätningar
SEI (); //enable avbrott
}
ISR(ADC_vect) {//when nya ADC värdet redo
prevData = newData; //store tidigare värde
newData = ADCH; //get värde från A0
om (prevData < 127 & & newData > = 127) {//if ökar och passage mittpunkten
period = timer; //get perioden
timer = 0; //reset timer
}
om (newData == 0 || newData == 1023) {//if klippning
PORTB | = B00100000; //set stift 13 hög-sväng på klippning indikator ledde
klippningen = 1; //currently klippning
}
timer ++; //increment timer i takt på 38,5 kHz
}
void loop() {
om (klippning) {//if för närvarande klippning
PORTB & = B11011111; //turn off clippng indikator ledde
klippningen = 0;
}
frekvens = 38462/period; //timer rate/period
skriva ut resultaten
Serial.Print(Frequency);
Serial.println ("hz");
Delay(100);
}