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.
Configuration du PIC18F4680:
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)
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 :
N=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;
Une réponse sur « Projet électronique : Oscilloscope numérique à base du microcontrôleur PIC18F4680 à liaison série RS232 »
merci beaucoup