Arduino Due Hardware PWM

Hallo zusammen,

aktuell versuche ich am Arduino Due einen 4 Pin Lüfter anzusteuern. Die Frequenz des Lüfters soll über die Register einestellt werden. Doch finde ich nirgens einen guten Ansatz und das Datenblatt dazu ist nicht wirklich hilfreich. Bisher habe ich es geschafft die Register auszulesen.

Aktuell kann ich über mein Programm den Lüfter über einen Mosfet an und aus schalten und die Frequenz über die Seriellen Monitor in % angeben.

Ich hoffe mir kann einer da weiterhelfen.

Wo ist Dein sketch?
Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).

Gruß Tommy

Einige Beispiele für PWM, entweder mit dem PWM-Gerät oder mit dem Timer:

Hallo ard_newbie

Dein Beitrag https://forum.arduino.cc/index.php?topic=537586.0 hat mir sehr weitergeholfen. Ich bekomme ein schönes PWM Signal raus, was ich auch einstellen kann,
ABER
das Signal ist nur 300mV stark was am Pin4 rauskommt.

Leider habe ich es nicht ganz geschafft, das Programm auf Pin 3 umzubauen. Über einen kleinen Denkanstoß währe ich sehr dankbar :slight_smile:

/*******************************************************************************/
/*                TIOA7 Frequency = 20 KHz over pin 3                          */
/*******************************************************************************/

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  PMC->PMC_PCER1 |= PMC_PCER1_PID34;                     // TC7 power ON - Timer Counter 2 channel 1 IS TC7 - See page 38

  PIOC->PIO_PDR |= PIO_PDR_P28;                          // The pin is no more driven by GPIO
  PIOC->PIO_ABSR |= PIO_PC28B_TIOA7;                     // Periperal type B  - See page 859

  TC2->TC_CHANNEL[1].TC_CMR = TC_CMR_TCCLKS_TIMER_CLOCK1  // MCK/2, clk on rising edge
                              | TC_CMR_WAVE               // Waveform mode
                              | TC_CMR_WAVSEL_UP_RC        // UP mode with automatic trigger on RC Compare
                              | TC_CMR_ACPA_CLEAR          // Clear TIOA7 on RA compare match  -- See page 883
                              | TC_CMR_ACPC_SET;           // Set TIOA7 on RC compare match

  TC2->TC_CHANNEL[1].TC_RC = 2100;  //<*********************  Frequency = (Mck/2)/TC_RC  Hz = 20 KHz
  TC2->TC_CHANNEL[1].TC_RA = 100;  //<********************   Duty cycle = (TC_RA/TC_RC) * 100  %

  TC2->TC_CHANNEL[1].TC_IER = TC_IER_CPCS;                 // Interrupt on RC compare match
  NVIC_EnableIRQ(TC7_IRQn);

  TC2->TC_CHANNEL[1].TC_CCR = TC_CCR_SWTRG | TC_CCR_CLKEN; // Software trigger TC7 counter and enable

}

void TC7_Handler() {
  static uint32_t Count;
  TC2->TC_CHANNEL[1].TC_SR;
  Count++;
  if (Count == 20000) {
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));  // Toggle every 1 Hz
    Count = 0;
  }
}
void loop() {

}

Hi

Ich sehe nicht, wo Du den Pin3 einstellst - weiter denke ich, daß Du den Pin nicht auf OUTPUT stehen hast und somit nur der interne PullUP den Pin hoch zieht.

MfG