\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 dispositif utilisé pour commander en position l'axe 
de rotation de sortie d'un moteur. 
Il est utilisé par exemple, pour gérer le sens de rotation du rouleau 
bi-rotatif d'entrée du robot. La position des roues est également donnée par
un servomoteur.  

Un servomoteur est un dispositif utilisé pour commander en position l'axe de
rotation de sortie d'un moteur. Il est utilisé par exemple, pour gérer le sens
de rotation du rouleau bi-rotatif d'entrée du robot. La position des roues est
également donnée par un servomoteur.  
 
Il est commandé par une série de signaux modulés en amplitude - Pulse Width
Modulation : PWM - dont les rapports cycliques représentent chacun un angle
auquel l'axe de rotation du moteur doit se 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 un et un seul angle de rotation de l'axe de sortie du moteur.

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

\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
\subsection{Principe de fonctionnement:Description des modules}

%***
\subsubsection{Regdata3}
Ce registre a 3 rôles principaux :
\begin{itemize}
\item{Il conserve la valeur courante, en octet, de l'angle que l'on souhaite atteindre en sortie de l'axe de rotation du moteur}%tiret
\end{itemize}

\begin{itemize}
\item{Il convertit cet angle en valeur entière}%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 valeur d'initialisation (RESET=1)est telle que le rapport cyclique
 est de 2.5/%.
C'est à dire (1us/(1/CLK))=31. 

\subsubsection{Clk1us}
Ce module sert à générer un front montant toutes les 1us. 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.

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.
\\
*Si DATACOMPT=0,on veut que T2 vale 0,5ms donc on initialise Q à la valeur
Q=0,5ms/1us=505.
*Si DATACOMPT=255,on veut que T2 vale 1,5ms donc on initialise Q à la valeur
Q=1,5ms/1us=1515.
*Pour toute autre valeur de DATACOMPT comprise entre les deux précédentes et 
différentes de ces dernières,
on initialise Q avec Q=(0,5ms/1us)+(DATACOMPT*min[((1,5ms-0,5ms)/1us)/(255-1)]
\\
A chaque calcul de Q, sa valeur courante est chargée dans le signal de sortie du module:VALUECOMPT.
\\
 
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.

\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 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 ase 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
\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 l'angle 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

\subsection{Résultats de la simulation}

Les données entrées sont les suivantes :

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.

L'image ci-dessous est celui du signal de commande du servomoteur.
Chaque PWM a bien une période de 20ms.
Par ailleurs, 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

\subsection{Synthèse}

Voici les résultats de la synthèse.

