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


von fliiiiieger (Gast)


Lesenswert?

Hallo,

ich habe folgenden Code:
1
TCCR0B = (1 << CS00);
2
TCCR0A = (1 << WGM01);
3
OCR0A = 0xFF;
4
OCR0B = 0x00;
5
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!

von Falk B. (falk)


Lesenswert?

Du musst einen der phase/frequency correct mode nutzen.

RFTM.

von spess53 (Gast)


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

von Route_66 H. (route_66)


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 ???

von Thomas E. (thomase)


Lesenswert?

Route 6. schrieb:
> Aber RFTM ???

Typischer Vertipper. Wohl einem WFE geschuldet.

von fliiiiieger (Gast)


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.

von spess53 (Gast)


Lesenswert?

Hi

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

Wozu?

MfG spess

von fliiiiieger (Gast)


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?

von spess53 (Gast)


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

von fliiiiieger (Gast)


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:
1
#include "audio.h"
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
5
static volatile uint8_t play;
6
static volatile uint32_t rate;
7
static volatile uint32_t rate_counter;
8
static volatile uint8_t* audio_;
9
static volatile uint16_t size_;
10
11
ISR(TIMER0_COMPA_vect)
12
{
13
  AUDIO_OUTPUT_PORT |= (1 << AUDIO_OUTPUT_POS);
14
}
15
16
ISR(TIMER0_COMPB_vect)
17
{
18
  AUDIO_OUTPUT_PORT &= ~(1 << AUDIO_OUTPUT_POS);
19
}
20
21
void audio_init()
22
{
23
  AUDIO_OUTPUT_DDR |= (1 << AUDIO_OUTPUT_POS);
24
25
  TCCR0B = (1 << CS00);
26
  TCCR0A = (1 << WGM01);
27
  OCR0A = 0xFF;
28
  OCR0B = 0x00;
29
30
  sei();
31
}
32
33
void audio_intr()
34
{
35
  if(play)
36
  {
37
    rate_counter += rate;
38
39
    if((rate_counter >> 16) < size_)
40
      OCR0B = audio_[(uint8_t)(rate_counter >> 16)];
41
    else
42
      audio_stop();
43
  }
44
}
45
46
uint8_t audio_active()
47
{
48
  return play;
49
}
50
51
void audio_play_mono(uint16_t sampling_rate, uint8_t* audio, uint16_t size)
52
{
53
  if(!play)
54
  {
55
    audio_ = audio;
56
    size_ = size;
57
    rate = sampling_rate * 65536L / (double)22050;
58
    rate_counter = 0x00;
59
60
    play = 0x01;
61
    TIMSK0 |= (1 << OCIE0A) | (1 << OCIE0B);
62
  }
63
}
64
65
void audio_stop()
66
{
67
  play = 0x00;
68
  OCR0B = 0x00;  /* 128 */
69
  TIMSK0 &= ~(1 << OCIE0A) & ~(1 << OCIE0B);
70
}

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?

von Falk B. (falk)


Lesenswert?


von fliiiiieger (Gast)


Angehängte Dateien:

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.

von fliiiiieger (Gast)


Lesenswert?

Noch vergessen zu erwähnen: das obige Beispiel waren 44.1kHz.

von Falk B. (falk)


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.

von fliiiiieger (Gast)


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.

von fliiiiieger (Gast)


Angehängte Dateien:

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/99/Breitbandverst%C3%A4rker.GIF
und dann noch mit einem einfachen Kondenator parallel zu dem 
Lautsprecher.
Beides klingt ziemlich gleich.
Ich habe jetzt immer 100µF ElKos genommen.

von fliiiiieger (Gast)


Lesenswert?

Niemand eine Idee?

von fliiiiieger (Gast)


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.

von Falk B. (falk)


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

von Falk B. (falk)


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.

von fliiiiieger (Gast)


Angehängte Dateien:

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.

von S. Landolt (Gast)


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.

von fliiiiieger (Gast)


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.

von S. Landolt (Gast)


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)

von Falk B. (falk)


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?

von fliiiiieger (Gast)


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.

von Falk B. (falk)


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.

von S. Landolt (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.