PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Lautsprecher mit uC ansteuern



taylor22
08.11.2007, 22:39
Will einen Lautsprecher mit meinem avr uC ansteuern! Doch wie funktioniert so was, geht das überhaupt? Muss der Lautsprecher nicht einen Wechselstrom bekommen oder so? Wie werden dann die Tonfrequenzen variiert? Wie stellt man Lautstärke ein? ach ja, bin übrigens noch auf der Suche nach einem geeigneten Lautsprecher! Muss nichts grosses sein, muss nur Pieps-Ton mit unterschiedlichen Frequenzen ausgeben können! Kennt da jemand gerade einen kleinen günstigen Lautsprecher?

oZe
09.11.2007, 00:38
Ne muss nicht unbedingt eine Wechselspannung sein. Am einfachsten kannst du denke ich Töne erzeugen wenn du einen Pin des AVR`s in einer bestimmten Frequenz (je nach gewünschter Tonhöhe) toggelst. Sollte relativ einfach sein mit einem Timer.
Die Lautstärke lässt sich einfach mit einem Poti vor dem Lautsprecher einstellen.

robodriver
09.11.2007, 06:33
Bitte nicht vergessen:
Den Lautsprecher keinesfalls direkt an den AVR hängen!
Du solltest einen kleinen Transistor dazwischen schalten, damit dir der Pin nicht abraucht. (Kommt natürlich auf die Lautstärke an)

Willa
09.11.2007, 08:47
Auf dem RN-Control Board ist doch ein Lautsprecher drauf, vielleicht hilft dir dessen Schaltplan weiter? In Bascom ist die Programmierung dann ganz einfach mit vorgefertigten Befehlen.
Viele Grüße,
William

oberallgeier
09.11.2007, 10:13
... Lautsprecher mit ... avr uC ansteuern! ... muss nur Pieps-Ton mit unterschiedlichen Frequenzen ausgeben können... Na ja, mit AVR (und Transistor) gehts so so, la la. Es ist halt eine dämliche Rechteckspannung - das hört man der auch an.


Auf dem RN-Control Board ist doch ein Lautsprecher drauf ...
Stimmt, da steht auch "Speaker" - aber das ist dem Aussehen (und dem Schaltplan nach) ein Piezo. Und "Treiber" ist auch nicht auf meiner RNControl - und die ist von vorletzter Woche (noch mit Aufkleber "Remove after washing" :) ).

Ich bin grad auch dabei, Töne auszugeben - es klingt schrecklich mit der Rechteckspannung. Als Vergleich habe ich meine Stimmgabel genommen - na ja, den "Ton" kriegt man schon frequenzgenau hin. Ich suche ja nicht unbedingt die Oberwellen von einer Stradivari, ich würde eher gerne so einen Pfiff loslassen können - aber davon bin ich Jahrhunderte entfernt.

Ach so, ja, taylor22 fragt ja, wie es geht:


;================================================= ==================================

#include "tn13def.inc"

; Interrupthandler-Tabelle (aus ATTiny13_doc2535.pdf, Seite 42)
; Address Code Labels ; Comments
.org 0x0000 rjmp reset ; Reset Handler
;.org 0x0003 rjmp isr_x13 ;TIMO_OVF = Timer0 Overflow Handler

.org 0x0006 rjmp isr_ctc ; IRS für Timer0 CompareA Handler
;
;================================================= ==================================
; Hauptprogramm
;================================================= ==================================
;
reset: ;=== Generelle Initialisierung
; Zuerst Stack definieren;
ldi a,RAMEND ;Ram Ende des tiny13
out SPL,a ;Stack Pointer tiny13 setzen
;
anfang: ;=== Hier beginnt das Hauptprogramm
rcall mc_init
rcall isr_ini ;Initialisiere die ISR
;
;
hauptp: ;=== Löse Aufgabe: Teste Port PB1 auf Tastendruck. WENN
; - Taste gedrückt: rLED an und piezo/PB4 an
; - Taste gelöst : rLED aus und piezo/PB4 aus
;
sbi portb,rLED ;Rote LED/PB3 aus
sei ;Globel Interrupt an
;
h2: ;=== Hier beginnt das Hauptprogramm
in a,pinb
sbrc a,taste0 ;Wenn Pinb_0 (0..7) = 1, dann rLED/PB3 einschalten
rjmp tonan ; sonst schalte die piezo/PB4 ein
rjmp tonaus
;
tonan:
in a,SREG
sbrc a,7 ;Ist global interrupt gesetzt?
rjmp h2
sbi portb,rLED ;Rote LED/PB3 an
sei ; ... und dazu einfach Interrupt einschalten
rjmp h2
;
tonaus:
in a,SREG
sbrs a,7 ;Ist global interrupt gesetzt?
rjmp h2 ; nein, dann gleich abschalten
;
cli ;Verbiete Interrupts
cbi portb,rLED ;Rote LED/PB3 aus
cbi portb,piezo ; piezo/PB4 aus
;
rjmp h2
;
;================================================= ==================================
; Prozeduren
;================================================= ==================================
;
;================================================= ==================================
; Initialisierungprozeduren, für µC, ADC und Timer-ISR
;================================================= ==================================
;
mc_init: ;=== Initialisiere Mikrocontroller
;ALLE Register initialisieren hier := pull-ups einschalten
;
ldi a,0b00111000 ;
;Datenrichtung "Eingänge" für ports 0 - 2
; und "Ausgänge" für ports 3 - 5
out ddrb,a
ldi a,0b00000000
out portb,a ; ports aus-(=) oder ein(1)schalten; low = sink
ret ;=====----->>>>>
;
;
isr_ini: ;=== Initialisierung der ISR (war mal isrinit_x15)
;
;;Timer Register werden belegt
ldi a,(1<<wgm01) ;prescaler ist 1, waveform = CTC
out tccr0a,a ;Register TCCR0 ist für den Prescaler zuständig
ldi a,tmrprsc ;prescaler, siehe oben, Abstand zum nächsten
out tccr0b,a ; Interrupt bestimmt CTC-Preload tmrprsc
ldi a,(1<<ocie0a) ;Hier Interrupts nach CTC eingeschaltet
out timsk0,a ;Register TIMSK ist dafür zuständig
ldi a,tmrprld ;Hier wird der Timer vorgeladen. Er läuft dann
out TCNT0,a ; .. tmrprld mal durch bevor ein Interrupt auftritt
out ocr0a,a ;Prescaler tmrprs in OCR0A
ret ;=====----->>>>>
;
;
;================================================= ==================================
; Interrupt-Service-Routine
;#######>>>>> Muss real nicht zuerst der (letzte) PC gepusht werden ?
;================================================= ==================================
;
;
isr_ctc: ;=== ISR läuft sowieso auf 880 Interrupts je Sekunde, also 440 Hz
; zum Ansteuern des piezo einfach toggeln
in ac,pinb
sbrs ac,piezo ;Ist Rampe vom piezo an?
rjmp pinan ;Piezo war aus, also anschalten
;
pinaus: ;=== piezo ist an, also ausschalten, ebenso LED/PB3
cbi portb,piezo
rjmp iraus
;
pinan: ;=== piezo ist aus, also den und LED/PB3 anschalten
sbi portb,piezo
;
iraus:
reti ;=====----->>>>>
;
;================================================= ==================================
; Ende des Quellcodes
;================================================= ==================================

Ich schalte den Ausgang "piezo" mit einer Taste ein. Der Piezo jammert solange, wie die Taste gedrückt wird. Funktioniert - aber es ist eigentlich nix für menschliche Ohren ](*,)

Ja, und noch meinen "Schaltplan" aus dem Quellcode.


; +--------+
; Vcc --------+ LP2950 +-------tiny13-Vcc---------------------------+
; (9VBlock) |3 1| \ Taste |
; | 2 | tiny13-PB0---+----+ |----------------+
; +---+----+ |
; | +-----+ |
; +------------+ 10K +------+
; | +-----+
; | rLED|\ |
; | tiny13-PB3-----------------| >+------+
; | |/ | |
; | |
; | tiny13-PB4-----Piezosummer-----------+
; | |
; | +------+ |
; GND-------------+------------tiny13-GND-----+ 100R +--------------+
; +------+
taylor22 - musst Dir halt für Deinen µC umpfriemeln.

Übrigens gibts ein Demo auch in Hochsprache:
https://www.roboternetz.de/wissen/index.php/RN-Control_Demoprogramm_in_C
unter "/*### Sound durch den Speaker ausgeben ###*/"

Vitis
09.11.2007, 13:13
Naja, nen Sound kann man auch über PWM als DA-Wandler und
dann Tabelle mit Sinuswerten erzeugen, klingt dann etwas
runder, ist aber mehr Programmieraufwand.
Auch eine Möglichkeit währe extern diskret nen Bandpass
einzubauen, der die Flanken von dem Rechtecksignal etwas bricht.

DeltaEx
09.11.2007, 13:46
Kennt jemand bei Reichelt ein mini-Lautsprecher den man nehmen könnte?

oberallgeier
09.11.2007, 13:56
Naja, nen Sound kann man auch über PWM als DA-Wandler und dann Tabelle mit Sinuswerten erzeugen ...
??? Uuups - soweit bin ich (als Anfänger) ja nun leider noch nicht :( Wie mach ich das dann ? Hättest Du da bitte einen Tip? Wenigstens so ungefähr?


... ist aber mehr Programmieraufwand...
Als Anfänger muss ich ja programmieren, programmieren, programmieren . . . :)


... Auch eine Möglichkeit währe extern diskret nen Bandpass
einzubauen, der die Flanken von dem Rechtecksignal etwas bricht...
Also Bandpass sagt mir IM PRINZIP schon was - aber noch nix vom Schaltungsaufbau her. Ich hatte lediglich mal Kondensatoren drangehalten. 47 µ Elko schluckt (hatte ich fast erwartet) das ganze Signal, 100n keramisch - da hört man sozusagen die abgerundeten Ecken - im Oskar hatte ich das noch nicht angeguckt.

Hatte beim Versender mit dem grossen C nach irgendwelchen Tönern nachgesehen - da gibts nix, was ich brauchen könnte. Jetzt bin ich halt noch am Weitersuchen - sozusagen bis zum AB-Pfeifen. Aber ich will eben einen pfeifenden µC. Und bekanntllich hat der Herr nach dem "wollen" den Schweiss gesetzt #-o

taylor22
10.11.2007, 11:09
ok besten dank für die vielen antworten! ich könnte mir das auch folgendermassen vorstellen zu machen: gebe rechteck signal aus (tönt eigentlich gar nich so schlecht wenn man eh nur einen piepston augeben will) und wenn mir das dann zu sehr auf den wecker geht, mache ich einen tiefpass mit grenzfrequenz sagen wir mal bei 1000Hz oder so und dann filtert man noch die oberschwingungen weg, was dann ein angenähertes sinus-signal ergben müsste oder?!