Étape 4: L’arduino code
Dans la prochaine étape, nous discutons comment contrôler ce circuit avec le code de l’Arduino. Vous pouvez simplement télécharger et exécuter notre code. Le reste de cette étape va dans les détails de comment le code fonctionne. Veuillez noter que certaines parties de notre code reposent sur la phase d’AC de l’Arduino contrôlant le tutoriel et nous re-utilisé une partie de ce code car il est.
La carte Arduino UNO contient un ATmega328P microprocesseur 16MHz. Pour déclencher le circuit de commande de phase AC à précisément intervalles nous avons utilisé la fonction timer interrupt de ATmega328. Donc, si vous n’êtes pas familier avec les concepts comme les horloges, les débordements de Registre et prescaling, que cet article explique les mieux.
Avant d’aller en codage, nous devons faire quelques calculs de base. Le signal alternatif est 60 Hz. (ne vous inquiétez pas si vous avez 50Hz dans votre pays, vous pouvez re-calculer facilement) cela signifie le signal alternatif traverse zéro, atteint le pic de tension positive, traverse zéro encore une fois, atteint le pic de tension négative et revienne à zéro à 60 fois par seconde. La période (longueur de temps que cela prend) correspond à 1/60 ou 0,01667 secondes (16,67 millisecondes). Ainsi, un demi-cycle ou le temps entre deux impulsions de passage à zéro intervient en 8,33 millisecondes.
Partir de là, nous allons déterminer les intervalles de temps dans le code de chiffres de l’horloge, pas par secondes. L’horloge de l’Arduino tourne à 16 MHz, qui est de 16 000 000 cycles par seconde : un cycle d’horloge prend 0,0625 microsecondes. Une seule que moitié du cycle du signal 60Hz AC contient 133 333 cycles d’horloge. Le 16-bit timer (timer1) d’Arduino Uno ne peut compter à 65535. Nous devons donc que configurer avec un diviseur. Dans ce code, nous avons utilisé un Prédiviseur 256. Avec le prescaler 256, un demi-cycle signifie environ 520 incréments de minuterie. Pour des raisons pratiques (légèrement modifié en approvisionnement en fréquence et triac retards opérationnels) nous jugent comme 450. Ceci s’assure que le conducteur triac a le temps d’éteindre avant le prochain demi-cycle. Donc nous avons contrôlé le temps d’attente avant d’allumer le triac dans la plage 1-450 à l’intérieur de chaque demi-cycle de contrôler la puissance de sortie. Nous avons utilisé des interruptions de match comparateur pour cela. Nous avons utilisé des interruptions de débordement de minuterie pour contrôler le signal à triac porte et définir la largeur d’impulsion de 4 chefs de minuterie. Ici, lorsque l’impulsion est envoyée vers la porte du triac, il va s’allumer l’alimentation CA et demeurera allumé même après que le pouls est supprimé jusqu'à ce que la prochaine fois que l’onde AC atteint zéro. (Si vous n’êtes pas familier avec opération il s’agit d’un bon article du Triac.) Pour cette raison nous n’avez pas besoin de s’inquiéter d’éteindre le triac.
Extrait de code suivant montre la phase AC contrôle logique.
#define DETECT 2 / /zéro Croix détecter
#define porte 9 / /porte de triac
#define PULSE 4 / /déclencher la largeur d’impulsion (comtes)
mis en place Timer1(16-bit)
OCR1A = 100 ; initialiser le comparateur
TIMSK1 = 0 X 03 ; activez le comparateur A et déborder les interruptions
TCCR1A = 0 X 00 ; contrôle Timer recense ensemble pour
TCCR1B = 0 X 00 ; fonctionnement normal, la minuterie désactivée
mise en place de zéro interruption du passage à niveau
attachInterrupt (0, zeroCrossingInterrupt, RISING) ;
zéro incident détecté
void zeroCrossingInterrupt() {}
TCCR1B = 0 X 04 ; Démarrer la minuterie avec fracture par 256 entrées
TCNT1 = 0 ; Réinitialiser la minuterie - count de zéro - comtes jusqu'à ce qu’elle correspond à la valeur de comparaison
}
match de comparateur - atteint le délai prévu
{ISR(TIMER1_COMPA_vect)}
digitalWrite(GATE,HIGH) ; Set porte de triac à haute - Allumez la fourniture
TCNT1 = 65536-PULSE ; largeur d’impulsion de déclenchement
}
débordement de Timer1 - pouls atteint sa largeur
{ISR(TIMER1_OVF_vect)}
digitalWrite(GATE,LOW) ; Mettez hors tension triac porte
TCCR1B = 0 X 00 ; désactiver la minuterie pour arrêter les déclencheurs involontaires
}
Contrôle de température
Maintenant, nous avons fini avec la partie la plus délicate de notre code. Suivante consiste à contrôler la puissance (ou le temps de retard), selon la valeur actuelle de la température et la température de consigne souhaitée. Pour lire la valeur de la température, nous avons utilisé la bibliothèque Adafruit_MAX31855. Pour implémenter le mécanisme de contrôle, nous avons utilisé la logique de contrôle PID. Ne vous inquiétez pas si ça vous semble un peu complexe. Heureusement, nous avons une bibliothèque Arduino pour cela. L’extrait suivant montre le code pour cela.
#define 3
#define CS 4
#define CLK 5
Adafruit_MAX31855 thermocouple (CLK, CS, DO) ;
double point de consigne, entrée, sortie ; Définir des Variables nous va se connecter à
Kp double = 2, Ki = 6, Kd = 1 ; Précisez les liens et les paramètres de réglage initiales
PID myPID (entrée, sortie & point de consigne, Kp, Ki, Kd, DIRECT) ;
myPID.SetMode(AUTOMATIC) ;
myPID.SetOutputLimits (0, 449) ; définissez la plage
à l’intérieur de la méthode de la boucle
double c = thermocouple.readCelsius() ;
Si (isnan(c)) {}
J’ai = 450 ; Aller à la puissance minimale si quelque chose n’allait pas
}
else {}
Entrée = c ; myPID.Compute() ;
J’ai = 450-sortie ; abaisser le délai, plu la puissance
}
OCR1A = i ; j’ai la valeur comparateur
Delay(400); / / attendre la prochaine température lue
Interface utilisateur
Pour la programmation de l’interface utilisateur, nous avons utilisé olimex lcd bouclier bibliothèque ainsi que de la bibliothèque de fils Arduino. Vous pouvez Télécharger la bibliothèque olimex Olimex site Web.