Étape 4: Faire le CNC se déplacer correctement
La partie programmation de ce projet a été faite entièrement en VHDL, et j’ai préféré écrire mes propres implémentations de composant, bien que vous trouverez plusieurs exemples de code pour contrôler des Servos RC / DC motors.
Pour contrôler les deux types de moteurs, nous aurons besoin de mettre en œuvre un PWM (modulation de largeur d’impulsion). Si vous n’êtes pas familier avec elle essayer de chercher sur internet pour plus d’informations. Vous pouvez également lire sur comment Servos et DC motors travail, si vous voulez en savoir plus.
La période PWM sera différente pour chaque type de moteur donc en fin de compte, nous aurons 2 codes différents pour pwm pour plus de simplicité.
Commander un moteur à courant continu
Le moteur DC est contrôlé par le pont de H. Dans sa fiche technique H Bridge, nous voyons que la broche enable d’entrée doit être connectée à un signal PWM et sa période devrait être de 2 KHz. Parce que l’horloge interne Arty a fréquence de 100MHz, afin d’obtenir la période désirée horloge de 2 KHz, nous diviserons 100 MHz / 2 KHz = 50000. Alors j’ai utilisé un compteur de 0 à 49999 qui rafraîchit lorsqu’elle atteint 50000 et forces la sortie PWM signal « 1 » et un drapeau « 1 ». Pour le cycle, j’ai utilisé un autre compteur qui commence à compter avec le facteur de remplissage lorsque le drapeau est 1 "et quand il finit il forces que le drapeau de retour sur" 0". Les facteurs de remplissage sont stockés dans un tableau comme une constante dans l’architecture de PWM.
Car nous avons besoin du moteur de C.C pour arrêter lorsqu’il s’installe à certaines étapes, le signal PWM doit être 0 dans ce cas alors j’ai ajouté un autre signal d’entrée qui nous indique si le moteur devrait se déplacer ou non. Si ce n’est pas le cas, nous avons mis la sortie PWM à 0.
Dans cette étape du projet, le PWM sur le contrôleur de domaine est un peu hors de propos. On verra son importance dans les prochaines semaines, quand le codeur moteur DC et la régulation PID seront appliquées.
Pour l’instant, la direction du moteur sera automatiquement réglée selon la touche enfoncée.
Nous contrôlons les deux moteurs à courant continu de la même manière.
Commander un Servo RC
Dans cette mise en œuvre du projet est requise seulement 1 servo - le servo haut-bas. Le servo de sélecteur de plume sera montré dans la semaine suivante.
Les Servos d’entrée PWM doit avoir un 2ms période. Cela signifie un 50 Hz de fréquence. Comme avant de nous faire le calcul et nous obtenons 2000000 comte. Le principe est le même que précédemment sauf que cette fois nous ne se soucient pas si le signal PWM reste le même (en fait nous faisons, mais pas dans la façon dont nous avons pris en charge le moteur de C.C), parce qu’un certain facteur de remplissage nous donne une certaine pour le Servo.
Le servo se déplace selon une entrée provenant de l’interrupteur de planches. Il ira soit vers le haut ou le bas (dans cette position la plume sera sur le papier et dessiner).
Un composant qui unit tous les composants ci-dessus est mis en œuvre et s’appelle CNC.
=== Le Code CNC ===
---------------DC motor pwm-----------------------
type de ROM est tableau (0 à 4) d’entier ;
my_nums constant :
ROM: =
(0 = > 0, - 0 DC
1 = > 12500,--25 DC
2 = > 25000,--50DC
3 = > 37500,--75 DC
4 = > 50000--100 DC) ;
pwm_temp du signal : std_logic_vector: = « 0 » ;
signal pwm_temp_cnt : integer: = 0 ;
signal duty_temp : integer: = 0 ;
Indicateur2 signal : std_logic_vector: = « 0 » ;
sélecteur de signal : integer: = 0 ;
commencer
processus (clk)
commencer
IF(RISING_EDGE(CLK)) puis
Si selector = 0 then
pwm_temp < = « 0 » ;
elsif pwm_temp_cnt = 50000 puis
pwm_temp < = « 1 » ;
pwm_temp_cnt < = 0 ;
Indicateur2 < = « 1 » ;
d’autre
pwm_temp_cnt < = pwm_temp_cnt + 1 ;
end if ;
Si Indicateur2 = « 1 » puis
Si duty_temp = my_nums(selector) then
pwm_temp < = « 0 » ;
duty_temp < = 0 ;
Indicateur2 < = « 0 » ;
d’autre
duty_temp < = duty_temp + 1 ;
end if ;
end if ;
end if ;
terminer le processus ;
processus (move_DC)
commencer
IF(RISING_EDGE(CLK)) puis
move_DC affaire est
Lorsque « 1 » = > sélecteur < = 3 ;
Lorsque « 0 » = > sélecteur < = 0 ;
alors que d’autres = > sélecteur < = sélecteur ;
affaire de fin ;
end if ;
terminer le processus ;
pwm_clk < = pwm_temp ;
Composant principal moteur de CC------
composant PWM_DC est
Port (clk : dans std_logic_vector ;
pwm_clk : dehors std_logic_vector ;
move_DC : en std_logic_vector) ;
composant de fin ;
moveDC du signal : std_logic_vector: = « 0 » ;
commencer
PWM : pwm_dc port carte (clk, en_out, moveDC) ;
---COMMUTATEUR DU SENS DE---
Process(BTN)
commencer
IF(RISING_EDGE(CLK)) puis
btn affaire est
Lorsque « 10 » = > dir_out < = « 1 » ;
moveDC < = « 1 » ;
Lorsque « 01 » = > dir_out < = « 0 » ;
moveDC < = « 1 » ;
alors que d’autres = > dir_out < = « 0 » ;
moveDC < = « 0 » ;
affaire de fin ;
end if ;
terminer le processus ;
---RC composante primaire Servo---
my_nums constante: ROM: = ()
0 = > 80000,--1 0 = > 145000,--45 2 = > 165000,--90 3 = > 175000, -135 DC 4 = > 200000--180 DC) ;
pwm_temp du signal : std_logic_vector: = « 0 » ;
signal pwm_temp_cnt : integer: = 0 ;
signal duty_temp : integer: = 0 ;
Indicateur2 signal : std_logic_vector: = « 0 » ;
signal fr : std_logic_vector (3 downto 0): = (d’autres = > « 0 ») ;
bouton de signal : integer: = 0 ;
commencer
processus (clk)
commencer
IF(RISING_EDGE(CLK)) puis
Si pwm_temp_cnt = 2000000 puis
pwm_temp < = « 1 » ;
pwm_temp_cnt < = 0 ;
Indicateur2 < = « 1 » ;
d’autre
pwm_temp_cnt < = pwm_temp_cnt + 1 ;
end if ;
Si Indicateur2 = « 1 » puis
Si duty_temp = my_nums(button) then
pwm_temp < = « 0 » ;
duty_temp < = 0 ;
Indicateur2 < = « 0 » ;
d’autre
duty_temp < = duty_temp + 1 ;
end if ;
end if ;
end if ;
terminer le processus ;
lancer des processus (sw)
IF(RISING_EDGE(CLK)) puis
sw affaire est
Lorsque « 1 » = > bouton < = 4 ;
Lorsque « 0 » = > bouton < = 3 ;
alors que d’autres = > bouton < = bouton ;
affaire de fin ;
end if ;
terminer le processus ;
pwm_clk < = pwm_temp ;
Créer un composant principal qui sera port carte contrôleur principal moteur DC 2 fois, une pour l’axe X et un pour l’axe Y et 1 fois le composant primaire de servo RC.