Programmation GPIO SAM3X8E (Arduino Due)
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Programmation GPIO SAM3X8E (Arduino Due)



  1. #1
    Ruffister

    Programmation GPIO SAM3X8E (Arduino Due)


    ------

    Bonjour à tous,

    J'ai à programmer une Arduino Due afin qu'elle génère un signal PWM jusqu'à 1 MHz.
    J'ai choisi le pin 8 de la carte (C22), qui gère le PWM.

    Bon, pour être honnête, je n'arrive ni à faire fonctionner le PWM, ni le basculement de l'état du pin.
    Mais commençons par le changement d'état.

    Datasheet :
    https://ww1.microchip.com/downloads/..._datasheet.pdf

    Pour mon code je me suis aidé de l'exemple p.629 (31.6. I/O Lines Programming Example).


    J'appelle donc ce code d'init :

    Code:
    REG_PIOC_PER = 0x00200000;     // Enables the PIO to control C.22
    //REG_PIOC_PDR = ~REG_PIOC_PER;   // disables P16 to P31
    REG_PIOC_OER = 0x00200000;     // enables output for I/O C.22
    //REG_PIOC_ODR = 0xFFFFFF00;     // disables output for the others pins 
    REG_PIOC_SODR = 0x00000000;    // set the data to be driven
    REG_PIOC_CODR = 0x0FFFFFFF;    // clear the data to be driven
    REG_PIOC_IER = 0x00000000;     // enable input change IT register
    REG_PIOC_IDR = 0xFFFFFFFF;     // disable ""
    REG_PIOC_MDER = 0x00000000;    // enables mutli-drive for none
    REG_PIOC_MDDR = 0xFFFFFFFF;    // disable ""
    REG_PIOC_ABSR = 0x00000000;    // assigns C.22 to the Peripheral A function
    //REG_PIOC_PUER = 0x0F0FFF0F;    // enables pull up resistor
    //REG_PIOC_PUDR = 0xF0F000F0;    
    REG_PIOC_OWER = 0x00200000;    // output write enable register : enables writing PIO_OSDR
    //REG_PIOC_OWDR = 0x0FFF FFF0;    // output write disable register
    Puis, (non écrit dans l'exemple), j'appelle cette ligne afin de passer ma broche à l'état haut :
    Code:
    REG_PIOC_ODSR = 0x00200000;
    Mais... rien.

    Merci par avance pour vos réponses !
    A bientôt.

    -----

  2. #2
    umfred

    Re : Programmation GPIO SAM3X8E (Arduino Due)

    pourquoi ne pas utiliser les facilités offertes par le C Arduino ? http://www.kerrywong.com/2014/09/21/...pwm-frequency/ par exemple

  3. #3
    Ruffister

    Re : Programmation GPIO SAM3X8E (Arduino Due)

    Bonjour,

    Merci pour cette réponse. Je remet le code du site en question ici :

    Code:
    uint32_t pwmPin = 8;
    uint32_t maxDutyCount = 2;
    uint32_t clkAFreq = 42000000ul;
    uint32_t pwmFreq = 42000000ul; 
     
    void setup() {
      pmc_enable_periph_clk(PWM_INTERFACE_ID);
      PWMC_ConfigureClocks(clkAFreq, 0, VARIANT_MCK);
     
      PIO_Configure(
        g_APinDescription[pwmPin].pPort,
        g_APinDescription[pwmPin].ulPinType,
        g_APinDescription[pwmPin].ulPin,
        g_APinDescription[pwmPin].ulPinConfiguration);
     
      uint32_t channel = g_APinDescription[pwmPin].ulPWMChannel;
      PWMC_ConfigureChannel(PWM_INTERFACE, channel , pwmFreq, 0, 0);
      PWMC_SetPeriod(PWM_INTERFACE, channel, maxDutyCount);
      PWMC_EnableChannel(PWM_INTERFACE, channel);
      PWMC_SetDutyCycle(PWM_INTERFACE, channel, 1);
     
      // pmc_mck_set_prescaler(2);
    }
    Malheureusement, avec cette technique, je ne peux générer que des signaux de fréquence multiple de 42 MHz (21 MHz, 10.5 MHz...)
    A l'oscilloscope, pour les multiples pas de souci.

    Par contre, pour générer du 1.00 MHz, impossible : j'obtiens un signal triangulaire à 42 MHz (et ce peu importe la fréquence renseignée).
    J'ai essayé avec :
    • clkAFreq = 42 MHz, pwmFreq = 1 MHz
    • clkAFreq = 4 MHz, pwmFreq = 1 MHz
    Il faut que je puisse générer n'importe quelle fréquence entre 1 Hz et 1 MHz (au gré de quelques calculs intermédiaires bien sûr), mais pour ce cas de figure cette méthode me semble HS.

    Des pistes ?

    Merci par avance

  4. #4
    umfred

    Re : Programmation GPIO SAM3X8E (Arduino Due)

    il faut creuser en modifiant les valeurs définies
    sinon tu peux aussi regarder cette lib https://github.com/antodom/pwm_lib

  5. A voir en vidéo sur Futura

Discussions similaires

  1. programmation ARDUINO
    Par inviteceb56dd5 dans le forum Programmation et langages, Algorithmique
    Réponses: 10
    Dernier message: 21/10/2020, 10h59
  2. [Energie] Programmation Arduino
    Par invite80e40774 dans le forum Électronique
    Réponses: 23
    Dernier message: 14/04/2016, 12h54
  3. Programmation arduino
    Par inviteb9f9dbb8 dans le forum Programmation et langages, Algorithmique
    Réponses: 9
    Dernier message: 09/04/2015, 08h25
  4. programmation arduino
    Par invite3bdc6e4f dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 11/06/2014, 19h31
  5. Programmation Arduino
    Par invited0adfde8 dans le forum Électronique
    Réponses: 0
    Dernier message: 04/05/2013, 20h36