Outils pour utilisateurs

Outils du site


controleur_pololu_mc33926_shield_arduino

Le controleur 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.

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

Fonctions

Ensuite, nous avons créé des fonctions qui permettent au robot d'avancer, de reculer et de tourner.

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

Et des fonctions pour récupérer les informations sur la consommation en courant des moteurs et d'une éventuelle erreur.

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

Fonction principale

void
setup(void)
{
  mc33926_setup();
}
 
int
main(void)
{
  setup();
 
  while (1)
    {
      mc33926_turn_right(200,200);
    }
}
controleur_pololu_mc33926_shield_arduino.txt · Dernière modification: 2013/07/18 17:47 par ldo