Forum: Mikrocontroller und Digitale Elektronik xmega und HW-PWM


von Andreas B. (Firma: none) (suicide0)


Lesenswert?

Hallo,
ich "spiele" gerade mit nem XMega32a4 herum.
Das Teil schreit auf Grund seiner features geradezu danach
als Ambilight zu arbeiten.

PWM habe ich auf 6 Kanälen mit 16 Bit am laufen (funzt ganz gut)
ist über ISRs realisiert.
Jetzt stellt sich mir eine Frage:
Kann der XMega32A4 das auch komplett hardwaremäßig abbilden?
Was ich meine ist, kann der Timer selbstständig Pins an und ausschalten?
Wenn ja, wie viele Kanäle mit 16Bit und evtl hat jemand einen 
Codeschnipsel.
Danke
Gruß
Andreas

von Sabler (Gast)


Lesenswert?

Wenn ich mal Fragen darf...
... Womit Programmierst du den? Mit einem AVR Programming Tool AT AVR 
ISP2 mit USB (so wie dieses: 
http://www.reichelt.de/?;ACTION=3;LA=2;GROUPID=2969;ARTICLE=45040;SID=28FJVob6wQARwAAEnfKXs40dd83f4e320264b7b04770a73a890cd)
... Entwickelst du die Software mit WinAVR - bzw kann man den Compiler 
verwenden?

von Simon K. (simon) Benutzerseite


Lesenswert?

Türlich kann der das!
Port C und Port D haben jeweils 6 PWM Ausgänge.

von Andreas B. (Firma: none) (suicide0)


Angehängte Dateien:

Lesenswert?

@sabler
Jo, genau den nehme ich dafür (AVR ISP Mk2). Der kann, wenn Du das 
aktuelle AVR-Studio benutzt, nach Firmware update PDI!
Als Software nehme ich AVR-Studio+WinAVR. Klappt alles ganz prima!
Habe mir in Eagle ein (minimalistisches) Breakoutboard gemacht damit ich 
auf dem Breadboard
experimentieren kann (falls jemand Interesse hat, würde ich das Layout 
posten).

Klappt alles super!

@Simon, nach dem ich das Datenblatt nun fast auswendig kann ;-) ...
habe ich das auch herausgefunden (trotzdem Danke).

Für alle die in die Materie Xmega einsteigen hänge einfach mal
2 codefragmente an für HW-PWM und 3 channel ADC.

TIMER für HW PWM configurieren:

 // Setup Timer D0 to HW-PWM
  PORTD.DIR = 0xFF;
  PORTD.OUT = 0x00;
  TCD0.CTRLA = 0x03;    // divide clock by 4
  TCD0.PER = 0xFFFF;    // set resolution to 16Bit
  TCD0.CCA = 0x4FA0;    // Dutycycle A
  TCD0.CCB = 7000;      // B
  TCD0.CCC = 8000;      // C
  TCD0.CCD = 40000;     // D
  TCD0.CTRLB = 0xF3;    // enable frequency generation for all 4 
Channels


ADC mit ADC0 ADC1 und ADC2:

 // Setup ADC
  ADCA.CTRLA = 0x01;      // enable
  ADCA.CTRLB = 0x0C;      // unsigned mode 8Bit and freerun
  ADCA.REFCTRL = 0x10;    // internal reference to VCC/1.6
  ADCA.EVCTRL = 0xC0;     // sweepmode for channel 0,1 and 2
  ADCA.PRESCALER = 0x02;  // prescaler to 16 = 2MHz@32Mhz Systemclock
  // Channel 0
  ADCA.CH0.CTRL = 0x01;   // input mode single-ended-positive
  ADCA.CH0.MUXCTRL = 0x04;// muxctrl to ADC0Pin
  // Channel 1
  ADCA.CH1.CTRL = 0x01;   //input mode single-ended-positive
  ADCA.CH1.MUXCTRL = 0x08;// muxctrl to ADC1Pin
  // Channel 2
  ADCA.CH2.CTRL = 0x01;   //input mode single-ended-positive
  ADCA.CH2.MUXCTRL = 0x10;//muxctrl to ADC2Pin


  // Enable IRQs@all Levels (High, Middle und Low)
  PMIC.CTRL=0x07;
  asm("sei");

jetzt kann man den ADC pollen:

    while ((ADCA.INTFLAGS & 0x07) != 0x07)
    {
      asm("nop");
    } // wait for ADCA to be ready

    b3=ADCA.CH0RESL;        // read 8Bit value
    ADCA.INTFLAGS |= 0x07;  // restart conversion

von Marco L. (lehmi)


Lesenswert?

Hab auch mal gerade nach dem PWMs geschaut, der hat ja noch den Port E 
mit 4 PWM Kanäle. Das wären dann 3x4+2x2 und damit sollte man doch schon 
ein nettes Ambilight a 4 x RGBW / RGBY zusammenbauen können. Halt eine 
Farbe für jede Ecke :). Da könnt ich ja fast schwach werden und meine 
1xRGBY Platine überarbeiten (wenn wieder Zeit ist).

von Andreas B. (Firma: none) (suicide0)


Lesenswert?

Ich sag ja, der schreit förmlich danach ;-)
Habe noch keinen controller gesehen, der besser passen würde.
Bei dem Preis des 32A4 kommt man auf Gesamtkosten der Schaltung
von etwa 10-15 EU.
Da die ADCs ja jetzt auch ralativ schnell sind, müßte da was
echt brauchbares bei rauskommen.
Ich habe mal ein Ambilight mit nem Mega88 gebaut und selbst das
Ding hat ganz gut funktioniert (es waren aber definitv zu wenig
Messungen möglich).
Gruß
Andreas

von Marco L. (lehmi)


Lesenswert?

Andreas B. schrieb:

> Ich habe mal ein Ambilight mit nem Mega88 gebaut und selbst das
> Ding hat ganz gut funktioniert (es waren aber definitv zu wenig
> Messungen möglich).

Hast du das mal irgendwo dokumentiert? Schaltplan o.ä.? Ich hab zwar 
keinen Fernseher, aber eine Verwendung finde ich bestimmt ;)

von Andreas B. (Firma: none) (suicide0)


Lesenswert?

Leider nein, hatte das Ding auf Lochraster aufgebaut.
Dein Eingangsteil hatte ich abgekupftert vom Aurrolight oder so hieß das
Ding glaube ich.
Ich bin aber gerade dabei die Platine für die Version mit dem XMega zu
layouten.
Wenn du noch etwas wartest kann ich Dir die schicken.
Gruß
Andreas

von Sabler (Gast)


Lesenswert?

Oder am besten einen Wiki Arktikel schreiben ;-)

von Andreas B. (Firma: none) (suicide0)


Lesenswert?

Werde ich gern machen, wenn es jemanden interessiert.
bin aber kein Profi sondern mache das nur hobbymäßig.
will damit sagen, dass höchstwahrscheinlich Fehler in
Soft und HW sein weden.
Aber funktionieren wird es trotzdem ;-)
Gruß
Andreas

von stromflo (Gast)


Lesenswert?

Hi,

das ist so nicht ganz richtig:

ADCA.EVCTRL = 0x80;     // sweepmode for channel 0,1 and 2
ADCA.EVCTRL = 0xC0;     // sweepmode for channel 0,1,2 and 3

Gruß Flo

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.