DUE PWM erzeugen, direkt mit den Registern

Hallo,
Ich brauche zur komfortablen Steuerung eines CO2 Lasernetzteils ein PWM Signal.
Dies sollte sowohl in der Frequenz als auch im Tastverhältnis änderbar sein.

Die Register schauen beim ARM anders aus als bei den Atmega's. (sonst wäre es einfach)
Ich habe etwas gesucht und auch das Datenblatt zu Rate gezogen.

Gefunden habe ich dieses Beispiel
Die Variante mit PWM Controller und mit der Funktion InitPWMController_MCLK() wäre mit Anpassungen genau das was ich suche.
Da meine Hardware an PortC.28 (D3) und nicht an PortC.23 habe ich den Code in diesem Bereich entprechend geändert.

void InitPIO()
{
    //Because we are using PORTC.PIN23 in peripheral B mode
    //  we need to enable the clock for that line.
    PMC->PMC_PCER0 = _BV(ID_PIOC);


     
    //Disable PIO Control on PC23 and set up for Peripheral B PWML7 
    //PWM Pin 6 on the board
    PIOC->PIO_PDR = PIO_PC23;
    PIOC->PIO_ABSR = PIO_PC23;
     
    //Enable output on C23
    PIOC->PIO_OER = PIO_PC23;
     
    //Enable pull-up on pin
    PIOC->PIO_PUDR = PIO_PC23;
}

PortC.28 ist ja auch ein PWM Pin beim Due.

Wenn ich das Teste wird der Pin wie erwartet auf High gezogen aber kein PWM erzeugt.
ich muß gestehen, das ich nicht alles was im Datenblatt steht richtig verstehe.

zb. PMC Peripheral Clock Enable Register 1 (PMC_PCER1) was ist mit den PID's gemeint.
Dem PWM Controller muß doch gesagt werden, an welchen Pin er das PWM Signal ausgeben soll.

  //Because we are using PORTB.PIN25 in peripheral B mode
    //  we need to enable the clock for that line.
    PMC->PMC_PCER0 = _BV(ID_PIOB);

Denke hier klemmt es, weil ich eben den PortC.28 habe.
Vermutlich muß hier noch was geändert werden ?

Im Datenblatt unter 28.15.23 (PMC Peripheral Clock Enable Register 1) zu finden.

Keiner eine Idee ?
Der Due wird wohl nicht von vielen Usern genutzt, obwohl der ARM bei größeren Projekten Vorteile bietet.

Die Register der Atmega's sind bei vielen schon im Kopf ohne das Datenblatt lesen zu müssen.

Beim Arm ist halt vieles anders.
Meine Probleme liegen darin, das Datenblatt richtig zu interpretieren.

Hallo,

das Problem ist, dass Deine Frage wenig mit ARM zu tun hat. Die ganze IO-Ansteuerung macht jeder Hersteller selber, oft noch für jede Chipfamilie anders. Das bedeutet, die Frage ist wirklich SAM3 spezifisch.

Da hilft es auch nicht, dass man beim Teensy oder den ganzen mbed Boards, über die High-Level API die Frequenz und das Tastverhältnis einstellen kann. Was man da im Quelltext findet, hilft beim Due nicht weiter.

Wer es mit dem Due machen will, muss eben alles selber machen.

ArduFE:
Wer es mit dem Due machen will, muss eben alles selber machen.

Ich mache es mir ja meist selbst :wink: :wink: , aber es schadet nicht nachzufragen wie es sich andere selbst machen :wink:

Ok im Ernst, Problem war der Pin3 der unter Arduino als ein PWM Pin bezeichnet wird.
Auch die Arduinofunktion analogWrite() funktioniert mit diesem Pin.

Im Datenblatt unter 38.5.1 gibt es eine Liste der I/O Lines für PMW in diesem Modus.
Und dort ist der Pin3 (PortC28) eben nicht dabei.

Kaum nimmt man einen Pin aus der Liste schon funktioniert es. :slight_smile: