- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 12

Thema: Audio => AVR (LM339)

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009

    Audio => AVR (LM339)

    Moin.

    Hab vor einiger Zeit hier schon mal gefragt, wie man ein Audiosignal am besten für nen AVR in ein Rechtecksignal umwandelt.
    Damals wurde mir der Tip mit dem LM339 gegeben. Ich habs zu der Zeit auch hinbekommen.
    Jetzt - über 1 Jahr später - wollt ich die Schaltung nocheinmal aufbauen, aber es klappt nicht so wirklich.

    Ziel ist es einfach, ein Audiosignal aus einer Soundkarte o.ä. so aufzubereiten, dass ich ein Rechtecksignal gleicher Frequenz hab, die dann an nem INT-Pin eines AVR bestimmt werden kann.

    µC ist ein ATMega8, 8MHz intern (ausreichend für diese Zwecke).

    Das Testprogramm soll, abhänging von der Frequenz einfach mal eine LED blinken lassen. Ein Software-Frequenzteiler teilt durch 5000, so dass z.B. 5 kHz die LED im Sekundentakt blinken lassen müsste.

    Die LED blinkt jedoch - unabhängig von der angelegten Frequenz - immer relativ gleich. Als Testsignal wird ein Sweep von 500 - 5000 Hz durchlaufen.

    Für das spätere Projekt sollen dann nur Frequenzen von 800 - 3000 Hz erkannt werden.

    Hier mal das Testprogramm:
    Code:
    #include "main.h"    // Funktionsprototypen
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
    #include "glob_defs.h"  // Definitionen wie ENABLE = 1, DISABLE = 0, etc
    #include "glob_type.h" // Typen, ui8_t, ui16_t etc...
    
    volatile ui16_t tmpcnt = 0;
    
    void Sys_Init(void)
    {
      DDRC |= (1 << PC2) | (1 << PC3) | (1 << PC4) | (1 << PC5);
    }
    
    void INT0_Init(void)
    {
      // INT0, Steigende Flanke
      GICR  |= (1 << INT0); 
      MCUCR |= (1 << ISC01) | (1 << ISC00);
    }
    
    void Timer1_Init(void)
    {
      // Timer einfach zählen lassen, Prescaler 1
      TCCR1A = 0;           
      TCCR1B = (1 << CS10); 
      TCNT1 = 0;
    }
    
    int main(void)
    {
      Sys_Init();
      Timer1_Init();
      INT0_Init();
      sei();
      while(1)
      {
        if (tmpcnt >= 5000)
        {
          PORTC ^= (1 << PD5);
          tmpcnt = 0;
        }
      }
      return(0);
    }
    
    
    ISR (SIG_INTERRUPT0)
    {
      tmpcnt++;  
    }
    Hat hier jemand nen Verbesserungsvorschlag, Primär mal für die Hardware, um dort ein sauberes Signal zu bekommen?
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken audio2avr.jpg  
    #ifndef MfG
    #define MfG

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress