Étape 7: Servo pilote
Les modules des pilotes de deux servo (un pour chaque servo) contrôlent la vitesse et le sens des servos qui tournent le cadre et le panneau solaire. Ces modules prennent en un signal d’activation de la FSM et puis un signal PWM (modulation d’impulsions largeur) à leur asservissement respectif qui détermine la direction et la vitesse de rotation des servos. Selon la valeur du signal PWM, vous pouvez faire le servo aller à gauche ou à droite avec une vitesse lente ou rapide.
Notre chauffeur de servo est définie en fait structurellement. Cela signifie que, comme l’ADC, nous lui avons donné sa fonction par l’importation d’autres modules et de les connecter ensemble d’une manière où nous recevons les résultats souhaités. Dans ce cas, les deux modules que nous unir pour créer le pilote de servo sont un diviseur d’horloge et un contrôleur PWM.
Voici notre description de l’entité pour notre pilote de servo, diviseur d’horloge et contrôleur PWM :
servo_driver de l’entité est
Port (CLK : dans std_logic_vector ;
BTN_0 : En std_logic_vector ;
BTN_1 : En std_logic_vector ;
SERVO : Out std_logic_vector) ;
fin servo_driver ;
composant pwm_control est
Port (CLK : dans std_logic_vector ;
Réal : Dans STD_LOGIC_VECTOR (1 downto 0) ;
FR : Au std_logic_vector ;
SERVO : Out std_logic_vector) ;
composant de fin ;
composant clk_div2 est
Port (CLK : dans std_logic_vector
SCLK : Out std_logic_vector) ;
composant de fin ;
L’interface du pilote de servo est très simple. BTN_0 et BTN_1 sont des signaux d’activer qui dire dans quel sens pour mettre le servo. Dans l’architecture de servo_driver, BTN_0 et BTN_1 sont soumises à une logique d’entrer une valeur pour DIR qui est alimenté dans pwm_control. pwm_control crée ensuite un signal pwm selon la direction que nous souhaitons le servo de voyager. Dans le cas de nos servos, une onde carrée avec une largeur de 1,5 millisecondes avec une faible période de 20 ms si arrêté. Quoi que ce soit vague au-dessus de 1,5 ms provoquera le servo commencer à se déplacer vers la gauche. Rien en dessous de 1,5 provoquera le servo déplacer vers la droite. Dans notre cas, nous avons voulu les servos se déplacent assez lentement et nous avons dû une onde carrée de 1,52 ms pour le mouvement de la ccw et une onde carrée de 1,48 ms pour le mouvement de la cw. En ce qui concerne notre diviseur d’horloge, nous voulions que notre chauffeur de servo pour recevoir un signal d’horloge qui a connu une période d’une microseconde. Le Conseil de Basys a une vitesse d’horloge par défaut de 100 Mhz, donc nous avons divisé l’horloge par 100 dans le diviseur d’horloge afin d’atteindre une fréquence de 1 Mhz (1/1 Mhz est 1 microseconde).
Voici la partie de la mise en œuvre de la pwm_controler :
constante time_high_stopped : INTEGER: = (1500) ; ---1500 microsecondes = 1,5 ms
période_basse constante : INTEGER: = (20000) ;
th_cntr variable : plage d’entiers 0 à 2047: = 0 ;
tl_cntr variable: 0 à 32767 plage d’entiers: = 0 ;
Si fr = « 1 » puis
Si rising_edge(CLK) alors---arrêt le servo
Si DIR = « 00 » then
Si tl_cntr < = période_basse then
tl_cntr: = tl_cntr + 1 ;
SERVO < = « 0 » ;
elsif th_cntr < = time_high_stopped then
th_cntr: = th_cntr + 1 ;
SERVO < = « 1 » ;
d’autre
tl_cntr: = 0 ;
th_cntr: = 0 ;
SERVO < = « 0 » ;
end if ;
Comme vous pouvez le voir, nous comparons une variable de compteur à un maximum et changer à la prochaine affaire en conséquence. Avec la taille des variables et la vitesse d’horloge de 1 Mhz divisée, nous obtenons une vague carré parfait avec un 1,5 ms haut et 20 ms faible.