Outils pour utilisateurs

Outils du site


controleur_pololu_mc33926_shield_arduino

Différences

Cette page vous affiche les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue comparative

controleur_pololu_mc33926_shield_arduino [2013/07/18 17:47] (Version actuelle)
ldo créée
Ligne 1: Ligne 1:
 +Le controleur [[http://​www.pololu.com/​catalog/​product/​2503|MC33926]] de POLOLU permet de commander 2 moteurs à courant continu bidirectionnel très facilement. Il est conçu pour être utiliser avec une ARDUINO mais il peut très bien être utilisé de manière indépendante.
  
 +==== Présentation ====
 +Ce module est basé sur 2 pont H MC33926 de Freescale. Le MC33926 permet de commander un moteur à courant continu avec une tension comprise entre 5 et 28V et peut délivrer un courant de 3A. Il est protégé contre les inversions de polarité.
 +
 +Il est possible de commander la vitesse (PWM) et le sens de rotation (DIR) de chaque moteur indépendamment. Le module est capable de détecter une erreur (SF). Il peut également nous retourner l'​image du courant consommé pour chaque moteur (FB).
 +
 +==== Exemple ====
 +Nous l'​avons testé avec une ARDUINO UNO (ATMEGA328P) en langage C.
 +
 +=== Configuration ===
 +Les signaux de sens (pin 7 et 8) sont configurés en sortie. Les signaux PWM (pin 9 et 10) sont générés par le Timer 1. Les fonctions de configuration du PWM sont expliquées ici. Le signal d'​erreur (pin 12) est configuré en entrée. La conversion analogique / numérique doit être activée pour la lecture des consommations en courant de chaque moteur. Les fonctions de configuration du convertisseur analogique / numérique sont expliquées ici.
 +
 +<code c>
 +/* ARDUINO UNO - ATMEGA328P
 + * 4 (PD4) : nD2 (enable)
 + * 7 (PD7) : M1 DIR
 + * 8 (PB0) : M2 DIR
 + * 9 (PB1 / OC1A) : M1 PWM
 + * 10 (PB2 / OC1B) : M2 PWM
 + * 12 (PB4) : nSF (status flag)
 + *
 + * A0 (PC0 / ADC0) : M1FB
 + * A1 (PC1 / ADC1) : M2FB
 + * */
 +void
 +mc33926_setup(void)
 +{
 +  DDRB |= (1 << PB0); /* initialize PB0(M2 DIR) pin as output pin */
 +  PORTB &= ~(1 << PB0);
 +  DDRB &= ~(1 << PB4); /* initialize PB4(nSF) pin as input pin */
 +
 +  DDRD |= (1 << PD4) | (1 << PD7); /* initialize PD4(nD2) and PD7(M1 DIR) pins as output pins */
 +  PORTD &= ~(1 << PD7);
 +  PORTD |= (1 << PD4); /* enable */
 +
 +  pwm_1_setup();​
 +
 +  pwm_1A_enable();​
 +  pwm_1B_enable();​
 +
 +  adc_setup();​
 +}
 +</​code>​
 +
 +=== Fonctions ===
 +Ensuite, nous avons créé des fonctions qui permettent au robot d'​avancer,​ de reculer et de tourner.
 +
 +<code c>
 +/* stop */
 +void
 +mc33926_stop(void)
 +{
 +  pwm_1A_write(0);​
 +  PORTD &= ~(1 << PD7); /* M1 DIR (PD7) = 0 */
 +
 +  pwm_1B_write(0);​
 +  PORTB &= ~(1 << PB0); /* M2 DIR (PB0) = 0 */
 +}
 +
 +/* advance
 + * speed from 0 to 255 */
 +void
 +mc33926_advance(uint8_t m1_speed, uint8_t m2_speed)
 +{
 +  pwm_1A_write(m1_speed);​
 +  PORTD |= (1 << PD7); /* M1 DIR (PD7) = 1 */
 +
 +  pwm_1B_write(m2_speed);​
 +  PORTB |= (1 << PB0); /* M2 DIR (PB0) = 1 */
 +}
 +
 +/* back off
 + * speed from 0 to 255 */
 +void
 +mc33926_back_off(uint8_t m1_speed, uint8_t m2_speed)
 +{
 +  pwm_1A_write(m1_speed);​
 +  PORTD &= ~(1 << PD7); /* M1 DIR (PD7) = 0 */
 +
 +  pwm_1B_write(m2_speed);​
 +  PORTB &= ~(1 << PB0); /* M2 DIR (PB0) = 0 */
 +}
 +
 +/* turn left
 + * speed from 0 to 255 */
 +void
 +mc33926_turn_left(uint8_t m1_speed, uint8_t m2_speed)
 +{
 +  pwm_1A_write(m1_speed);​
 +  PORTD |= (1 << PD7); /* M1 DIR (PD7) = 1 */
 +
 +  pwm_1B_write(m2_speed);​
 +  PORTB &= ~(1 << PB0); /* M2 DIR (PB0) = 0 */
 +}
 +
 +/* turn right
 + * speed from 0 to 255 */
 +void
 +mc33926_turn_right(uint8_t m1_speed, uint8_t m2_speed)
 +{
 +  pwm_1A_write(m1_speed);​
 +  PORTD &= ~(1 << PD7); /* M1 DIR (PD7) = 0 */
 +
 +  pwm_1B_write(m2_speed);​
 +  PORTB |= (1 << PB0); /* M2 DIR (PB0) = 1 */
 +}
 +</​code>​
 +
 +Et des fonctions pour récupérer les informations sur la consommation en courant des moteurs et d'une éventuelle erreur.
 +
 +<code c>
 +/* return error status */
 +uint8_t
 +mc33926_get_fault(void)
 +{
 +  return ~((PINB >> PB4) & 0x01);
 +}
 +
 +/* current sens voltage output proportional to motor current (525mV/A)
 + * 5v = 1024 adc counts -> 9mA / adc counts */
 +
 +/* return motor 1 current value in milliamps */
 +uint16_t
 +mc33926_get_m1_current(void)
 +{
 +  return adc_read(0) * 9;
 +}
 +
 +/* return motor 2 current value in milliamps */
 +uint16_t
 +mc33926_get_m2_current(void)
 +{
 +  return adc_read(1) * 9;
 +}
 +</​code>​
 +
 +=== Fonction principale ===
 +<code c>
 +void
 +setup(void)
 +{
 +  mc33926_setup();​
 +}
 +
 +int
 +main(void)
 +{
 +  setup();
 +
 +  while (1)
 +    {
 +      mc33926_turn_right(200,​200);​
 +    }
 +}
 +</​code>​
controleur_pololu_mc33926_shield_arduino.txt · Dernière modification: 2013/07/18 17:47 par ldo