Aufbau und Test des Mikrofonverstärkers
(EN google-translate)
(PL google-translate)
Grundidee
|

Bild 0-1: Stromlaufplan mit Mikrofonschaltung.
#include<avr/interrupt.h> int sensorwert=0; int zaehler=0; int nulldurchgang=0; int zustand=0; int wertalt=0; int frequenz=0; //Anzahl der Nulldurchgänge in einer zehntel Sekunde (1000 Durchläufe) int frequenz_alt=0; //Anzahl der Nulldurchgänge in einer zehntel Sekunde (1000 Durchläufe) ISR(TIMER1_COMPA_vect) { sensorwert = analogRead(11); if(zustand==0 && sensorwert>wertalt+5) { nulldurchgang++; zustand=1; wertalt = sensorwert; } else if(zustand==1 && sensorwert<wertalt-5) { nulldurchgang++; zustand=0; wertalt = sensorwert; } //Um zu prüfen, ob wirklich diese Schleife 10000 mal pro Sekunde durchlaufen wird, //Einen der Ausgänge testweise toggeln und dort dann einen Lautsprecher anschließen: digitalWrite(7,zaehler%2); zaehler++; if(zaehler==1000) { frequenz = (nulldurchgang>>1); sensorwert=0; zaehler=0; nulldurchgang=0; zustand=0; wertalt=0; } } void setup() { DDRB=255; pinMode(7, OUTPUT); //Lautsprecher zu Testzwecken anschließen. TCCR1B &= ~(1<<WGM13); //Mode 4 TCCR1B |= (1<<WGM12); TCCR1A &= ~(1<<WGM11); TCCR1A &= ~(1<<WGM10); //Vorteilung: 64, dann 250000Hz Zählung: TCCR1B &= ~(1<<CS12); TCCR1B |= (1<<CS11); TCCR1B |= (1<<CS10); //Abtastrate: 10000Hz zehntausend mal pro Sekunde. OCR1A=25; TIMSK1 |= (1<<OCIE1A); //Mode 4 sei(); Serial.begin(9600); } void loop() { if(frequenz!=frequenz_alt && frequenz>50) { frequenz_alt = frequenz; PORTB = (1<<(frequenz_alt>>5)); //in 10-Hertz-Schritten, 100000 Hertz==1000, 3 Bits übrig lassen. //seriell senden: Serial.write(48+(frequenz_alt/1000)%10); Serial.write(48+(frequenz_alt/100)%10); Serial.write(48+(frequenz_alt/10)%10); Serial.write(48+(frequenz_alt/1)%10); Serial.write('\r'); Serial.write('\n'); } }
Code 0-1: Testprogramm für den Mikrofonverstärker.
#include<avr/interrupt.h> int sensorwert=0; int sensorwert_alt=0; int zaehler=0; int nulldurchgang=0; int zustand=0; int wertalt=0; int frequenz=0; //Anzahl der Nulldurchgänge in einer zehntel Sekunde (1000 Durchläufe) int frequenz_alt=0; //Anzahl der Nulldurchgänge in einer zehntel Sekunde (1000 Durchläufe) ISR(TIMER1_COMPA_vect) { sensorwert = analogRead(11); if(sensorwert>0 && sensorwert_alt==0) { nulldurchgang++; } sensorwert_alt=sensorwert; zaehler++; if(zaehler>=1000) { frequenz=nulldurchgang; nulldurchgang=0; zaehler=0; } } void setup() { TCCR1B &= ~(1<<WGM13); //Mode 4 TCCR1B |= (1<<WGM12); TCCR1A &= ~(1<<WGM11); TCCR1A &= ~(1<<WGM10); //Vorteilung: 64, dann 250000Hz Zählung: TCCR1B &= ~(1<<CS12); TCCR1B |= (1<<CS11); TCCR1B |= (1<<CS10); //Abtastrate: 10000Hz zehntausend mal pro Sekunde. OCR1A=25; TIMSK1 |= (1<<OCIE1A); //Mode 4 sei(); Serial.begin(9600); } void loop() { if(frequenz!=frequenz_alt && frequenz>50) { frequenz_alt = frequenz; //seriell senden: Serial.write(48+(frequenz_alt/1000)%10); Serial.write(48+(frequenz_alt/100)%10); Serial.write(48+(frequenz_alt/10)%10); Serial.write(48+(frequenz_alt/1)%10); Serial.write('\r'); Serial.write('\n'); } } /* void loop() { if(sensorwert!=sensorwert_alt) { sensorwert_alt = sensorwert; //seriell senden: Serial.write(48+(sensorwert_alt/1000)%10); Serial.write(48+(sensorwert_alt/100)%10); Serial.write(48+(sensorwert_alt/10)%10); Serial.write(48+(sensorwert_alt/1)%10); Serial.write('\r'); Serial.write('\n'); } } */
Code 0-2: NEU 09.01.2015