Plusieurs PWM avec une DUE

Bonjour,
Je cherche à générer quatres PWM indépendamment, tous à la même fréquence.
Le fréquence m'importe peu , juste au dessus du khz.
J'ai trouvé plusieurs lib mais ce sont des usines à gazs, je cherche un truc simple et qui ne prend pas trop de ressource.

Merci

Si les 4 PWM ont des fréquences identiques, je suppose qu'elles auront des duty cycle différents.

Première chose à faire, consulter le pinout diagram de Greynomad pour la carte DUE, puis
quelque chose comme ça devrait faire l'affaire pour chaque PWM :

/******************************************************************************/
/*                         PWMH0 1 MHz                                        */
/******************************************************************************/

void setup() {

  //  ***** For debugging only
  pinMode(LED_BUILTIN, OUTPUT);
  //  *********************
  
  PMC->PMC_PCER1 |= PMC_PCER1_PID36;                   // PWM power ON

  PIOC->PIO_PDR |= PIO_PDR_P3;                         // Set PWM pin to a peripheral
  PIOC->PIO_ABSR |= PIO_PC3B_PWMH0;                    // Set PWM pin peripheral type B for PWMH0 (Arduino pin 35)

  PWM->PWM_CLK = PWM_CLK_PREB(0) | PWM_CLK_DIVB(2);    // select Frequency for clock B: Mck/2 = 42 MHz

  PWM->PWM_CH_NUM[0].PWM_CMR = PWM_CMR_CPRE_CLKB;      // The period is left aligned, clock source as CLKB on channel 0
  PWM->PWM_CH_NUM[0].PWM_CPRD = 42;                    // Set the PWM frequency 42 MHz/PWM_CPRD
  PWM->PWM_CH_NUM[0].PWM_CDTY = 21;                     // Set the PWM duty cycle = (CPRD/CDTY) * 100 %

  // *************for debugging only
  PWM->PWM_IER1 = PWM_IER1_CHID0;                      // Interrupt on PWM Channel 0 counter
  NVIC_EnableIRQ(PWM_IRQn);                            // Enable interrupt
  // **********************

  PWM->PWM_ENA = PWM_ENA_CHID0;                        // Enable PWM channel 0
}

void loop() {

}
// *************** For debugging only
void PWM_Handler() {
  static uint32_t Count;
  static boolean Flag;
  PWM->PWM_ISR1;      // Clear status register
  if (Count++ == 1000000) {
    PIOB->PIO_ODSR ^= PIO_ODSR_P27; // The LED blinks with a 1 Hz frequency
    Count = 0;
  }
}
// **************************

Bonjour,

analogWrite() ne te convient pas?

Est-ce la fréquence de PWM choisie par Arduino qui ne te convient pas ?

Il existe une bibliothèque pour gérer la PWM "un peu mieux" que Wiring/arduino.
Tu peux voir si la carte DUE est gérée.

Mais si c'est le coté mastodonte qui te rebute il n'y a que la solution "main dans le cambouis" de la datasheet.
D'un autre coté le compilateur fait du très bon boulot et si tu n'actives pas "des choses qui ne te sont pas utiles" le compilateur les virera.

Salut,
Super AnalogWrite fonctionne bien sauf que j'aurai aimé une fréquence un peu plus élevé.
Par contre si la consigne bouge trop vite vers les extrêmes, le signal du PWM se fige et change d'un coup pour aller vers la consigne.

Je répète : il existe une bibliothèque qui gère mieux la PWM qu'analogWrite.
Gérer mieux signifie plus de réglages possibles dont la fréquence.

Une recherche sur ce forum en te servant de la loupe te donnera les renseignements utiles.

Oui, je l'ai constaté sur un atmega328p : avec analogWrite() le changement de rapport cyclique hoquette pendant plusieurs milli secondes. AnalogWrite est une fonction Arduino, elle fait un certain nombre de contrôles " anti conneries " ce qui a pour conséquence que le basculement n'est pas franc comme quand on utilise directement les registres.

Si tu veux un basculement franc entre 2 rapports cycliques il faut passer par la datasheet et les registres.

Mais est-ce gênant ?

68tjs:
Si tu veux un basculement franc entre 2 rapports cycliques il faut passer par la datasheet et les registres.
Mais est-ce gênant ?

Non, il suffit d'utiliser par exemple l'une de ces bibliothèques ad hoc:

C'est une question de goût et de temps disponible :
Soit on va au plus vite avec des bibliothèques publiques qu'il faut quand même analyser, parce que avoir une confiance aveugle parce que c'est sur github c'est quand même osé.
Soit on paufine et dans le cas de la PWM il n'y a pas beaucoup de registres à connaître.

Il y a le temps de l'homme actif qui cours toujours et le temps du retraité.

Merci les gars .
Super tes librairies "ard_newbie" , en mettant le nez dans le code j'ai pu trouvé mon bonheur.

Problème résolu

Il y a le temps de l'homme actif qui cours toujours et le temps du retraité.

Il faut aussi beaucoup de temps bien souvent pour analyser le code des autres et l'essayer, et c'est ce que l'on attend en général d'un bon softeux.
On peut aussi pêcher dans le code des autres de l'inspiration pour son propre code.

J'ai rencontré les deux syndromes :

Le syndrome du "made here" ou "invented here" : c'est développé chez nous donc c'est caca.

Le syndrome du "not made here" ou "not invented here" : c'est développé ailleurs donc c'est caca.

::slight_smile: :confused:

Il faut aussi beaucoup de temps bien souvent pour analyser le code des autres et l'essayer, et c'est ce que l'on attend en général d'un bon softeux.

Tout à fait d'accord.

Tellement d'accord que je généralise a tous les domaines d'activité.
La Connaissance ne descend pas du ciel comme l’Illumination sur Boudha, elle se construit comme un mur, chacun ajoute sa brique.

On voit quand même des demandeurs qui ne sont intéressés que par appliquer les bibliothèques dont on leur fourni un lien pour la télécharger. Utiliser un moteur de recherche est déjà trop difficile, on va dire que ce sont des gens pris par le temps.