Pb avec PCA9685

Bonjour,

j'essaye de faire fonctionner la carte PCA9685 (pilotage de led pour l'instant) avec une arduino DUE, mais impossible de la faire fonctionner.
La carte PCA9685 est branché en I2C sur la arduino Due via un driver PCA9517.

je souhaiterai une pin en PWM (pour commande d'un moteur) et d'autre pin TOR

J'ai utilisé le soft scanner pour déjà tester la connexion, et j'ai bien quelque chose en 0x40. mais impossible d'activer une sortie.

     Wire.begin();     // Init I2C
     
     pwm.begin();
     pwm.setPWMFreq(1600);  // This is the maximum PWM frequency

     pwm.setPWM(PIN_PWM, 4090, 6);            // turns pin PWM
     pwm.setPWM(PIN_PWM_LED_A, 0, 4096);       // turns pin fully off
     pwm.setPWM(PIN_PWM_LED_B, 0, 4096);       // turns pin fully off

.
.
.

    pwm.setPWM(PIN_PWM_LED_A, 4096, 0);       // turns pin fully on
    pwm.setPWM(PIN_PWM_LED_B, 4096, 0);       // turns pin fully on

Lors du scan j'ai aussi un périphérique en 0x70 qui m'est inconnu.

Bonjour,

"Carte PCA9685" -> Je connais pas
Je peux connaître le circuit intégré en recherchant sa datasheet mais "la carte" = inconnue.

Je pense que tu as du lire trop vite le message "Règles du forum francophone" car tu aurais du donner un lien vers la carte en question (lien technique ou commercial).

Autre point à vérifier :
DUE = signaux d'amplitude max 3,3V
Le reste du montage est en 3,3V ou en 5V

lien vers la carte : Adafruit 16-Channel 12-bit PWM/Servo Driver - I2C interface [PCA9685] : ID 815 : $14.95 : Adafruit Industries, Unique & fun DIY electronics and kits

La carte est alimenté en 5V, et il y a un adaptateur de niveau entre la DUE et cette carte 3V3 <-> 5V avec un circuit PCA9517

C'est quoi une pin TOR ?

TOR = Tout Ou Rien

vincent84:
Lors du scan j'ai aussi un périphérique en 0x70 qui m'est inconnu.

Voir ici peut-être

@fdufnews: je saurai maintenant ce qu'est un TOR :slight_smile:

@vincent84: Pourquoi utiliser une carte PCA 9685 pour sortir une seule PWM ?

J’utilise la carte pour sortir 1 seul PWM, car j’avais réalisé il y a quelques année une carte d’interface pour une DUE avec (E/S analogique, / E/S numérique, I2C, SPI, interface afficheur graphique) et je n’avais pas pensé un sortie une PWM.

Donc je n’ai trouvé que cela pour faire un PWM

Mais le microcontroleur de la DUE est capable de faire nativement de la PWM !
J'avais pensé à un pb de courant limité sur les sorties de la DUE qui est assez fragile de ce côté.

Voir l'une de ces bibliothèques (commencer par regarder les exemples) pour sortir un signal PWM en spécifiant la fréquence et le duty cycle voulus:

oui je sais que la Due est capable de faire du PWM, mais sur ma carte je n'ai plus de sortie dispo. Il faudrait que je démonte tout pour faire des modifs. Mais le soucis c'est qu'elle fonctionne en ce moment pour ma piscine cette carte.

A6 et A7 sont déjà prises ?

A6 et A7 sont des entrées analogiques

A6 et A7 sont des entrées analogiques

Sur ?
Je ne connais pas la DUE mais Arduino a la sale habitude d’appeler "pin analogiques" des pins parfaitement numériques dont la fonction secondaire est d'être aussi capable de faire des mesures analogiques.

Tu as une carte utile pour la DUE ici :Due pinout diagram - Arduino Due - Arduino Forum

A6 et A7 sont les pins "physique" 84 et 85 (numérotation boîtier)

84 et 85 sont des E/S Numérique
ref Atmel PA3 et PA2
ref Arduino D60 et D61

84 et 85 ont pour seconde fonction la mesure analogique :
Ref Atmel : AD1 et AD0
Ref Arduino A6 et A7

Page 858 du datasheet Sam3x:

TIOA1 = PA2 ; TIOB1 = PA3

Donc le Timer Counter 0 canal 1 peut sortir un signal PWM sur PA2 et PA3, il suffit de programmer ledit Timer Counter.

Un exemple pour une fréquence de 500 KHz:

/******************************************************************/
/*       Timer Counter 0 Channel 1, namely TC1, 500 KHz frequency   */
/******************************************************************/

void setup() {

  pinMode(LED_BUILTIN, OUTPUT);
  tc_setup();

}

void loop() {

}

void tc_setup() {

  PMC->PMC_PCER0 |= PMC_PCER0_PID28;                      // TC1 power ON : Timer Counter 0 channel 1 IS TC1 - see page 38

  PIOA->PIO_PDR |= PIO_PDR_P2;                            // Set the pin to the peripheral
  PIOD->PIO_ABSR &= ~PIO_PA2A_TIOA1;                       // Peripheral type A

  TC0->TC_CHANNEL[1].TC_CMR = TC_CMR_TCCLKS_TIMER_CLOCK1  // MCK/2 = 42 M Hz, 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 TIOA1 on RA compare match
                              | TC_CMR_ACPC_SET;          // Set TIOA1 on RC compare match


  TC0->TC_CHANNEL[1].TC_RC = 84;  //<*********************  Frequency = (Mck/2)/TC_RC  Hz
  TC0->TC_CHANNEL[1].TC_RA = 42;  //<********************   Any Duty cycle in between 1 and TC_RC


  TC0->TC_CHANNEL[1].TC_IER = TC_IER_CPCS;//TC_IER_CPAS;
  NVIC_EnableIRQ(TC1_IRQn);
  TC0->TC_CHANNEL[1].TC_CCR = TC_CCR_SWTRG | TC_CCR_CLKEN; // Software trigger TC1 counter and enable
}

void TC1_Handler() {

  static uint32_t Count;

  TC0->TC_CHANNEL[1].TC_SR;                               // Read and clear status register
  if (Count++ > 500000) {  // For 500 KHz
    Count = 0;
    PIOB->PIO_ODSR ^= PIO_ODSR_P27;                       // Toggle LED every 1 Hz
  }
}