<< The Fribotte Homepage >>
Un club de passionnés en robotique participant à la coupe de France E=M6.
[Accueil] [Qui sommes-nous ?] [Robots] [Coupe e=m6] [BD Technique] [Forum] [Reportages] [Liens] [WiKiFri]

Fribotte


Les données
Les grandes lignes

Le but de cette étude est de réaliser un programme d'asservissement par PID pour 2 moteurs sur un PIC 16F877.
Les 2 moteurs sont équipés d'un compte-tours (encodeurs) émettant N impulsions (ou "pas") par tour.
Les 2 moteurs sont contrôlés par une carte de puissance gérée par deux PWM envoyés par le PIC (voir la page Fribotte sur les pont en H intégrés).

De plus, le 16F877 pourra être commandé par I2C/RS232/liaison // (type bus ISA) suivant la méthode la plus pratique. Le 16F877 pourrait aussi renvoyer des informations au µp/µc central (typiquement l'état des compteurs) afin que celui-ci réalise d'autre asservissement ou des calculs de position.

Cette solution à de plus l'avantage de la flexibilité, de nouvelles fonctions pouvant être ajoutés au 16f877 si il n'est pas saturé par le traitement du PID.

Ce qui peut être ajoute facilement


On peut aussi imaginer utiliser ce programme sur d'autres PIC plus petits (et donc moins cher) comme le 16F873 (54.34 Fr HT chez Farnell).

Le 16F877 pourrait aussi parfaitement gérer sur interruption l'arrêt des moteurs en cas de surintensité ou de problème en général.

On peut aussi prévoir une gestion d'une pente d'accélération ou de décélération. Le PIC augmentant au diminuant de lui-même la consigne jusqu'à atteindre la vitesse voulue.

On peut prévoir aussi un asservissement de position (au sens le moteur doit avancer de N pas) avec forme trapézoïdale (pente d'accélération et de décélération). Mais je n'aime pas trop cette idée. Elle pourrait se limiter à une pente de décélération qui démarre à N pas.

Rien de ce qui est écrit là n'est actuellement réalisé.

 

Exemple étudié : Nikoro

L'exemple étudié pour lequel l'ensemble du programme à été d'abord dimensionné est un robot avançant à 1m/s max, avec 2 moteurs qui ont des roues de roller (diamètre 6cm à peu près) et un réducteur de 11.

Sont reliés aux moteurs des encodeurs optiques récupérés de vieilles imprimantes HP500 N&B à500 impulsions par tour. Des sytèmes professionnels peuvent aller bien plus vite que cet exemple que nous alons étudier, mais il est quand même relativement rapide.

Un autre robot utilise aussi ce programme : Haku a des moteurs maxons équipes d'encodeurs optiques professionels. Ce moteurs génèrent plus d'impulsions que Nikoro.

Référence des moteurs de Nikoro :

http://www.radiospares.fr/
Plus précisément la.

Rapport de réduction de 11 :1
Code commande: 238-9664
200Fr. Rapide et relativement puissants (je ne connais pas encore leur vitesse max en charge). Je ne sais pas encore si ils suffiront à faire avancer rapidement un robot plus gros et lours que Nikoro.


Description des compte-tour (ou encodeurs)

 

Les encodeur (compte-tour) utilisés correspondent à des encodeurs professionnels (type HEDS) récupérés sur deux vieilles imprimantes HP 500.
Alimentés en 5V, ils fournissent chacun 2 signaux carrés en quadrature de phase. Le décalage entre les 2 donne le sens de rotation, comme le montre le schéma suivant avec les 2 sens de rotation possible :


Pour mesurer le sens, il faut donc regarder l'état d'un des signaux quand l'autre signal change d'état.

 

Fréquence max des impulsions


Un des paramètre important pour le dimensionnement est la fréquence max des impulsions envoyés par l'encodeur.
Ici, le moteur (et donc l'encodeur) va tourner à 11*100/(6*3.1416) = 58 tour/s a peu près.

Sur un des signaux de l'encodeur, il y aura donc 30000 impulsions/s (30 impulsions/ms) ce qui correspond à la fréquence du signal, ce qui nous donne 34µs entre 2 fronts montants.
C'est le cas extrême pour cette étude.

Nota : Des test ont étés réussi avec succes sur des asservissements à 46000 impulsions/s (moteurs maxon professionels). Et il semble que la limite ne soit pas encore atteinte.

Rappel : Un asservissement de type PID n'est utile que si la consigne est inférieure à 80% des possibilités du moteurs (voir même 50 %). Ici on dimensionne pour la vitesse mesurée maximum.

N'oublions pas qu'il y aura 2 moteurs à gérer, donc 2 signaux indépendants à traiter.
Rappel : le 16F877 à 20Mhz exécute une instruction toutes les 200 ns.
Rappel : La fréquence max des compteurs interne au PIC est de 10 Mhz, soit 0.1µs (ici on a de la marge !).

Fréquence min des impulsions

Un asservissement de vitesse doit aussi bien permettre d'aller doucement que vite.
Si on part sur une vitesse minimale du robot de 10cm/s, soit 10 fois moins vite, cela nous donne 3000 impulsions/s (3 impulsions/ms), soit 330 µs entre 2 signaux.

Nous essaierons de résoudre le problème aussi bien pour la vitesse rapide que lente.

 



Le choix du PIC, autres pic possibles

Les contraintes donnés ont rendu quasi obligatoire l'usage du PIC 16F877.

Mais soyons bien clair, chaque problème à sa solution propre. Avec Nikoro il fallait un 16F877 (15 Euro chez selectronic), mais d'autre type d'asservissements, d'autres vitesses, pourront fonctionner avec un PIC plus petit, ou même nécessiter un PIC plus puissant.

Une forte contrainte est de pouvoir gérer 2 PID en même temps. Vu la vitesse des impulsions des comptes-tour, il faut allors 2 timers/compteur hardware sur le PIC. Ce qu'a le 16F877, et un troisième timer pour le PWM. Car il faut aussi gerer 2 PWM. Le 16F877 les gèrent en harware, ce qui simplifie énormément le processus. Mais un autre PIC comme le 16F628 a 20Mhz (un 16F84 plus puissant -et moins cher- 5.5 Euro chez selectronic, DIP 18) pourrait facilement gerer un seul PID.

Concernant la vitesse, les 20Mhz du 16F877 suffisent pour le comptage des tours dans l'exemple ici. Pour une vitesse bien plus rapide, un PIC a 40Mhz (il commence a y en avoir) peut être necessaire. Pour une vitesse 2 fois plus lente, un 10Mhz suffit, logique !

Sur les E/S : Il en faut énormement pour gérer les 2 compteurs, les 2 moteurs, la communication, etc ...
Et le 16F877 avec ses 40 I/O suffit mais juste (voir ci dessous).
Avec un seul PWM on peut bien sur prendre un PIC plus petit, comme le 16F628. Mais le 16F876 peut aussi faire l'affaire.

Autre limitation, il faut des E/S specialisées dans la communications pour faire l'interface. Une liaison série ou I2C peuvent se gerer logiciellement, mais ca complique évidemment pas mal le problème du PID à faire en même temps. Le 16F877 gère ces interfaces en harware. Pas de poblème donc à ce niveau la. Il peut aussi gerer une communication data 8 bit comme pour un bus ISA (et donc facilement etre monté sur un tel bus, qu'il soit en PC104 ou non). Si on peut se passer de ce dernier apport, on peut prendre un 16F876 (12 Euros, DIP 28) à la place du 877.

Reste maintenant le cas du 18F452 (15 Euros). Un nouveau PIC programmable en C directement , plus puissant que le 16F877 (équivalent 40Mhz) et qui a, si je ne me trompe pas, tous les E/S du 16F877 (DIP 40). En fait si ce PIC existait quand j'ai commencé ce projet, je l'aurais certainement pris lui à la place du 877. Mais je ferais peut-être une adaptation, qui je l'espère sera rapide :-)

Les prix viennent du catalogue Selectronic 2003, et sont là pour information.

 

Les E/S du PIC

 

Le E/S du 16F877 sont quasiment toutes utilisés. Voici à quoi elles servent :

PORT

PIN

18F876 ?

Description (en plus de l'E/S sur un bit)

Utilisation Finale Utilisation sur le programme actuel

Utilisation sur Le prototype Nicoro

A0

2

Oui

Convertisseur A/N

Détection de sur-inténsité moteur gauche par convertions A/N non utilisé

Réservé pour des E analogiques: Détection de distance avec capteur SHARP.

A1

3

Oui

Convertisseur A/N

Détection de sur-inténsité moteur droit par convertions A/N non utilisé

Réservé pour des E analogiques: Détection de distance avec capteur SHARP.

A2

4

Oui

Convertisseur A/N

2ème  signal encodeur 2 2ème  signal encodeur 2

2ème  signal encodeur 2

A3

5

Oui

Convertisseur A/N

Entrée analogique libre non utilisé

Réservé pour des E analogiques: Détection de distance avec capteur SHARP.

A4

6

Oui

Timer 0

1er encodeur 1er encodeur

Pour le 1er encodeur

A5

7

Oui

Convertisseur A/N

2ème  signal compteur 1 2ème  signal compteur 1

2ème  signal compteur 1

B0

33

Oui

Interruption

Réservé Interruption d'urgence non utilisé

non utilisé

B1

34

Oui

 

Sens 1 Moteur 1 (vers le pont en H) Sens 1 Moteur 1 (vers le pont en H)

Sens 1 Moteur 1 (vers le pont en H)

B2

35

Oui

 

Sens 2 Moteur 1 (vers le pont en H) Sens 2 Moteur 1 (vers le pont en H)

Sens 2 Moteur 1 (vers le pont en H)

B3

36

Oui

Programme

Sens 1 Moteur 2 (vers le pont en H) Sens 1 Moteur 2 (vers le pont en H)

Sens 1 Moteur 2 (vers le pont en H)

B4

37

Oui

Interruption

Sens 2 Moteur 2 (vers le pont en H) Sens 2 Moteur 2 (vers le pont en H)

Sens 2 Moteur 2 (vers le pont en H)

B5

38

Oui

Interruption

I/O numérique

Non utilisé

Non utilisé

B6

39

Oui

Interruption + Programme

Réservé Interruption d'urgence

Non utilisé

Non utilisé

B7

40

Oui

Interruption + Programme

Réservé Interruption d'urgence

Non utilisé

Non utilisé

C0

15

Oui

Timer 1

2ème encodeur 2ème encodeur

Pour le 2ème encodeur

C1

16

Oui

PWM 2

PWM 2 -> Enable moteur 2 (vers le pont en H) PWM 2 -> Enable moteur 2 (vers le pont en H)

PWM 2 -> Enable moteur 2 (vers le pont en H)

C2

17

Oui

PWM 1

PWM 1 -> Enable moteur 1 (vers le pont en H) PWM 1 -> Enable moteur 1 (vers le pont en H)

PWM 1 -> Enable moteur 1 (vers le pont en H)

C3

18

Oui

I2C

I2C Non utilisé

I2C

C4

23

Oui

I2C

I2C Non utilisé

I2C

C5

24

Oui

Synchronous serial port

Peut s'en servir d'I/O numérique Non utilisé

Non utilisé

C6

25

Oui

Asynchronous serial port

Liaison série Liaison série

Liaison série

C7

26

Oui

Asynchronous serial port

Liaison série Liaison série

Liaison série

D0

19

Non

Bus // slave

Réserver pour communication bus ISA

Non utilisé

Afficheur LCD

D1

20

Non

Bus // slave

Réserver pour communication bus ISA

Non utilisé

Afficheur LCD

D2

21

Non

Bus // slave

Réserver pour communication bus ISA

Non utilisé

Afficheur LCD

D3

22

Non

Bus // slave

Réserver pour communication bus ISA

Non utilisé

Afficheur LCD

D4

27

Non

Bus // slave

Réserver pour communication bus ISA

Non utilisé

Afficheur LCD

D5

28

Non

Bus // slave

Réserver pour communication bus ISA

Non utilisé

Afficheur LCD

D6

29

Non

Bus // slave

Réserver pour communication bus ISA

Non utilisé

Afficheur LCD

D7

30

Non

Bus // slave

Réserver pour communication bus ISA

Non utilisé

Afficheur LCD

E0

8

Non

Bus // slave

Réserver pour communication bus ISA

Non utilisé

Afficheur LCD

E1

9

Non

Bus // slave

Réserver pour communication bus ISA

Non utilisé

Afficheur LCD

E2

10

Non

Bus // slave

Réserver pour communication bus ISA

Non utilisé

Afficheur LCD

Un peu d'explictions :

Il faut 2 E/S (une numérique et l'autre sur un compteur) par encodeur, et il y a 2 encodeur. Il faut placer un des deux signaux des encodeur sur les compteurs hardware du PIC.

Il faut aussi utiliser les 2 PWM hardware pour les deux moteurs. 2 E/S par moteur sont aussi necessaire pour donner le sens de rotation (ou frein, ou roue libre).

Le PIC peut être directement relié à une resistance de 1 homs par moteur sur ses entrées analogiques. Elle permet au PIC de mesurer l'intensité du courrant sur les moteurs, et donc de faire un coupe-circuit logiciel si besoin. Ce n'est pas fait actuellement.

Il faut ensuite prévoir les I/O pour la communication : I2C, série, et bus //. Juste Série actuellement.

Quelques I/O restent libre pour activer par exemple des arrets d'urgence.

Le PIC peut aussi retourner les valeurs des entrées des E/S.

 



Complétez cette page, posez vos questions et remarques ici : WiKiFri

Page http://fribotte.free.fr/bdtech/PidSurPic/PidSurPic1.html modifiée le 13/09/2004.
Copyright fribotte@free.fr, libre de droit pour toute utilisation non commerciale.
Reproduction autorisée par simple mail