mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [AVR] Duty-Cycle von 0 mit Timern


Autor: fliiiiieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgenden Code:
TCCR0B = (1 << CS00);
TCCR0A = (1 << WGM01);
OCR0A = 0xFF;
OCR0B = 0x00;
TIMSK0 |= (1 << OCIE0A) | (1 << OCIE0B);

Damit wird in der ISR für COMPA der Pin auf HIGH gestellt 
(Grundfrequenz) und für COMPB auf LOW gestellt (Duty-Cycle).
Wenn ich den Duty-Cycle verändern will, setze ich einfach einen neuen 
Wert für OCR0B.
Mein Problem ist jetzt aber, dass ich trotz OCR0B == 0 eine geringe 
Spannung ausgegeben bekomme.
Kann mir jemand erklären, warum? Was müsste ich verändern/verbessern, 
damit bei OCR0B == 0 keine Spannung ausgegeben bekomme?

Danke!

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst einen der phase/frequency correct mode nutzen.

RFTM.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Kann mir jemand erklären, warum?

Datenblatt (Fast PWM Mode):

If the OCR0A is set equal to BOTTOM, the output will be a narrow spike 
for each MAX+1 timer clock cycle.

Das gilt auch für OCR0B.

Neben dem was Falk geschrieben hat, kannst du auch bei OCR0B=0 den Timer 
vom Ausgang trennen oder invertierte PWM verwenden.

MfG Spess

Autor: Route 6. (route_66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk B. schrieb:
> Du musst einen der phase/frequency correct mode nutzen.
>
> RFTM.

Was heisst eigentlich "RFTM"?

Das Problem bei Abkürzungen ist wohl, dass nur Eingeweihte denn Sinn 
kennen.

Hier im Forum habe ich bereits öfters "RTFM" gelesen, was wohl soviel 
wie "Read The F*cking Manual" heisst.
Aber RFTM ???

Autor: Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Route 6. schrieb:
> Aber RFTM ???

Typischer Vertipper. Wohl einem WFE geschuldet.

Autor: fliiiiieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk B. schrieb:
> Du musst einen der phase/frequency correct mode nutzen.
>
> RFTM.

Die Nachteile daran sind nur, dass man auf einen Pin festgelegt ist. So 
bleibt man flexibel und kann sich einen Outputpin aussuchen.

spess53 schrieb:
> Hi
>
>>Kann mir jemand erklären, warum?
>
> Datenblatt (Fast PWM Mode):
>
> If the OCR0A is set equal to BOTTOM, the output will be a narrow spike
> for each MAX+1 timer clock cycle.
>
> Das gilt auch für OCR0B.
>
> Neben dem was Falk geschrieben hat, kannst du auch bei OCR0B=0 den Timer
> vom Ausgang trennen oder invertierte PWM verwenden.
>
> MfG Spess

Ich wusste doch, dass ich irgendsoetwas einmal im Datasheet gelesen 
habe. Ich habe die Stelle nur irgendwie nicht wiedergefunden.
Danke. Ich werde wohl noch ein Statusbit einfach hinzufügen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ich werde wohl noch ein Statusbit einfach hinzufügen.

Wozu?

MfG spess

Autor: fliiiiieger (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
spess53 schrieb:
> Hi
>
>>Ich werde wohl noch ein Statusbit einfach hinzufügen.
>
> Wozu?
>
> MfG spess

Damit ich mich nicht auf einen Pin festlegen muss. Das soll nämlich 
möglichst flexibel sein. Und bei automatischem Toggle muss ich sogar 
gleich zwei Pins opfern: OC0A und OC0B.
Oder wie meinst du das?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Damit ich mich nicht auf einen Pin festlegen muss. Das soll nämlich
>möglichst flexibel sein.

Ich stehe mehr auf saubere Planung im Vorfeld.

>Und bei automatischem Toggle muss ich sogar
>gleich zwei Pins opfern: OC0A und OC0B.

Du brauchts nur die, die notwendig sind. Also zwischen 0 und 2. Da wird 
garnichts geopfert.

MfG Spess

Autor: fliiiiieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Du brauchts nur die, die notwendig sind. Also zwischen 0 und 2. Da wird
> garnichts geopfert.

Nachteil dabei wäre allerdings doch auch noch, dass ich noch externe 
Komponenten brauche. Weil ich muss das Ergebnis ja noch irgendwie 
zusammenfügen. Da bräuchte ich entsprechend noch ein AND-Gate, oder 
nicht?

Allerdings habe ich derzeit auch noch ein weiteres Problem. Ich habe 
folgenden Code:
#include "audio.h"
#include <avr/io.h>
#include <avr/interrupt.h>

static volatile uint8_t play;
static volatile uint32_t rate;
static volatile uint32_t rate_counter;
static volatile uint8_t* audio_;
static volatile uint16_t size_;

ISR(TIMER0_COMPA_vect)
{
  AUDIO_OUTPUT_PORT |= (1 << AUDIO_OUTPUT_POS);
}

ISR(TIMER0_COMPB_vect)
{
  AUDIO_OUTPUT_PORT &= ~(1 << AUDIO_OUTPUT_POS);
}

void audio_init()
{
  AUDIO_OUTPUT_DDR |= (1 << AUDIO_OUTPUT_POS);

  TCCR0B = (1 << CS00);
  TCCR0A = (1 << WGM01);
  OCR0A = 0xFF;
  OCR0B = 0x00;

  sei();
}

void audio_intr()
{
  if(play)
  {
    rate_counter += rate;

    if((rate_counter >> 16) < size_)
      OCR0B = audio_[(uint8_t)(rate_counter >> 16)];
    else
      audio_stop();
  }
}

uint8_t audio_active()
{
  return play;
}

void audio_play_mono(uint16_t sampling_rate, uint8_t* audio, uint16_t size)
{
  if(!play)
  {
    audio_ = audio;
    size_ = size;
    rate = sampling_rate * 65536L / (double)22050;
    rate_counter = 0x00;

    play = 0x01;
    TIMSK0 |= (1 << OCIE0A) | (1 << OCIE0B);
  }
}

void audio_stop()
{
  play = 0x00;
  OCR0B = 0x00;  /* 128 */
  TIMSK0 &= ~(1 << OCIE0A) & ~(1 << OCIE0B);
}

audio_intr() wird dabei mit 22050Hz aufgerufen. Die Samplingrate beträgt 
ebenfalls 22050Hz.
Allerdings wird dabei, wenn ich einen Buffer von einer SDCard einlese, 
immer nur eine Art Rauschen abgespielt. Man erkennt das Original nicht 
einmal annähernd. Es stimmt noch nicht einmal die Länge.
Weiß denn jemand, woran das liegen könnte?

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: fliiiiieger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Falk B. schrieb:
> Beitrag "Re: Arduino Nano, SD Card, PCM"

Ich war wohl das erste Mal zu voreilig. In dem Code stand tatsächlich 
einiges, was man auch übernehmen kann.
Inzwischen läuft es auch.

Allerdings ist die ganze Zeit noch ein Hintergrundrauschen da, wenn ich 
Musik abspiele. Wenn ich allerdings den Duty-Cycle gleich lasse (128), 
dann höre ich nichts (f=~60kHz).
Was hattest du denn bei deinen Aufnahmen für einen Filter dahinter? 
Einfach nur ein RC-Glied? Oder noch eine Spule? Wenn ja, wie genau 
geschaltet? Und vor allem auch wie dimensioniert. Vorausgesetzt, du 
weißt das noch.
Ich habe jetzt in der Aufnahme einen 220R Widerstand und einen 1mF ElKo 
genommen.

Autor: fliiiiieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch vergessen zu erwähnen: das obige Beispiel waren 44.1kHz.

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ fliiiiieger (Gast)

>Allerdings ist die ganze Zeit noch ein Hintergrundrauschen da, wenn ich
>Musik abspiele.

Hmm. In deiner Aufnahme ist das nicht so recht zu hören, aber die 
Qualität ist auch eher begrenzt, so wie die Lautstärke.

>Was hattest du denn bei deinen Aufnahmen für einen Filter dahinter?

Gar keinen, nur den Kopfhörer.

>geschaltet? Und vor allem auch wie dimensioniert. Vorausgesetzt, du
>weißt das noch.

Steht im Beitrag, es gab nur einen 100uF Koppelkondensator.

Autor: fliiiiieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk B. schrieb:
> @ fliiiiieger (Gast)
>
>>Allerdings ist die ganze Zeit noch ein Hintergrundrauschen da, wenn ich
>>Musik abspiele.
>
> Hmm. In deiner Aufnahme ist das nicht so recht zu hören, aber die
> Qualität ist auch eher begrenzt, so wie die Lautstärke.

Ja, tatsächlich hört man das in der Aufnahme sogar eigentlich gar nicht.
Mein Nachbar hat sonst ein ordentliches Aufnahmegerät, ich werde morgen 
einmal nachfragen, ob ich mir das nicht kurz ausleihen kann. Vllt. hört 
man es darauf besser.
Wobei das eigentlich auch zu leise ist. Der 1mF ElKo ist wohl einfach zu 
groß, der dämpft das ordentlich ab. Vllt. versuche ich es sonst auch mal 
mit 9V oder so.
Aber es ist halt immer wie so ein Hintergrundrauschen. Wie beim Radio, 
wenn man knapp neben der richtigen Frequenz ist.

>>Was hattest du denn bei deinen Aufnahmen für einen Filter dahinter?
>
> Gar keinen, nur den Kopfhörer.

Ich habe jetzt einmal kleine alte PC-Boxen angeschlossen. Es klingt zwar 
deutlich besser, aber das Rauschen ist immer noch da.

>>geschaltet? Und vor allem auch wie dimensioniert. Vorausgesetzt, du
>>weißt das noch.
>
> Steht im Beitrag, es gab nur einen 100uF Koppelkondensator.

Tatsächlich, das habe ich wohl überlesen.
Sonst probiere ich noch einmal einfach mit der Dimensionierung herum. 
Den Widerstand muss ich, glaube ich, auch reduzieren.

Danke aber, man erkennt zumindest die Melodie.

Autor: fliiiiieger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Okay, jetzt noch einmal in besserer Aufnahmequalität.
Leise ist es allerdings immer noch, weshalb ich es mit Audacity noch 
verstärkt habe.

Ich habe es jetzt einmal mit dieser Schaltung versucht:
https://upload.wikimedia.org/wikipedia/commons/9/9...
und dann noch mit einem einfachen Kondenator parallel zu dem 
Lautsprecher.
Beides klingt ziemlich gleich.
Ich habe jetzt immer 100µF ElKos genommen.

Autor: fliiiiieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niemand eine Idee?

Autor: fliiiiieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich brauche ja noch nicht einmal eine Lösung.
Nur eine Idee, warum es bei mir nicht funktioniert.
Hier sind so viele erfahrene Leute, wodurch kann solch ein Rauschen denn 
entstehen? An der PWM-Frequenz kann es eigentlich nicht liegen, da die 
mit 44kHz ja weit außerhalb des hörbaren Bereichs sein müsste.

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ fliiiiieger (Gast)

>Ich habe es jetzt einmal mit dieser Schaltung versucht:
>https://upload.wikimedia.org/wikipedia/commons/9/9...

Die braucht man für einen Kopfhörer nicht.

>und dann noch mit einem einfachen Kondenator parallel zu dem
>Lautsprecher.

Wenn dein Lautsprecher keinen internen Verstärker hat, ist die Last für 
den AVR-Ausgang zu hoch. Da kann viel passieren, u.a.. Verzerrungen. Ob 
das hier der Fall ist, weiß ich nicht.

Hmm, dein Rauschen ist komisch. Zeig mal deinen vollständigen Quelltext.
Vielleicht hast du auch die WAV-Dateien falsch konvertiert. Da gibt es 
diverse Stolperallen mit Einer und Zweierkomplement. Nimm mal die Daten 
hier, die sollten DIREKT abspielbar sein und nicht rauschen.

https://www.mikrocontroller.net/topic/goto_post/5194701

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch ne Idee. Es kann ein Softwarefehler sein. Es klingt fast so, als ob 
jedes 2. Sample unsinnige Daten auf die PWM gibt. Dadurch hört man eine 
Mischung aus Rauschen und dem echten Signal.

Autor: fliiiiieger (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Erst einmal danke für deine Antworten.

Falk B. schrieb:
> Die braucht man für einen Kopfhörer nicht.

Was meinst du denn sonst mit Koppelkondensator? Einen einzelnen 
Kondensator in Reihe zu dem Lautsprecher? Parallel?

Falk B. schrieb:
> Wenn dein Lautsprecher keinen internen Verstärker hat, ist die Last für
> den AVR-Ausgang zu hoch. Da kann viel passieren, u.a.. Verzerrungen. Ob
> das hier der Fall ist, weiß ich nicht.
>
> Hmm, dein Rauschen ist komisch. Zeig mal deinen vollständigen Quelltext.
> Vielleicht hast du auch die WAV-Dateien falsch konvertiert. Da gibt es
> diverse Stolperallen mit Einer und Zweierkomplement. Nimm mal die Daten
> hier, die sollten DIREKT abspielbar sein und nicht rauschen.
>
> https://www.mikrocontroller.net/topic/goto_post/5194701

Ich habe über einen Transistor verstärkt.
Mit den wav-files von dir hört man quasi nur noch Rauschen und kann fast 
gar nichts erkennen außer den Rufen ganz am Schluss. Ich habe die 8000Hz 
probiert. Ich habe sonst aber auch immer raw-files ohne wav-Container 
benutzt. Aber das macht klanglich keinen Unterschied, wie ich jetzt 
bemerken durfte.
Anbei einmal der Quellcode. Zum Einlesen wird FatFS benutzt. Nicht 
besonders schöner Code, bei Fragen bitte einfach hier schreiben.

Autor: S. Landolt (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
> TCCR0A = (1 << COM0A1) | (1 << WGM00); /* clear OC0A on comp. match */
> TCCR0B = (1 << CS00) | (1 << WGM02); /* no prescaler, phase correct pwm*/

Stimmt der Modus? Ich hätte eher 1 erwartet statt 5.
Um welchen uC geht es eigentlich, das muss ich irgendwie verpasst haben.

Autor: fliiiiieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
S. Landolt schrieb:
>> TCCR0A = (1 << COM0A1) | (1 << WGM00); /* clear OC0A on comp.
> match */
>> TCCR0B = (1 << CS00) | (1 << WGM02); /* no prescaler, phase correct pwm*/
>
> Stimmt der Modus? Ich hätte eher 1 erwartet statt 5.
> Um welchen uC geht es eigentlich, das muss ich irgendwie verpasst haben.

Das ist es.
Tatsächlich.
VIELEN Dank.
Was genau macht der Modus 5 denn aber eigentlich anders? Irgendwie 
verstehe ich da das Datenblatt nicht ganz.

Autor: S. Landolt (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Im Modus 5 gibt OCRA den TOP-Wert vor, d.h. die Frequenz, hier jedoch 
soll mit OCRA der Tastgrad, die eigentliche PWM, bestimmt werden.
  (Da findet sich sicher noch jemand, der das besser erklärt)

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ fliiiiieger (Gast)

>> Stimmt der Modus? Ich hätte eher 1 erwartet statt 5.
>> Um welchen uC geht es eigentlich, das muss ich irgendwie verpasst haben.

>Das ist es.
>Tatsächlich.
>VIELEN Dank.

Also läuft deine Audiowiedergabe jetzt ohne Rauschen?

Autor: fliiiiieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk B. schrieb:
> @ fliiiiieger (Gast)
>
>>> Stimmt der Modus? Ich hätte eher 1 erwartet statt 5.
>>> Um welchen uC geht es eigentlich, das muss ich irgendwie verpasst haben.
>
>>Das ist es.
>>Tatsächlich.
>>VIELEN Dank.
>
> Also läuft deine Audiowiedergabe jetzt ohne Rauschen?

Ja. Ich verstehe zwar irgendwie immer noch nicht so ganz 100%-ig warum, 
aber es läuft.

Autor: Falk B. (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@fliiiiieger (Gast)

>> Also läuft deine Audiowiedergabe jetzt ohne Rauschen?

>Ja. Ich verstehe zwar irgendwie immer noch nicht so ganz 100%-ig warum,
>aber es läuft.

Du hattest den falschen Timer-Modus aktiviert. An stelle der PWM 
(Pulsbreitenmodulation) hast du eine Frequenzmodulation erzeugt. Man hat 
zwar trotzdem was gehört, weil dabei natürlich auch die Breite der Pulse 
variabel ist und es ungefähr wie PWM wirkt, aber dabei entsteht viel 
"Unsinn" als Signal, was bei dir als Rauschen hörbar wurde.

Autor: S. Landolt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch ein Versuch: Ein Digitalsignal soll hörbar gemacht werden, also ist 
eine Digital-Analog-Wandlung verlangt; als Verfahren wird hier die 
Pulsbreitenmodulation (PWM) gewählt. Der Timer0-Modus 5 mit OCRA als 
Eingangsgröße ist aber keine PWM.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.