Go Down

Topic: Plusieurs PWM avec une DUE (Read 356 times) previous topic - next topic

ffb_boy_30

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

ard_newbie

#1
Jun 24, 2019, 04:08 pm Last Edit: Jun 24, 2019, 04:09 pm by ard_newbie
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 :

Code: [Select]

/******************************************************************************/
/*                         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;
  }
}
// **************************




kamill

Bonjour,

analogWrite() ne te convient pas?

68tjs

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.






ffb_boy_30

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.

68tjs

#5
Jun 25, 2019, 09:32 am Last Edit: Jun 25, 2019, 09:34 am by 68tjs
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 ?

ard_newbie

#6
Jun 25, 2019, 09:41 am Last Edit: Jun 25, 2019, 09:42 am by ard_newbie
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:

https://github.com/antodom/pwm_lib

https://github.com/antodom/tc_lib




68tjs

#7
Jun 25, 2019, 09:58 am Last Edit: Jun 25, 2019, 10:00 am by 68tjs
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é.

ffb_boy_30

#8
Jun 25, 2019, 04:32 pm Last Edit: Jun 25, 2019, 04:33 pm by ffb_boy_30
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

hbachetti

Quote
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.

::)  :smiley-confuse:
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

68tjs

Quote
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.

Go Up