\subsection{Cahier des charges} L'objectif de cette section est de présenter le module générant le signal de commande des servomoteurs du robot-EFREI participant à la coupe de France de robotique E=M6. \paragraph{Commande des Servo-moteurs}%gras sans saut de ligne Un servomoteur est un système utilisé pour commander en position la rotation d'un axe. Il est par exemple utilisé pour Il est commandé par une série de signaux modulés en largueur d'impulsion - Pulse Width Modulation : PWM - dont les rapports cycliques représentent chacun un la position que le servo doit maintenir. %image exemple de signal pwm \begin{figure}[htbp] \caption{Exemple de Signal PWM} \begin{center} \scalebox{0.6}{ \includegraphics {./pwm/images/im_signalpwm.pdf} } \end{center} \end{figure} La valeur T2/T1 est le rapport cycle du PWM. A chaque rapport cyclique correspond une et une seule position de l'axe de sortie du servomoteur. Ainsi, le servo-moteur est commandé par une succession de signaux PWM tels que T1 est une période constante et T2 varie en fonction du rapport cyclique que l'on souhaite avoir. \pagebreak[4] \paragraph{Caractéristiques du servo-moteur codé}%tiret Comme nous n'avons pas encore acheté le servo-moteur, nous veillerons à avoir un code répondant aux caractéristiques définies ci-après et aisément modifiable par la suite. \begin{description} \item [] \begin{center} \begin{tabular}{|l|l|l|} \hline Fréquence d'horloge du système & 32 MHz \\ \hline Période enveloppe de la PWM:T1 & 20 ms \\ \hline Taille des données entrantes:rapport cyclique & 1 octet \\ \hline Rapport cyclique minimum:données=00000000 & 2.5\% \\ \hline Rapport cyclique maximum:données=11111111 & 7.5\% \\ \hline \end{tabular} \end{center} \end{description} %image:résumé général des entrées et sorties du module \begin{figure}[htbp] \caption{Synoptis des entrées et sorties du module de commande du servo-moteur} \begin{center} \scalebox{0.6}{ \includegraphics {./pwm/images/im_inoutgeneral.pdf} } \end{center} \end{figure} \pagebreak[4] \subsection{Principe de fonctionnement:Description des modules} \subsubsection{Regdata3} Ce registre a 3 rôles principaux :\\* \begin{itemize} \item{Il conserve la valeur courante, de la position que l'on souhaite atteindre en sortie de l'axe de rotation du moteur}%tiret \end{itemize} \begin{itemize} \item{Il met cette donnée entière à la disposition du générateur de PWM(comptvalue3) à chaque fois que ce dernier en a besoin.}%tiret \end{itemize} La position d'initialisation du module(à RESET=1)est tel que le rapport cyclique est de 5\%, ce qui correspond la position milieu sur le servo. C'est à dire (1us/(1/CLK))=128. \subsubsection{Clk1us} Ce module sert à générer un niveau haut toutes les 1us.Et chaque niveau haut dure une période d'horloge. On divise ainsi la fréquence de travail-initialement de 32MHz-par 1000 environ. \subsubsection{Comptvalue3} Le module comptvalue3 représente le coeur du système. Tous les calculs nécéssaires à la génération des signaux de commande du servo-moteur sont effectués par lui. \mbox{\emph{Vous trouverez ci-dessous explicité son algorithme.}} Les entrées du module sont : \\*RST qui est le RESET asynchrone du module \\*CLK est l'horloge \\*LOADCOMPT est un signal sur un bit. Au niveau haut, il donne l'autorisation de charger le compteur. \\*DATACOMPT est l'entier représentant la donnée fournie par les capteurs par exemple pour indiquer la position à laquelle on désire maintenir le servomoteur. \\*TCCOMPT est le compteur du nombre de cycles d'horloge de CLK1US permettant d'avoir une période enveloppe des signaux PWM de 20ms. Il est décrémenté à partir de sa valeur maximale : Tcmax=20ms/1us=20161cycles. \\*Q est également un compteur décrémenté. Il correspond au nombre de cycles d'horloge de CLK1US permettant d'avoir une certaine durée T2 de la PWM. Sa valeur initiale dépend de la donnée DATACOMPT. \pagebreak[3] Si DATACOMPT=0,on veut que T2 vale 0,5ms donc on initialise Q à la valeur \\*\begin{math} Q=0,5ms/1us=505. \end{math} \\*Si DATACOMPT=255,on veut que T2 vale 1,5ms donc on initialise Q à la valeur \\*\begin{math} Q=1,5ms/1us=1515. \end{math} \\*Pour toute autre valeur de DATACOMPT comprise entre les deux précédentes et différentes de ces dernières, on initialise Q avec \\*\begin{math} Q=(0,5ms/1us)+(DATACOMPT*min[((1,5ms-0,5ms)/1us)/(255-1)] \end{math} \\*A chaque calcul de Q, sa valeur courante est chargée dans le signal de sortie du module:VALUECOMPT. \begin{verbatim} Le processus est enclenché pour toute transition de rst, clk et loadcompt. Si (rst = '1') On initialise tccompt,q et Valuecompt avec leurs valeurs initiales. Sinon, si CLK1US est au niveau haut alors Si le module peut être chargé, c'est à dire (loadcompt = '1') alors mettre tccompt à la valeur maximale Si le module ne peut être chargé par une nouvelle donnée (loadcompt='0')alors, Si q est différent de 0 alors Décrémenter q Et décrémenter le compteur tccompt des 20 ms Si q est nul, on a fini de décrémenter la donnée entrée, alors q prend 0 et on continue à décrémenter le compteur des 20 ms jusqu'à 0. Affecter le signal q à valuecompt, l'entier de sortie du module à chaque CLK. \end{verbatim} \subsubsection{Affiche} Ce registre à décalage permet de mettre le signal de sortie du Module générateur des signaux de commande du servo-moteur à 1 tant que le compteur VALUECOMPT n'est pas à 0. Dans le cas contraire, le signal de sortie vaut 0. \subsubsection{Fsmpwm3} Le reseau de Pétri ci-dessous résume le mode de fonctonnement du systeme. On y distingue 3 états. \\*\begin{itemize} \item{L'état 1 est l'initialisation. Un premier chargement du module Comptvalue3 se fait sans que l'on ait besoin d'avoir un niveau haut de enload}%tiret \end{itemize} \begin{itemize} \item{L'état 2 correspond à celui du chargement de Comptvalue3 grâce au passage à 1 du signal enload pendant une période d'horloge}%tiret \end{itemize} \begin{itemize} \item{Au cours du dernier état, le signal enload repasse à 0. C'est durant cette phase que tous les calculs sont effectués.}%tiret \end{itemize} Le passage d'un état au suivant est conditionné essentiellement par un niveau haut du signal CLK1US. %-- insérer le réseau de pétri \begin{figure}[htbp] \caption{Réseau de Pétri du module de commande du servo-moteur} \begin{center} \scalebox{0.6}{ \includegraphics {./pwm/images/petri.pdf} } \end{center} \end{figure} \pagebreak[4] \subsection{Représentation structurelle adoptée} L'architecture ci-dessous correspond aux fonctions identifiées. \begin{itemize} \item{Ses entrées sont}%tiret \end{itemize} RST : le reset asynchrone \\*CLK : l'horloge de 32 MHz \\*data: la valeur sur 1 octet codant la position que l'on souhaite atteindre \begin{itemize} \item{Sa sortie est}%tiret \end{itemize} outpwm : le signal de commande du servomoteur %image:architecture générale \begin{figure}[htbp] \caption{Architecture du module de commande du servo-moteur} \begin{center} \scalebox{0.6}{%0.6 \includegraphics {./pwm/images/im_archigeneral.pdf} } \end{center} \end{figure} \pagebreak[4] \subsection{Résultats de la simulation} Les données entrées sont les suivantes : \begin{verbatim} RST:1,0 après (CLKPERIOD/6). clk:not clk après (CLKPERIOD/2). data:00000011, 00011000 après 17 ms 00000000 après 38 ms 11111111 après 58 ms 01111111 après 78 ms. avec CLKPERIOD:32ns. \end{verbatim} L'image ci-dessous est celui du signal de commande du servomoteur. \\* Chaque PWM a bien une période de 20ms. \\* Par ailleurs, les rapports cycliques obtenues reflètent les valeurs de data entrées. %image:Résultat de la simulation \begin{figure}[htbp] \caption{Signaux de commande du servo-moteur} \begin{center} \scalebox{0.6}{%0.6 \includegraphics {./pwm/images/outpwm.pdf} } \end{center} \end{figure} \pagebreak[4] \subsection{Synthèse} Voici les résultats de la synthèse.