mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR 16Bit PWM flakert unregelmässig


Autor: Markus Gerber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag, ich bin Anfänger und arbeite neu mit einem Atmega 162 und 
möchte 4 verschiedene 16Bit PWM generieren.
Ich habe ein simples Programm geschrieben um die PWM zu testen, ich 
erhöhe die Pulsweite bis ans Maximum, und verkleinere sie dann bis ans 
Minimum und so weiter und sofort. Soweit funktioniert die PWM gut, 
ausser dass sie eine Störung aufweisst. Die LED flakert kurz, wenn die 
PWM an das Maximum gelangt.
Das passiert meistens, jedoch nicht immer, die Störung ist also nicht 
regelmässig.

Ich bin verwirrt..
Habe ich einen Fehler beim Setzen der Register gemacht?
Habe ich sonst etwas übersehen oder nicht korrekt gemacht?

mfg Markus
/*******************************************************************************



#define F_CPU 4000000L


#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h> 


long tab[256]={ 0, 1, 1, 1, 1,   1, 1, 1, 1, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6,
6, 7, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11,
11, 12, 12, 13, 13, 14, 15, 15, 16, 17, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
29, 31, 32, 33, 35, 36, 38, 40, 41, 43, 45,
47, 49, 52, 54, 56, 59, 61, 64, 67, 70, 73,
76, 79, 83, 87, 91, 95, 99, 103, 108, 112,
117, 123, 128, 134, 140, 146, 152, 159, 166,
173, 181, 189, 197, 206, 215, 225, 235, 245,
256, 267, 279, 292, 304, 318, 332, 347, 362,
378, 395, 412, 431, 450, 470, 490, 512, 535,
558, 583, 609, 636, 664, 693, 724, 756, 790,
825, 861, 899, 939, 981, 1024, 1069, 1117,
1166, 1218, 1272, 1328, 1387, 1448, 1512,
1579, 1649, 1722, 1798, 1878, 1961, 2048,
2139, 2233, 2332, 2435, 2543, 2656, 2773,
2896, 3025, 3158, 3298, 3444, 3597, 3756,
3922, 4096, 4277, 4467, 4664, 4871, 5087,
5312, 5547, 5793, 6049, 6317, 6596, 6889,
7194, 7512, 7845, 8192, 8555, 8933, 9329,
9742, 10173, 10624, 11094, 11585, 12098,
12634, 13193, 13777, 14387, 15024, 15689,
16384, 17109, 17867, 18658, 19484, 20346,
21247, 22188, 23170, 24196, 25267, 26386,
27554, 28774, 30048, 31378, 32768, 34218,
35733, 37315, 38967, 40693, 42494, 44376,
46340, 48392, 50534, 52772, 55108, 57548,
60096, 62757, 65535};

write_16Bit(int i, int j)
  {
  //cli();
  OCR3AH=(tab[i])>>8;
  OCR3AL=tab[i];
  OCR3BH=(tab[i])>>8;
  OCR3BL=tab[i];
  OCR1AH=(tab[j])>>8;
  OCR1AL=tab[j];
  OCR1BH=(tab[j])>>8;
  OCR1BL=tab[j];
  //sei();
  return 0;
  }


int main(void){

int i=0;
int j=100;
int inc_i=1;
int inc_j=1;

DDRA=0xFF; // Output
DDRB=0xFF; // Output
DDRC=0xFF; // Output
DDRD=0xFF; // Output

ICR3H=0xFF; // set MAX
ICR3L=0xFF; // set MAX
ICR1H=0xFF; // set MAX
ICR1L=0xFF; // set MAX

TCCR3A|=(1<<COM3A1 | COM3A0 | 1<<COM3B1 | COM3B0 |1<<WGM31 );
TCCR3B|=(1<<CS30| 1<<WGM32| 1<<WGM33);
TCCR1A|=(1<<COM1A1 | COM1A0 | 1<<COM1B1 | COM1B0 |1<<WGM11 );
TCCR1B|=(1<<CS10| 1<<WGM12| 1<<WGM13);

cli();

while(1){
  _delay_ms(10);

  if(inc_i==1)i++;
  if(inc_i==0)i--;
  if(inc_j==1)j++;
  if(inc_j==0)j--;


  if(i>253)inc_i=0;
  if(i<1)inc_i=1;
  if(j>253)inc_j=0;
  if(j<1)inc_j=1;

  write_16Bit(i,j);        
    }
return 0;
}

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>TCCR3A|=(1<<COM3A1 | COM3A0 | 1<<COM3B1 | COM3B0 |1<<WGM31 );
>TCCR3B|=(1<<CS30| 1<<WGM32| 1<<WGM33);
>TCCR1A|=(1<<COM1A1 | COM1A0 | 1<<COM1B1 | COM1B0 |1<<WGM11 );
>TCCR1B|=(1<<CS10| 1<<WGM12| 1<<WGM13);

Meinst du nicht, das da noch ein paar Shiftoperatoren fehlen?

MfG Spess

Autor: Markus Gerber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du meinst, ich habe noch nicht alle notwendigen Bit gesetzt?
Wenn ja, welche müsste man noch setzen?

mfg Markus

Autor: Markus Gerber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahh jetzt hab ichs gesehn :) danke!! :)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du mußt den Speicher nicht zumüllen, eine "long" Tabelle ist unnötig.
65535 paßt prima in ein "unsigned int" oder besser "uint16_t".


Beim AVR-GCC sind die Timer auch 16-bittig definiert, muß man also nicht 
umständlich aufsplitten.


Peter

Autor: Markus Gerber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nun ich habe die Fehler korrigiert,

TCCR3A|=(1<<COM3A1 | 1<<COM3A0 | 1<<COM3B1 | 1<<COM3B0 |1<<WGM31 );
TCCR3B|=(1<<CS30| 1<<WGM32| 1<<WGM33);
TCCR1A|=(1<<COM1A1 | 1<<COM1A0 | 1<<COM1B1 | 1<<COM1B0 |1<<WGM11 );
TCCR1B|=(1<<CS10| 1<<WGM12| 1<<WGM13);

dies hatte leider keinen Einfluss auf das Flakern

Autor: Markus Gerber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dass heisst man könnte das so machen:

OCR3A=tab[i];
OCR3B=tab[i];
OCR1A=tab[j];
OCR1B=tab[j];

ok..


die tabelle habe ich nun auch mit einem unsigned int erstellt

unsigned int tab[256]={....};

leider flakert es immer noch.. danke trotzdem!

Autor: Markus Gerber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo ich bins nochmal, es funktioniert jetzt, so wie es sollte, :) 
danke vielmals für die Tipps!!!

mfg Markus

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.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

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