kramann.info
© Guido Kramann

Login: Passwort:










Robuste Systemintegration
1 Grundlagen
..1.1 Newton
....1.1.1 LinearSchwinger
....1.1.2 Daempfung
....1.1.4 ODE
....1.1.5 Saaluebung
..1.2 NewtonEuler
....1.2.1 Traegheitsmomente
....1.2.2 Modellgleichungen
....1.2.3 Einfachpendel
..1.3 Scilab
....1.3.1 Erste_Schritte
....1.3.2 Skripte
....1.3.3 Funktionen
..1.4 Laplace
....1.4.1 Eigenwerte
....1.4.2 PT1
..1.5 Regleroptimierung
....1.5.1 Guetefunktion
....1.5.2 Heuristiken
....1.5.3 Scilab
..1.6 Einstellregeln
....1.6.1 Totzeit
....1.6.2 Methode1
....1.6.3 Methode2
....1.6.4 Scilab
..1.7 Zustandsregler
..1.8 Polvorgabe
..1.8 Polvorgabe_alt
..1.9 Beobachter
....1.9.1 Haengependel
..1.10 Daempfungsgrad
..1.11 Processing
....1.11.1 Installation
....1.11.2 Erste_Schritte
....1.11.3 Mechatronik
....1.11.4 Bibliotheken
....1.11.5 Uebung
....1.11.6 Snippets
......1.11.6.1 Dateioperationen
......1.11.6.2 Bilder
......1.11.6.3 GUI
......1.11.6.4 Text
......1.11.6.5 PDF
......1.11.6.8 Maus
......1.11.6.10 Zeit
......1.11.6.13 Animation
......1.11.6.15 Simulation
....1.11.7 Referenzen
..1.12 Breakout
2 Beispiel
3 Beispielloesung
4 Praxis
5 javasci
6 Fehlertoleranz1
7 Reglerentwurf
..7.1 Sprungantwort
..7.2 Messdaten
..7.3 Systemidentifikation
..7.4 Polvorgabe
..7.5 Beobachter
..7.6 Robuster_Entwurf
..7.7 SIL
8 Systementwicklung
9 Arduino
..9.1 Lauflicht
..9.2 Taster
..9.3 Sensor
..9.12 Motor_PWM1
..9.13 Motor_PWM2_seriell
..9.14 Motor_PWM3_analogWrite
..9.15 Scheduler
..9.20 AV
..9.21 Mikrofon
..9.22 Universal
....9.22.1 Laborplatine
....9.22.2 LED_Leiste
....9.22.3 Motortreiber
....9.22.4 Sensoreingaenge
....9.22.5 Taster
....9.22.6 Tests
....9.22.7 Mikrofon
....9.22.8 Lautsprecher
....9.22.9 Fahrgestell
..9.23 Zauberkiste
..9.24 OOP
....9.24.1 Uebungen
..9.25 AVneu
....9.25.1 Tests
..9.26 DA_Wandler
..9.27 CompBoard
....9.27.1 Tastenmatrix
....9.27.2 ASCIIDisplay
..9.28 CTC
..9.29 Tonerzeugung
10 EvoFuzzy
..10.1 Fuzzy
....10.1.1 Fuzzylogik
....10.1.2 FuzzyRegler
....10.1.3 Uebung9
....10.1.5 Softwareentwicklung
......10.1.5.1 AgileSoftwareentwicklung
......10.1.5.2 FuzzyRegler
......10.1.5.3 Uebung
....10.1.6 Umsetzung
......10.1.6.1 FuzzyRegler
......10.1.6.2 Simulation
......10.1.6.3 Optimierung
......10.1.6.4 Uebung
....10.1.7 Haengependel
......10.1.7.1 Haengependel
......10.1.7.2 Simulation
......10.1.7.3 FuzzyRegler
......10.1.7.4 Optimierer
......10.1.7.5 Genetisch
....10.1.8 Information
....10.1.9 Energie
..10.2 Optimierung
....10.2.1 Gradientenverfahren
....10.2.2 Heuristiken
....10.2.3 ModifizierteG
....10.2.4 optim
..10.3 Genalgorithmus
..10.4 NeuronaleNetze
....10.4.1 Neuron
....10.4.2 Backpropagation
....10.4.3 Umsetzung
....10.4.4 Winkelerkennung
..10.5 RiccatiRegler
11 Agentensysteme
12 Simulation
20 Massnahmen
21 Kalmanfilter
..21.1 Vorarbeit
..21.2 Minimalversion
..21.3 Beispiel
30 Dreirad
31 Gleiter
..31.1 Fehlertoleranz

9.22.7 Aufbau und Test des Mikrofonverstärkers

Grundidee

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

Bild 9.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 9.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 9.22.7-2: NEU 09.01.2015