\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.

