kramann.info
© Guido Kramann

Login: Passwort:










22.7 Aufbau und Test des Mikrofonverstärkers

22.7 Construction and test of the microphone amplifier (EN google-translate)

22.7 Budowa i test wzmacniacza mikrofonowego (PL google-translate)

Grundidee

The basic idea

Podstawową ideą

  • Die Analogwerte aus dem Mikrofonverstärker werden auf A11 gegeben.
  • Ein Mikrocontrollerprogramm zählt die Nulldurchgänge.
Stromlaufplan mit Mikrofonschaltung.

Bild 22.7-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 22.7-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 22.7-2: NEU 09.01.2015