Arduino frekvens identifiering (1 / 4 steg)
Steg 1: Påvisande av Signal lutning
Den viktiga delen av koden återges nedan. Alla av denna kod sker i ADC avbryta (avbrott och körs varje gång en ny analog i värde är redo från A0, mer info om vilka avbrott är och varför vi använder dem kan hittas här)
prevData = newData; //store tidigare värde
newData = ADCH; //get värde från A0
om (newData > prevData) {//if positiv lutning
PORTB | = B00010000; //set stift 12 hög
}
annars om (newData < prevData) {om negativ lutning
PORTB & = B11101111; //set stift 12 låg
}
Jag noterar här att i denna tutorial jag använda direkt port manipulation att stänga av och på den output pin (stift 12) av Arduino. Jag gjorde detta eftersom port manipulation är ett mycket snabbare sätt att ta itu med den Arduino stift än kommandot digitalWrite(). Eftersom jag var tvungen att sätta alla koden ovan inuti ett avbrott rutin som gick vid 38,5 kHz, jag behövde koden för att vara så effektiv som möjligt. Du kan läsa mer om port manipulation på Arduino webbplats, eller ser de kommentarer som jag har skrivit ovan att förstå vad varje rad gör. Du märker också i koden nedan som jag använt några okända kommandon i funktionen setup() så att jag kunde få den Arduino analog ingång till provet på en hög frekvens. Mer information om som kan hittas i min Arduino Audio Input tutorial.
Fig 1 visar puls utgången i blått och sinusvåg i gult på ett oscilloskop. Märker hur pulsen kopplade växlar varje gång sinusvåg når ett maximum eller minimum. Figur 2 visar pulsen utgång i blått för en godtycklig vågform i gult. Notera här hur pulse wave tar på en oregelbunden intermittens eftersom den inkommande signalen (gul) är mycket mer komplicerad än en sinusvåg.
Påvisande av signal sluttning med 38,5 kHz samplingsfrekvens och avbryter
av Amanda Ghassaei
Sept 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;
lagring variabler
byte newData = 0;
byte prevData = 0;
void setup() {
pinMode (13, OUTPUT); //led indikator pin
pinMode (12, OUTPUT); //slope indikator
(CLI); //disable 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 (newData > prevData) {//if ökar
PORTB | = B00010000; //set stift 12 hög
}
annars om (newData < prevData) {
PORTB & = B11101111; //set stift 12 låg
}
om (newData == 0 || newData == 1023) {//if klippning
PORTB | = B00100000; //set stift 13 hög-sväng på klippning indikator ledde
klippningen = 1; //currently klippning
}
}
void loop() {
om (klippning) {//if för närvarande klippning
PORTB & = B11011111; //turn av klippning indikator ledde
klippningen = 0;
}
Delay(100);
}