- Matériaux nécessaires:
- Calcul de la vitesse et de la distance parcourue:
- Schéma de circuit et configuration matérielle:
- Simulation:
- Programmation de votre PIC16F877A:
- Explication de travail:
Mesurer la vitesse / régime d'un véhicule ou d'un moteur a toujours été un projet fascinant à essayer pour nous. Donc, dans ce projet, nous allons en construire un en utilisant les microcontrôleurs PIC industriels. Nous utiliserons un morceau d'aimant et un capteur à effet Hall pour mesurer la vitesse. Il existe d'autres moyens / capteurs pour mesurer la vitesse, mais l'utilisation d'un capteur à effet Hall est bon marché et peut également être utilisée sur tout type de moteur / véhicule. En faisant ce projet, nous améliorerons également nos compétences dans l'apprentissage du PIC16F877A puisque le projet implique l'utilisation d'interruptions et de minuteries. À la fin de ce projet, vous pourrez calculer la vitesse et les distances parcourues par tout objet en rotation et les afficher sur un écran LCD 16x2. Commençons par ce circuit de compteur de vitesse et d'odomètre numérique avec PIC.
Matériaux nécessaires:
- PIC16F877A
- Régulateur de tension 7805
- Capteur à effet Hall (US1881 / 04E)
- Écran LCD 16 * 2
- Un petit morceau d'aimant
- Fils de connexion
- Condensateurs
- Planche à pain.
- Source de courant
Calcul de la vitesse et de la distance parcourue:
Avant de commencer à construire le circuit, comprenons comment nous allons utiliser un capteur à effet Hall et un aimant pour calculer la vitesse d'une roue. Auparavant, nous avons utilisé la même technique pour créer un compteur de vitesse Arduino qui affiche des lectures sur un téléphone intelligent Android.
Un capteur à effet Hall est un appareil capable de détecter la présence d'un aimant en fonction de sa polarité. Nous collons un petit morceau d'aimant sur la roue et plaçons le capteur Hall à proximité de telle sorte que chaque fois que la roue tourne, le capteur Hall le détecte. Nous utilisons ensuite l'aide des minuteries et des interruptions sur notre microcontrôleur PIC pour calculer le temps nécessaire pour une rotation complète de la roue.
Une fois que le temps pris est connu, nous pouvons calculer le RPM en utilisant les formules ci-dessous, Où 1000 / temps pris nous donnera le RPS et le multiplier par 60 vous donnera le RPM
rpm = (1000 / prise dans le temps) * 60;
Où (1000 / prise de temps) donne les rps (révolutions par seconde) et il est multiplié par 60 pour convertir les rps en rpm (révolutions par minute).
Maintenant, pour calculer la vitesse du véhicule, nous devons connaître le rayon de la roue. Dans notre projet, nous avons utilisé une petite roue jouet qui a un rayon de seulement 3 cm. Mais, nous avons supposé que le rayon de la roue était de 30 cm (0,3 m) afin de pouvoir visualiser les lectures.
La valeur est également multipliée par 0,37699 puisque nous savons que Velocity = (RPM (diamètre * Pi) / 60). Les formules sont simplifiées jusqu'à
v = rayon de la roue * tr / min * 0,37699;
Une fois que nous calculons la vitesse, nous pouvons également calculer la distance parcourue en utilisant une méthode similaire. Avec notre disposition Hall et aimant, nous savons combien de fois la roue a tourné. Nous connaissons également le rayon de la roue, à l'aide duquel nous pouvons trouver la circonférence de la roue, en supposant que le rayon de la roue est de 0,3 m (R), les valeurs de circonférence Pi * R * R seront de 0,2827. Cela signifie qu'à chaque fois que le capteur à effet Hall rencontre l'aimant, une distance de 0,2827 mètres est parcourue par la roue.
Distance_covered = distance_covered + circonférence_of_the_circle
Depuis, nous savons maintenant comment ce projet fonctionnera, passons à notre schéma de circuit et commençons à le construire.
Schéma de circuit et configuration matérielle:
Le schéma de circuit de ce projet de compteur de vitesse et d'odomètre est très simple et peut être construit sur une maquette. Si vous avez suivi les tutoriels PIC, vous pouvez également réutiliser le matériel que nous avons utilisé pour apprendre les microcontrôleurs PIC. Ici, nous avons utilisé la même carte de performance que nous avons construite pour le clignotement des LED avec le microcontrôleur PIC, comme indiqué ci-dessous:
Les connexions des broches pour le microcontrôleur PIC16F877A sont indiquées dans le tableau ci-dessous.
S.Non: |
Code PIN |
Nom de la broche |
Connecté à |
1 |
21 |
RD2 |
RS de l'écran LCD |
2 |
22 |
RD3 |
E de l'écran LCD |
3 |
27 |
RD4 |
D4 de l'écran LCD |
4 |
28 |
RD5 |
D5 de l'écran LCD |
5 |
29 |
RD6 |
D6 de l'écran LCD |
6 |
30 |
RD7 |
D7 de l'écran LCD |
sept |
33 |
RB0 / INT |
3 ème broche du capteur Hall |
Une fois que vous avez construit votre projet, il devrait ressembler à ceci dans l'image ci-dessous
Comme vous pouvez le voir, j'ai utilisé deux boîtes pour placer le moteur et un capteur à effet Hall à proximité. Vous pouvez fixer l'aimant sur votre objet en rotation et intacte le capteur à effet Hall à proximité de manière à ce qu'il puisse détecter l'aimant.
Remarque: le capteur Hall a des polarités, alors assurez-vous quel pôle il détecte et placez-le en conséquence.
Assurez-vous également d'utiliser une résistance Pull-up avec la broche de sortie du capteur Hall.
Simulation:
La simulation de ce projet se fait à l'aide de Proteus. Étant donné que le projet implique des objets en mouvement, il n'est pas possible de démontrer le projet complet en utilisant la simulation, mais le fonctionnement de l'écran LCD peut être vérifié. Chargez simplement le fichier hexadécimal dans la simulation et simulez-le. Vous pourrez remarquer que l'écran LCD fonctionne comme indiqué ci-dessous.
Pour vérifier que le compteur de vitesse et le compteur kilométrique fonctionnent, j'ai remplacé le capteur à effet Hall par un appareil à état logique. Pendant la simulation, vous pouvez cliquer sur le bouton d'état logique pour déclencher l'interruption et vérifier si la vitesse et la distance parcourues sont mises à jour comme indiqué ci-dessus.
Programmation de votre PIC16F877A:
Comme indiqué précédemment, nous utiliserons l'aide des minuteries et des interruptions du microcontrôleur PIC16F877A pour calculer le temps nécessaire pour une rotation complète de la roue. Nous avons déjà appris à utiliser les minuteries dans notre tutoriel précédent. J'ai donné le code complet du projet à la fin de cet article. En outre, j'ai expliqué quelques lignes importantes ci-dessous.
Les lignes de code ci-dessous initialisent le port D en tant que broches de sortie pour l'interfaçage LCD et RB0 en tant que broche d'entrée pour l'utiliser comme broche externe. En outre, nous avons activé la résistance de rappel interne à l'aide de OPTION_REG et avons également défini 64 comme prévente. Nous activons ensuite l'interruption globale et périphérique pour activer la minuterie et l'interruption externe. Pour définir RB0 comme bit d'interruption externe, INTE doit être mis à l'état haut. La valeur de dépassement de capacité est fixée à 100 de sorte que pour chaque milliseconde, l'indicateur d'interruption de temporisation TMR0IF sera déclenché. Cela aidera à exécuter un minuteur en millisecondes pour déterminer le temps pris en millisecondes:
TRISD = 0x00; // PORTD déclaré comme sortie pour l'interface LCD TRISB0 = 1; // DEfinir la broche RB0 comme entrée à utiliser comme broche d'interruption OPTION_REG = 0b00000101; // Timer0 64 as prescalar // Active également PULL UPs TMR0 = 100; // Charge la valeur de temps pendant 1 ms; delayValue peut être compris entre 0 et 256 uniquement TMR0IE = 1; // Activer le bit d'interruption du temporisateur dans le registre PIE1 GIE = 1; // Activer l'interruption globale PEIE = 1; // Activer l'interruption périphérique INTE = 1; // Activer RB0 comme broche d'interruption externe
La fonction ci-dessous sera exécutée chaque fois qu'une interruption est détectée. Nous pouvons nommer la fonction selon notre souhait, je l'ai donc nommée speed_isr (). Ce programme traite deux interruptions, l'une est l'interruption du minuteur et l'autre est l'interruption externe. Chaque fois qu'une interruption de minuterie se produit, le drapeau TMR0IF devient haut, pour effacer et réinitialiser l'interruption, nous devons le réduire en définissant TMR0IF = 0 comme indiqué dans le code ci-dessous.
void interruption speed_isr () {if (TMR0IF == 1) // Le minuteur a dépassé {TMR0IF = 0; // Effacer l'indicateur d'interruption du minuteur milli_sec ++; } si (INTF == 1) {rpm = (1000 / milli_sec) * 60; vitesse = 0,3 * tr / min * 0,37699; // (En supposant que le rayon de la roue est de 30 cm) INTF = 0; // efface le drapeau d'interruption milli_sec = 0; distance = distance + 028,2; }}
De même, lorsqu'une interruption externe se produit, le drapeau INTF passe à l'état haut, cela doit également être effacé en définissant INTF = 0. Le temps pris est maintenu en piste par l'interruption de minuterie et l'interruption externe détermine quand la roue a effectué une rotation complète. Avec ces données, la vitesse et la distance parcourues par la roue sont calculées à chaque interruption externe.
Une fois la vitesse et la distance calculées, elles peuvent être simplement affichées sur l'écran LCD à l'aide de nos fonctions LCD. Si vous êtes nouveau dans les écrans LCD, reportez-vous à notre tutoriel d'interfaçage LCD avec PIC16F877A MCU.
Explication de travail:
Une fois le matériel et les logiciels prêts, téléchargez simplement le code sur votre PIC16F877A. Si vous êtes complètement nouveau sur PIC, vous devriez avoir à lire quelques tutoriels pour savoir comment télécharger le programme sur un microcontrôleur PIC16F877A.
J'ai utilisé un POT variable pour ajuster la vitesse du moteur à des fins de démonstration. Vous pouvez également utiliser la même chose pour trouver une application en temps réel. Si tout fonctionne comme prévu, vous devriez être en mesure d'obtenir la vitesse en km / h et la distance couverte en mètres, comme indiqué dans la vidéo ci-dessous.
J'espère que vous avez apprécié le projet et l'avez fait fonctionner. Sinon, vous pouvez utiliser la section commentaires ci-dessous ou le forum pour poster votre doute.