Catégories
Projets électroniques

Projet électronique : Oscilloscope numérique à base du microcontrôleur PIC18F4680 à liaison série RS232

Projet électronique Oscilloscope numérique à base du microcontrôleur PIC18F4680 à liaison série RS232 matlab schéma

Projet électronique Oscilloscope numérique à base du microcontrôleur PIC18F4680 à liaison série RS232 matlab

 

Le mini projet est une petite application de l’oscilloscope numérique, ce projet électronique va vous permettre de savoir :

  • Comment configurer la broche d’initialisation (MCLR) du PIC18F
  • Comment créer et configurer un objet port série sur Matlab
  • Comment transférer les données entre ISIS et Matlab
  • Comment créer une liaison RS232 virtuelle
  • Comment recevoir, mettre en format et afficher les données
  • Comment calculer quelques paramètres du signal et les affichés en permanent (valeur maximale, valeur moyenne, fréquence,…)

Ce mini projet peut être utilisé pour développer une interface graphique d’un oscilloscope numérique multicanaux sur Matlab.

Analyse de fonctionnement :

Le projet électronique Oscilloscope numérique à base du microcontrôleur PIC16F4680 à liaison série RS232 est un outil simple qui permet de faire l’acquisition d’un signal analogique à l’entrée Analogique (0) du microcontrôleur, la transmission sur 8 bits de la valeur acquise (12 bits) de l’ADC du micro, réception de la valeur par le programme Matlab enfin, afficher la valeur en temps réel sur l’écran. La mise à jour de l’échelle temporelle se fait automatiquement ainsi que l’échelle d’amplitude.

Le signal à l’entrée analogique du micro doit être strictement positif avec une valeur maximale qui ne dépasse pas 5v. Consultez le projet mesure de la capacité pour la protection contre la polarité la surtension.

Format de transmission :

Le format de données de transmission est simple, il est constitué de deux champs : La donnée sur 3 octets (3 digits entre 0-255) et le champ séparateur « # » qui permet de séparer entres chaque échantillon (Ex : 125#, 200#).

Afin de simplifie le format de transmission, j’ai reconverti le format 12 bits en 8 bits pour que je puisse transmettre la valeur en une seule fois ! (gagner en temps de transmission), sinon vous pouvez transmettre  la valeur en deux fois, dans ce cas vous subdiviser la valeur de 12 bits en 8 bits (LSB) + 4 bits (MSB). Pour passer de 12 bits au 8 bits il suffit un décalage de 4 bits à droite (>>) ou une division sur 16 (voir code MikroC).

Comment créer un port virtuel :

Vous pouvez télécharger le programme dans le projet Capteur de son logiciel à base du PIC16F877.

Il arrive dans certains cas que plusieurs utilisateurs sur différents ordinateurs aient besoin d’accéder à une seule et même application. Il est donc nécessaire de créer des ports virtuels. Le programme Free Virtual Serial Ports Emulator vous aidera dans cette tâche sans aucun problème.

L’utilitaire Free Virtual Serial Ports Emulator est un outil destiné aux personnes ayant de très bonnes bases en programmation. En effet, ce logiciel permet d’émuler, de créer, de tester et de déboguer des ports virtuels. De cette manière, des applications n’auront plus besoin de passer par un port de série, mais pourront utiliser un port virtuel. L’intérêt étant que plusieurs utilisateurs pourront donc y accéder simultanément.

Creer port série VSPE intérface

Creer port série VSPE

Configuration du PIC18F4680:

Datasheet PIC18F6480

Les programmes du PIC16F sont presque tous compatibles avec le PIC18F. Afin de simuler le PIC18F sur ISIS vous devez configurer le bit 7 du registre CONFIG3H à 1 pour activer la broche de réinitialisation. (MCLR) puis mettre MCLR à 5V externe.

Le registre CONFIG3H n’est pas définie sur le compilateur MikroC, il faut le définir puis l’initialiser à 0x80 (voir le programme MikroC)

Datasheet PIC18F6480 MCLRE

Mode d’utilisation :

1/ Créer et activer un port série virtuel
2/ Assurez vous que toutes les vitesses et les noms des ports sont identique (Matlab, ISIS et le port virtuel)
3/ Lancer la simulation sur ISIS
4/ Lancer le script matlb

Quand la simulation en marche, vous prouvez modifier en ligne les paramètres sur ISIS (amplitude du signal, fréquence) à condition de ne pas arrêter la simulation sur ISIS ! Dans le cas échant la connexion avec matlab cesse de fonctionner ! En revanche vous pouvez interrompre le script matlab (Cltrl +C) puis modifier les paramètres (N, …) en suite relancer le script mais vous n’oubliez pas de commenter la ligne 1 et 2 du programme matlab pour réutiliser le même port si non un message d’erreur va être affiché comme quoi l’abject port est déjà occupe !

Si vous avez envisagé un souci du port vous pouvez créer un autre port puis le configurer partout et lancer la simulation de nouveau. Le nombre des ports par contre est illimité 🙂

Commentaires sur le programme Matlab :

Le paramètre N définir la taille du buffer de réception et la longueur de la donnée à affiché, le temps d’affichage dépend de la taille du buffer. Vous pouvez agir sur ce paramètre pour mieux zoomer le signal (voir signaux ci-dessous).

Les vitesses (ISIS, MikroC et Matlab) de la liaison série doivent être les mêmes.

Un coefficient de correction de la période d’échantillonnage est introduit pour la mesure de la fréquence, ce paramètre dépend de la vitesse de transmission en bauds, la période d’échantillonnage de l’ADC, les temps de transmission de la liaison série. Les temps de transmission (4 caractères de 8 bits) limitent la fréquence maximale du signal analogique. Dans ce mode de transmission on doit travailler avec une vitesse maximale pour réduire les temps entre les échantillons ! 

Pour éliminer cette contrainte vous pouvez faire des acquisitions en boucle sur le micro puis les stockés à la mémoire du micro ensuite faire la transmission du tableau mémoire avec la vitesse à votre choix. Dans ce cas la période d’échantillonnage est égale à l’inverse de la fréquence d’échantillonnage de l’ADC du micro ! Cette technique est faisable dans le cas de notre micro qui dispose de 64k de mémoire 🙂

ISIS ne supporte pas des simulations en temps réel pour des vecteurs trop longues, par exemple quand vous faites des acquisitions de 1024 échantillons en boucle de l’ADC, l’ISIS n’arrive pas à stocker et afficher les valeurs et la simulation plante 🙁

 

N = 256 : 

Projet électronique Oscilloscope numérique à base du microcontrôleur PIC18F4680 à liaison série RS232 matlab

N=1024 : 

Projet électronique Oscilloscope numérique à base du microcontrôleur PIC18F4680 à liaison série RS232 matlab 1024

 

Code MikroC :

#define         CONFIG3H_ADD  0x300005
#define         BauValue      19200

unsigned char    *CONFIG3H_REG;

unsigned int     Data_ADC=0;
float            ADC_float=0.0;
int              Channel_Value;
char             Char_Value[3];

void main()
{
   TRISA =  0xFF;
   ADCON1=  0x00;

   // Initialiations
   ADC_Init();
   UART1_Init(BauValue);
   Delay_ms(100);


   TRISD=0x00;
   CONFIG3H_REG = CONFIG3H_ADD;
   
   // bit7=1 CONFIG3H , MCLR enabled
   *CONFIG3H_REG = 0x80;

   while(1)
   {
       // Lecture ADC
       Data_ADC=ADC_Read(0);
       
       // Convertir le mot 12 bits en 8 bits
       ADC_float=(float)((float)Data_ADC*255.0/1023.0);
       Channel_Value=(int)ADC_float;
       
       // Convertir Int to String
       IntToStr(Channel_Value,Char_Value );
       
       // Transmettre la Data sur 8 bits
       UART1_Write_Text(Char_Value);
       
       // Transmettre le séparateur des données
       UART1_Write('#');
   }
}

Code Matlab :

% Paramètres des canaux
NumChann=2;
LengthChan = 256;
Channels= zeros(NumChann,LengthChan);

% Paramètres de la liaison série (COM)
BauValue=19200;             % Vitesse
NumBits=8;                  % Nomble de bits
PortName='COM2' ;           % Nom du port

% Création d'un objet Serial Port(Ligne 1) 
s = serial(PortName,'BaudRate',BauValue,'DataBits', NumBits, 'Parity', 'none');

% Connexion au port
fopen(s); % (Ligne 2) 
s.Terminator ='#';
s.timeout=1e5;

% Mesure de la période d'échantillonnage (calibration à 50Hz)
Ts=9.285*5/BauValue;
Fs=1/Ts;
t=0:LengthChan-1;
t=t*Ts;
MaxTime=max(t);
i=1;

while(1)

    % Lecture et enregistrement des signaux

    while i~=LengthChan

        CharValue = fgets(s);
        CharValue1=CharValue(1:end-1);

        Channels(1,i)= str2double(CharValue1);
        i=i+1;
    end

    % Signal temporel
    Ch1 =Channels(1,:)*5/255;

    for i=2:LengthChan
        if(isnan(Ch1(i)))
            Ch1(i)=Ch1(i-1);
        end
    end

    % FFT
    NFFT=2^nextpow2(LengthChan);

    % f = Fs/2*linspace(0,1,NFFT/2+1);
    f = Fs/2*linspace(0,1,NFFT/2+1);
    Ch_FFT=fft(Ch1-mean(Ch1),NFFT)/LengthChan;
    Ch_FFT=2*abs(Ch_FFT(1:NFFT/2+1));

    % Calculs des paramètre du signal
    Ch0 = Ch1(10:end-10);
    Moyenne_s = mean(Ch0);
    Max_s = max(Ch0);
    Min_s= min(Ch0);
    Var_s = var(Ch0);
    [Ampl_Freq Freq_Indice]=max(Ch_FFT);
    Max_Freq= f(Freq_Indice);

    Moyenne_Str =strcat('Moyenne(V)= ', num2str(Moyenne_s));
    Max_Str= strcat('Max(V) = ',num2str(Max_s));
    Min_Str= strcat('Min(V) = ',num2str(Min_s));
    Var_Str= strcat('Var(V) = ',num2str(Var_s));
    Freq_Str=strcat('Freq(Hz) = ',num2str(Max_Freq));

    % Affichage temporelle
    figure(1);
    subplot(211);
    plot(t,Ch1);grid on;
    xlabel('Temps(s)');
    ylabel('Tension(V)');
    title('Tension V=f(t)');

    text(max(t)-LengthChan*Ts/4,max(Ch0)*1.2,Moyenne_Str);
    text(max(t)-LengthChan*Ts/4,max(Ch0)*1.4,Max_Str);
    text(max(t)-LengthChan*Ts/4,max(Ch0)*1.6,Min_Str);
    text(max(t)-LengthChan*Ts/4,max(Ch0)*1.8,Var_Str);
    text(max(t)-LengthChan*Ts/4,max(Ch0)*1,Freq_Str);

    xlim([min(t) max(t)]);
    ylim([min(Ch1)*2 max(Ch1)*2]);
    xlim([min(t) max(t)]);

    % Affichage fréquentielle
    subplot(212);
    plot(f,Ch_FFT); grid on;
    title('Single-Sided Amplitude Spectrum of y(t)')
    xlabel('Frequency (Hz)')
    ylabel('|Y(f)|')

    % Mise à jour  de la période T
    t=t+MaxTime;
    Channels(1,:)=0;
    i=1;

    % Pause(2);

end

% Destruction de l'objet (Port série)
% Note :
%     - Clrl+C : Arreter le programme
%     - Executer le code si-dessus dans l'espace workspace
%       pour détruire l'objet Serial

% delete(s);
% clear s;

 

 Télécharger le projet électronique Oscilloscope numérique à base du microcontrôleur PIC18F4680 à liaison série RS232

Un petit commentaire de vous, un Grand encouragement pour nous 🙂 

Une réponse sur « Projet électronique : Oscilloscope numérique à base du microcontrôleur PIC18F4680 à liaison série RS232 »

Laisser un commentaire