Forum: Mikrocontroller und Digitale Elektronik Problem mit PWM - Tiny13


von Basier (Gast)


Lesenswert?

Guten Abend,

ich möchte mit einem tiny13 über einen Poti eine PWM erzeugen.
Der Poti wird an PB3 genschlossen und zwischen VCC und GND aufgespannt.
Soweit komme ich mit dem testen aber auch gar nicht.

Irgendetwas scheint mit dem PWM nicht zu stimmen. Ich habe testeshalber 
erstmal eine LED an PB1 angeschlossen. Und einen festen Wert an OCR0B 
übergeben.
Die LED leuchtet nicht.

Wenn ich die komplette main bis auf DDRB = 0xFF; PORTB = 0x00; 
auskommentiere, dann geht auch die LED an.

Obwohl ich das Datenblatt relativ gewissenhaft gelesen habe, hat sich 
ein Fehler eingeschlichen.
Die Datei ist trotz vieler Zeilenumbrüche lediglich 60 Zeilen lang und 
gut kommentiert. Ich hoffe, jemand von euch kann eben über die Datei 
fliegen?
Ich bin gerade etwas am verzweifeln.


http://pastebin.com/4z3993E6


Bester Gruß.

von Carl D. (jcw2)


Lesenswert?

DB Tiny13 sagt:
COM0Bn schaltet Portvalue durch, aber ändert nicht das zugehörige 
DDR-Bit.
Also DDRB auf Ausgang setzen!

von Basier (Gast)


Lesenswert?

Fck.

Dank dir. Ich habe schon rot gesehen :)

1 Mhz / 1024 = 977 Hz << Meint ihr, die Frequenz ist zu langsam für 
einen Motor?

von Carl D. (jcw2)


Lesenswert?

Für irgendeinen sicher.
Andererseits muß man schon alt werden, um einen 1kHz-Pfeifer nicht mehr 
zu hören ;-)

Ob der (Gleichstrom?-)Motor deine PWM mag, sagt er u.A. über seine 
Temperatur. Und falls nicht, hat man es mit deutlich mehr kHz einfacher 
ein LC-Filter davor zu bauen. Ich würde den Prescaler mal von 1024 auf 
64 oder sogar 8 ändern. Dann pfeift nix mehr.

von Basier (Gast)


Lesenswert?

Danke für die Info. Ich versuche es mal mit einem anderen Prescaler.

Aktuell habe ich noch Probleme mit dem ADC. Scheinbar funktioniert die 
ISR doch nicht wie gedacht.

Ich muss mal UART implementieren, damit ich vernünftig debuggen kann ://
Mit nur einer LED ist irgendwie doof.

von Isrenable (Gast)


Lesenswert?

> Aktuell habe ich noch Probleme mit dem ADC. Scheinbar funktioniert die
> ISR doch nicht wie gedacht.

hmm. ADCSRA |= (1 << ADSC); ?

von Basier (Gast)


Lesenswert?

Oh, ADCSRA |= (1 << ADSC); (Zeile 49) steht auch in der main.
Daran liegt es nicht.

von Basier (Gast)


Lesenswert?

In der setup() richte ich den ADC ein und in der ISR werden die Werte 
aufaddiert. Irgendwie scheint aber in der setup() etwas falsch zu sein.
Über eine Schleife in der Main geht es jedenfalls. Jedoch nicht im Free 
Running. Sieht da jemand einen Fehler?
1
static uint32_t sum;
2
3
ISR( ADC_vect )
4
{
5
  static uint8_t  f;
6
  sum += ADC;
7
  
8
  f++;
9
10
  if(f == 0)
11
  {
12
    // tue etwas mit dem oversampling
13
    sum = 0;
14
  }
15
}
16
17
void setup()
18
{
19
  ADMUX |= (1 << MUX1) | (1 << MUX0); // PB3
20
21
  ADCSRA |= (1 << ADPS1) | (1 << ADPS0);
22
  ADCSRA |= (1 << ADIF) | (1 << ADIE); // Interrupt enable
23
  ADCSRA |= (1 << ADATE);
24
  
25
  ADCSRA |= (1 << ADEN); // ADC enable
26
  
27
  ADCSRA |= (1 << ADSC); // ADC Start Conversion
28
  // Ab hier sollte das Free Running laufen und die ADC ISR aufrufen
29
}

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.