Table des matières:

Microcontrôleur AVR. Modulation de largeur d'impulsion. Contrôleur du moteur à courant continu et de l'intensité de la lumière LED. : 6 étapes
Microcontrôleur AVR. Modulation de largeur d'impulsion. Contrôleur du moteur à courant continu et de l'intensité de la lumière LED. : 6 étapes

Vidéo: Microcontrôleur AVR. Modulation de largeur d'impulsion. Contrôleur du moteur à courant continu et de l'intensité de la lumière LED. : 6 étapes

Vidéo: Microcontrôleur AVR. Modulation de largeur d'impulsion. Contrôleur du moteur à courant continu et de l'intensité de la lumière LED. : 6 étapes
Vidéo: Webinaire Cartes Arduino - 1 février 2023 2024, Novembre
Anonim
Image
Image

Bonjour à tous!

La modulation de largeur d'impulsion (PWM) est une technique très courante dans les télécommunications et le contrôle de l'alimentation. il est couramment utilisé pour contrôler la puissance fournie à un appareil électrique, qu'il s'agisse d'un moteur, d'une LED, de haut-parleurs, etc. Il s'agit essentiellement d'une technique de modulation, dans laquelle la largeur de l'impulsion porteuse varie en fonction du signal de message analogique.

Nous fabriquons un circuit électrique simple pour contrôler la vitesse de rotation du moteur à courant continu en fonction de l'intensité lumineuse. Nous allons utiliser des fonctionnalités de résistance dépendante de la lumière et de microcontrôleur AVR telles que la conversion analogique-numérique pour mesurer l'intensité lumineuse. Nous allons également utiliser le module de commande de moteur à double pont en H-L298N. Il est généralement utilisé pour contrôler la vitesse et la direction des moteurs, mais peut être utilisé pour d'autres projets tels que la commande de la luminosité de certains projets d'éclairage. Aussi, ajout d'un bouton à notre circuit pour basculer le sens de rotation du moteur.

Étape 1: Description

La description
La description
La description
La description

Chaque corps dans ce monde a une certaine inertie. Le moteur tourne à chaque mise sous tension. Dès qu'il est éteint, il aura tendance à s'arrêter. Mais ça ne s'arrête pas tout de suite, ça prend du temps. Mais avant qu'il ne s'arrête complètement, il est à nouveau sous tension ! Ainsi, il commence à bouger. Mais même maintenant, il faut un certain temps pour atteindre sa pleine vitesse. Mais avant que cela ne se produise, il est éteint, et ainsi de suite. Ainsi, l'effet global de cette action est que le moteur tourne en continu, mais à une vitesse inférieure.

La modulation de largeur d'impulsion (PWM) est une technique de commutation de puissance relativement récente pour fournir des quantités intermédiaires de puissance électrique entre des niveaux complètement activés et complètement désactivés. Habituellement, les impulsions numériques ont la même période d'activation et de désactivation, mais dans certaines situations, nous avons besoin que l'impulsion numérique ait plus/moins de temps d'activation/d'arrêt. Dans la technique PWM, nous créons des impulsions numériques avec une quantité inégale d'état marche et arrêt pour obtenir les valeurs de tension intermédiaires requises.

Le rapport cyclique est défini par le pourcentage de durée de haute tension dans une impulsion numérique complète. Il peut être calculé par:

% du cycle de service = T on /T (période) x 100

Prenons un énoncé de problème. Nous devons générer un signal PWM 50 Hz ayant un cycle de service de 45%.

Fréquence = 50 Hz

Période de temps, T = T(on) + T(off) = 1/50 = 0,02 s = 20 ms

Cycle de service = 45%

Ainsi, en résolvant selon l'équation donnée ci-dessus, nous obtenons

T(activé) = 9 ms

T(désactivé) = 11 ms

Étape 2: Minuteurs AVR – Mode PWM

Minuteries AVR – Mode PWM
Minuteries AVR – Mode PWM
Minuteries AVR – Mode PWM
Minuteries AVR – Mode PWM

Pour faire du PWM, l'AVR contient du matériel séparé ! En utilisant cela, le CPU demande au matériel de produire un PWM d'un cycle de service particulier. L'ATmega328 a 6 sorties PWM, 2 sont situées sur timer/counter0 (8bit), 2 sont situées sur timer/counter1 (16bit) et 2 sont situées sur timer/counter2 (8bit). Timer/Counter0 est le dispositif PWM le plus simple sur l'ATmega328. Timer/Counter0 est capable de fonctionner sur 3 modes:

  • PWM rapide
  • PWM à correction de phase et de fréquence
  • PWM à phase corrigée

chacun de ces modes peut être inversé ou non inversé.

Initialiser Timer0 en mode PWM:

TCCR0A |=(1 << WGM00)|(1 << WGM01) - configurer WGM: PWM rapide

TCCR0A |= (1 << COM0A1)|(1 << COM0B1) - configurer le mode de sortie de comparaison A, B

TCCR0B |= (1 << CS02) - configurer la minuterie avec le pré-échelonneur = 256

Étape 3: Mesure de l'intensité lumineuse - ADC & LDR

Mesure de l'intensité lumineuse - ADC & LDR
Mesure de l'intensité lumineuse - ADC & LDR
Mesure de l'intensité lumineuse - ADC & LDR
Mesure de l'intensité lumineuse - ADC & LDR
Mesure de l'intensité lumineuse - ADC & LDR
Mesure de l'intensité lumineuse - ADC & LDR

La résistance dépendante de la lumière (LDR) est un transducteur qui change sa résistance lorsque la lumière tombe sur sa surface change.

Les LDR sont fabriqués à partir de matériaux semi-conducteurs pour leur permettre d'avoir leurs propriétés sensibles à la lumière. Ces LDR ou PHOTO RESISTORS fonctionnent sur le principe de la « Photo Conductivité ». Maintenant, ce que dit ce principe, c'est que chaque fois que la lumière tombe sur la surface du LDR (dans ce cas), la conductance de l'élément augmente ou en d'autres termes la résistance du LDR diminue lorsque la lumière tombe sur la surface du LDR. Cette propriété de diminution de la résistance pour le LDR est obtenue car c'est une propriété du matériau semi-conducteur utilisé en surface. Les LDR sont utilisés la plupart du temps pour détecter la présence de lumière ou pour mesurer l'intensité de la lumière.

Pour transférer des informations continues externes (informations analogiques) dans un système numérique/informatique, nous devons les convertir en valeurs entières (numériques). Ce type de conversion est effectué par Analog to Digital Converter (ADC). Le processus de conversion d'une valeur analogique en valeur numérique est connu sous le nom de conversion analogique-numérique. En bref, les signaux analogiques sont des signaux du monde réel qui nous entourent comme le son et la lumière.

Les signaux numériques sont des équivalents analogiques au format numérique ou numérique qui sont bien compris par les systèmes numériques comme les microcontrôleurs. L'ADC est l'un de ces matériels qui mesure les signaux analogiques et produit un équivalent numérique du même signal. Les microcontrôleurs AVR ont une fonction ADC intégrée pour convertir la tension analogique en un nombre entier. AVR le convertit en nombre de 10 bits de la plage 0 à 1023.

Nous utilisons une conversion analogique-numérique du niveau de tension du circuit diviseur avec LDR pour mesurer l'intensité lumineuse.

Initialiser l'ADC:

TADCSRA |= (1<<ADEN) - Activer l'ADC

ADCSRA |= (1<<ADPS2)| (1<<ADPS1)| (1ADPS0) - configurer le préscaler ADC = 128

ADMUX = (1 << REFS0) - configurer la référence de tension = AVCC; - configurer le canal d'entrée = ADC0

Regardez la vidéo avec une description détaillée du microcontrôleur ADC AVR: Microcontrôleur AVR. Mesure de l'intensité lumineuse. ADC et LDR

Étape 4: Contrôleur DC Motor & Dual H-Bridge Motor Driver Module-L298N

Contrôleur de moteur à courant continu et module de commande de moteur à double pont en H-L298N
Contrôleur de moteur à courant continu et module de commande de moteur à double pont en H-L298N
Contrôleur de moteur à courant continu et module de commande de moteur à double pont en H-L298N
Contrôleur de moteur à courant continu et module de commande de moteur à double pont en H-L298N
Contrôleur de moteur à courant continu et module de commande de moteur à double pont en H-L298N
Contrôleur de moteur à courant continu et module de commande de moteur à double pont en H-L298N

Nous utilisons des pilotes de moteur à courant continu car les microcontrôleurs ne sont pas capables de fournir un courant ne dépassant pas 100 milliampères en général. Les microcontrôleurs sont intelligents mais pas puissants; ce module ajoutera des muscles aux microcontrôleurs pour piloter des moteurs à courant continu haute puissance. Il peut contrôler 2 moteurs CC simultanément jusqu'à 2 ampères chacun ou un moteur pas à pas. Nous pouvons contrôler la vitesse à l'aide de PWM ainsi que le sens de rotation des moteurs. En outre, il est utilisé pour piloter la luminosité du ruban LED.

Description de l'épingle:

Port OUT1 et OUT2, qui sert à connecter le moteur à courant continu. OUT3 et OUT4 pour connecter une bande LED.

ENA et ENB sont des broches d'activation: en connectant ENA à high (+5 V), elle active les ports OUT1 et OUT2.

Si vous connectez la broche ENA à low (GND), cela désactive les sorties OUT1 et OUT2. De même, pour ENB et OUT3 et OUT4.

IN1 à IN4 sont les broches d'entrée qui seront connectées à l'AVR.

Si IN1-high (+5V), IN2-low (GND), le OUT1 devient haut et OUT2 devient bas, nous pouvons donc piloter le moteur.

Si IN3-high (+5V), IN4-low (GND), le OUT4 devient haut et OUT3 devient bas, donc la lumière de la bande LED est allumée.

Si vous souhaitez inverser le sens de rotation du moteur, inversez simplement la polarité IN1 et IN2, de même pour IN3 et IN4.

En appliquant le signal PWM à ENA et ENB, vous pouvez contrôler la vitesse des moteurs sur deux ports de sortie différents.

La carte peut accepter de 7V à 12V nominalement.

Cavaliers: il y a trois broches de cavalier; Cavalier 1: si votre moteur a besoin de plus de 12 V, vous devez déconnecter le cavalier 1 et appliquer la tension souhaitée (max 35 V) à la borne 12 V. Apportez une autre alimentation 5V et une entrée à la borne 5V. Oui, vous devez entrer 5V si vous devez appliquer plus de 12V (lorsque le cavalier 1 est retiré).

L'entrée 5V est destinée au bon fonctionnement du circuit intégré, car le retrait du cavalier désactivera le régulateur 5V intégré et protégera contre une tension d'entrée plus élevée de la borne 12V.

La borne 5V agit comme sortie si votre alimentation est comprise entre 7V et 12V et agit comme entrée si vous appliquez plus de 12V et que le cavalier est retiré.

Cavalier 2 et cavalier 3: Si vous supprimez ces deux cavaliers, vous devez entrer le signal d'activation et de désactivation du microcontrôleur, la plupart des utilisateurs préfèrent retirer les deux cavaliers et appliquer le signal du microcontrôleur.

Si vous gardez les deux cavaliers, les sorties OUT1 à OUT4 seront toujours activées. N'oubliez pas le cavalier ENA pour OUT1 et OUT2. Cavalier ENB pour OUT3 et OUT4.

Étape 5: écriture de code pour un programme en C. Téléchargement du fichier HEX dans la mémoire flash du microcontrôleur

Écriture et construction de l'application du microcontrôleur AVR en code C à l'aide de la plate-forme de développement intégrée - Atmel Studio.

#ifndef F_CPU#define F_CPU 16000000UL // indiquant la fréquence du cristal du contrôleur (16 MHz AVR ATMega328P) #endif

#include //header pour activer le contrôle du flux de données sur les broches. Définit les broches, les ports, etc. #include //header pour activer la fonction de retard dans le programme

#define BUTTON1 2 // commutateur de bouton connecté à la broche 2 du port B #define DEBOUNCE_TIME 25 // temps d'attente pendant le bouton "anti-rebond" #define LOCK_INPUT_TIME 300 // temps d'attente après avoir appuyé sur un bouton

// Timer0, PWM Initialization void timer0_init() { // configurer le timer OC0A, la broche OC0B en mode bascule et en mode CTC TCCR0A |= (1 << COM0A1)|(1 << COM0B1)|(1 << WGM00)| (1 << WGM01); // configurer le timer avec prescaler = 256 TCCR0B |= (1 << CS02); // initialise le compteur TCNT0 = 0; // initialise la valeur de comparaison OCR0A = 0; }

// Initialisation de l'ADC void ADC_init() { // Activer l'ADC, l'échantillonnage freq=osc_freq/128 définir le pré-échelonneur sur la valeur maximale, 128 ADCSRA |= (1<<ADEN) | (1<<ADPS2)| (1<< ADPS1)| (1<<ADPS0);

ADMUX = (1<<REFS0); // Sélectionnez la référence de tension (AVCC)

// Statut du commutateur de bouton unsigned char button_state() {

/* le bouton est enfoncé lorsque le bit BUTTON1 est vide */

si (!(PINB & (1<

{

_delay_ms(DEBOUNCE_TIME);

si (!(PINB & (1<

}

renvoie 0;

}

// Initialisation des ports void port_init() { DDRB =0b00011011; //PB0-IN1, PB1-IN2, PB3-IN3, PB4-IN4, PB2 - BOUTON PORT DIRECT B=0b00010110;

DDRD =0b01100000; //PD5-ENB (OC0B), PD6-ENA (OC0A) PORTD=0b00000000;

DDRC =0b00000000; // PC0-ADC PORTC=0b00000000; // Définit toutes les broches de PORTC à un niveau bas, ce qui le désactive. }

// Cette fonction lit la valeur de la conversion analogique-numérique. uint16_t get_LightLevel() { _delay_ms(10); // Attendez un certain temps pour que le canal soit sélectionné ADCSRA |= (1<<ADSC); // Démarrez la conversion ADC en définissant le bit ADSC. Écrire 1 à ADSC

while(ADCSRA & (1<<ADSC)); // Attendre la fin de la conversion

// ADSC redevient 0 jusque-là, exécutez la boucle en continu _delay_ms(10); retour (ADC); // Retourne le résultat 10 bits

}

// Cette fonction remappe un nombre d'une plage (0-1023) à une autre (0-100). uint32_t map(uint32_t x, uint32_t in_min, uint32_t in_max, uint32_t out_min, uint32_t out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }

int main(void)

{ uint16_t i1=0;

port_init();

timer0_init(); ADC_init(); // initialisation ADC

tandis que (1)

{ i1=map(get_LightLevel(), 0, 1023, 0, 100);

OCR0A=i1; // Définir le registre de comparaison de sortie canal A OCR0B=100-i1; // Définir le registre de comparaison de sortie canal B (inversé)

if (button_state()) // Si le bouton est enfoncé, bascule l'état de la LED et le délai de 300ms (#define LOCK_INPUT_TIME) { PORTB ^= (1<<0); // basculement de l'état actuel de la broche IN1. PORTB ^= (1<<1); // basculement de l'état actuel de la broche IN2. Inverser le sens de rotation du moteur

PORTB ^= (1<<3); // basculement de l'état actuel de la broche IN3. PORTB ^= (1<<4); // basculement de l'état actuel de la broche IN4. La bande LED est allumée/éteinte. _delay_ms(LOCK_INPUT_TIME); } }; retour (0); }

La programmation est terminée. Ensuite, créez et compilez le code du projet dans un fichier hexadécimal.

Téléchargement du fichier HEX dans la mémoire flash du microcontrôleur: tapez dans la fenêtre d'invite DOS la commande:

avrdude –c [nom du programmeur] –p m328p –u –U flash:w:[nom de votre fichier hexadécimal]

Dans mon cas c'est:

avrdude –c ISPProgv1 –p m328p –u –U flash:w:PWM.hex

Cette commande écrit un fichier hexadécimal dans la mémoire du microcontrôleur. Regardez la vidéo avec une description détaillée de la gravure de la mémoire flash du microcontrôleur: Gravure de la mémoire flash du microcontrôleur…

D'accord! Maintenant, le microcontrôleur fonctionne conformément aux instructions de notre programme. Regardons ça!

Étape 6: Le circuit électrique

Le circuit électrique
Le circuit électrique
Le circuit électrique
Le circuit électrique

Connectez les composants conformément au schéma de principe.

Conseillé: