Stap 3: Instellen van de Interrupt voor de software geactiveerd versie
Er zijn verschillende uitstekende instructables over het opzetten van gegevenssnelheden vangen op de arduino.
Ik heb de volgende uit allerlei bronnen ontwikkeld.
Ik gebruik de variabele prescalar om de frequentie van de bemonstering-interrupt.
In wezen we een interrupt die gegevens automatisch met een regelbare frequentie grijpt instellen.
Zodra de interrupt begint, gegevens wordt vastgelegd in een interrupt routine.
Als triggering aanstaat, gegevens niet worden doorgegeven aan de buffer totdat de activerende voorwaarde is voldaan.
De analoge poort is opgegeven door de variabele adport. (ADMUX | = adport)
De frequentie wordt gedefinieerd met behulp van een prescalar. (ADCSRA register: bits ADPS2, ADPS1 en ADPS0.)
Deze bits bepalen de factor van de verdeling tussen de klokfrequentie van het systeem en de input klok naar de ADC.
.
De 5V van de Arduino wordt gebruikt als een referentiespanning. (De REFS0-bit)
Merk op dat de spanning op mijn USB-poort wordt weergegeven om te rijden mijn Arduino op 4.76V.
Als ik verbinding maken met is een voeding van de Arduino de regel '5V' op 5.06V
Als u zijn op zoek naar nauwkeurigheid, externe spanning leveren!.
.
Stel het aantal bits in de opname van de analoge poort gebruikt. Maximumsnelheid van 8 bits worden gelezen. De ADLAR-bit bepaalt de presentatie van de ADC-conversie schrijf een ADLAR naar links aanpassen. Anders wordt de waarde direct aangepast. Dit heeft een onmiddellijk effect op de ADC gegevens registreren.
.
Het instellen van de bits in ADCSRA voor de prescalar van de frequentie. (ADPS0, ADPS1, ADPS2 bits)
.
Stel de interrupt op herhaaldelijk Auto Trigger wanneer de analoge poort wordt gelezen. (De ADATE en ADIE-bit)
Inschakelen van de ADC. (De ADEN bit)
Let op het gebruik van de sbi-functie. Dit en de cbi functie zijn zeer nuttig voor instelling en clearing gegevens registreren bits.
Start de ADC-interrupt. De ADSC (bit)
.
Instellen van de continue lezing van de adc poort 'adport' met behulp van een interrupt
//
cli(); interrupts uitschakelen, zodat we de registers veranderen kunnen zonder te worden onderbroken
Schakel registers van ADCSRA en ADCSRB
ADCSRA = 0;
ADCSRB = 0;
ADMUX | = adport; continue bemonstering van analoge pin adport instellen
ADMUX | = (1 << REFS0); set referentie spanning te AVCC
ADMUX | = (1 << ADLAR); links uitlijnen de ADC-waarde - zodat wij hoogste 8 bits van ADCH register alleen lezen kunnen
De prescalar instellen 8 is de snelst werkbare frequentie
8 prescalar 143Khz (na de vermindering van de snelheid van de maximaal toelaatbare interrupt)
Als (prescalar == 8) ADCSRA | = (1 << ADPS1) | (1 << ADPS0);
16 prescalar - 72 Khz sampling
Als (prescalar == 16) ADCSRA | = (1 << ADPS2);
32 prescaler - 16mHz/32 = 500 kHz - produceert 37 Khz sampling
Als (prescalar == 32) ADCSRA | = (1 << ADPS2) | (1 << ADPS0);
64 prescalar produceert 19,2 Khz sampling
if(prescalar==64) ADCSRA | = (1 << ADPS2) | (1 << ADPS1);
128 prescalar - 9.4 Khz sampling als (prescalar == 128) ADCSRA | = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);
ADCSRA | = (1 << EENDATUM); inschakelen automatische trigger
ADCSRA | = (1 << ADIE); Activeren van de ADC-conversie voltooid Interrupt
SBI(ADCSRA,ADEN); inschakelen van ADC
ADCSRA | = (1 << ADSC); metingen van de ADC start op onderbreken
StartTime=Micros(); tijd vastleggen, zodat we periode en frequentie berekenen kunnen
inschakelen interrupts en off we go!
Sei();
.
De Interrupt-code
De adc-interrupt wordt onderhouden door de ISR(ADC_vect)-routine.
Variabele bufcount is de positie in de buffer, waarvan de grootte BUF_SIZE is (= 1000).
Vlag geactiveerd geldt wanneer gegevens kunnen worden vastgelegd.
Wanneer de buffer vol is vlag writeit true is ingesteld en de adc is uitgeschakeld. (cbi(ADCSRA,ADEN);)
Als u wilt activeren de interrupt ofwel geactiveerd is ingesteld op true in de setup en de gegevens begint onmiddellijk hercoderen.
Of de newval data item wordt vergeleken met de vorige oldval.
Als het verschil groter dan is de trigger geactiveerd is ingesteld op true en de gegevens in de buffer wordt opgeslagen.
De variabele trigcount wordt gebruikt om het tellen van het aantal gegevens items tijdens triggering gelezen.
Dit nummer wordt toegevoegd aan de buffergrootte tijdens de berekening van de frequentie te handhaven van de nauwkeurigheid van de waargenomen frequentie.
.
Dit is de sleutel tot het programma!!
ISR(ADC_vect) {}
Als (geactiveerde) {}
bufa [bufcount] = ADCH;
bufcount ++; Increment buffer teller
Als (bufcount == BUF_SIZE) {}
CBI(ADCSRA,ADEN); uitschakelen van ADC
EndTime=Micros(); record eindtijd voor het interval berekening
writeit = true; vlag dat een schrijven nodig is
}
} else {}
zoekt u een trigger
newval = ADCH;
trigcount ++;
reis = newval-oldval;
if(!trigplus) reis = - reis;
Als (reis > trigger) geactiveerd = true; anders oldval = newval;
}
}