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