Non classé

1 8 9 10 11 12 25

Dernière mise à jour le 09/10/16

Présentation


Transmettre plusieurs bytes sur les mêmes broches ?! c’est tout à fait possible bien sûr!! pour les exemples qui vont suivres je vais utiliser le PIC 12F675 sinon vous pouvez utiliser à la place le PIC 12F629.
 
Nous allons étudier le fonctionnement d’un un tableau nommé plus précisément sous le nom de array. Ce tableau aura plusieurs façon de travailler avec soit la:

  • Lecture d’une valeur du tableau
  • Lecture de deux valeurs du tableau
  • Lecture en série de plusieurs valeurs du tableau

Un tableau est désigné par son nom exemple :
Tableau[0], ou bien si je voulais je pouvais lui donner un autre nom comme Bonjour[0]. Ensuite chaque éléments d’un tableau est numérotés de l’index départ et de l’index fin. Bonjour[0..1] ce tableau comporte donc 2 éléments soit:
Bonjour[0], et Bonjour[1].

La déclaration de cette variable puisque le tableau comporte 2 éléments sera en MikroPascal :
Bonjour : Array[2] of byte;

Lecture d’une valeur du tableau
Lorsque la déclaration de notre tableau est effectuée ainsi que la déclaration du nombre d’éléments, nous allons voir dans ce premier exemple comment lire uniquement la valeur logique situé dans le tableau[0] qui est la valeur « 1 » logique. Cette valeur sera ensuite affichée en valeur logique sur les broches du PIC 12F675.

Programme du PIC


  program Valeur_Tableau;;
  var
 Tableau : Array[2] of byte;



 procedure Init();
   begin
    CMCON:=%00000111; // comparateurs OFF;
    TRISIO:=%00000000; // GPIO.1 config en entrée
    GPIO:=%00000000;
    ANSEL:=$00; //On désactive toutes les entrées analogiques
   end;



procedure LectureTableau;
    begin
     Tableau[0]:=1; // lecture d’une seule valeur
     GPIO:= Tableau[0]; // on écrit la valeur lue dans le tableau sur toutes les broches du PIC
    end;



  Begin
   Init;
   While true do
     begin
      LectureTableau;
     end;
   end.

valeur_1


La broche GP0 du PIC affiche la valeur lue interne à l’élement du tableau[0] qui correspond bien à 1 soit 1 logique.

Lecture de deux valeurs du tableau
Essayons maintenant d’afficher la valeur 2 qui correspond à « 10 » en valeur logique le programme ci-desous :

Programme du PIC


  program Valeur_Tableau;;
  var
 Tableau : Array[2] of byte;

 procedure Init();
   begin
    CMCON:=%00000111; // comparateurs OFF;
    TRISIO:=%00000000; // GPIO.1 config en entrée
    GPIO:=%00000000;
    ANSEL:=$00; //On désactive toutes les entrées analogiques
   end;

procedure LectureTableau;
    begin
     Tableau[0]:=10; // lecture d’une seule valeur
     GPIO:= Tableau[0]; // on écrit la valeur lue dans le tableau sur toutes les broches du PIC
    end;

  Begin
   Init;
   While true do
     begin
      LectureTableau;
     end;
   end.

valeur_2

Il s’agit bien de la valeur numéro 2 en logique mais !!! pour 3 cela donne « 11 » en logique soit :

Programme du PIC


  program Valeur_Tableau;;
  var
 Tableau : Array[2] of byte;

 procedure Init();
   begin
    CMCON:=%00000111; // comparateurs OFF;
    TRISIO:=%00000000; // GPIO.1 config en entrée
    GPIO:=%00000000;
    ANSEL:=$00; //On désactive toutes les entrées analogiques
   end;

procedure LectureTableau;
    begin
     Tableau[0]:=11; // lecture de 2 valeurs qui correspond au chiffre 3 en décimal
     GPIO:= Tableau[0]; // on écrit la valeur lue dans le tableau sur toutes les broches du PIC
    end;

  Begin
   Init;
   While true do
     begin
      LectureTableau;
     end;
   end.

valeur_3

Lecture à la chaine de plusieurs valeurs du tableau
Nous avons vu qu’il était possible de lire une ou plusieurs valeur dans le tableau en même temps. Maintenant nous allons voir comment lire les valeurs dans le tableau mais les unes après les autres ou plus précisément en série.

Le but est le suivant, plutôt que d’afficher les valeurs lues sur l’ensemble des broches du PIC, nous allons envoyer par paquet ces séries uniquement sur une seule broche du PIC 12F675, alors comment faire ? C’est ce que nous allons voir tout de suite.
Prenons l’exemple pour afficher le chiffre 2 qui s’écrit en logique « 10 ».
Afin d’accéder à un champ du tableau le point (.) permet donc d’accéder aux bits individuels du registre Tableau[0]

Programme du PIC


program Valeur_Tableau;
var
Tableau : Array[2] of byte;
iInc: byte;
procedure Init();
begin
CMCON:=%00000111; // comparateurs OFF
TRISIO:=%00000000; // GPIO.1 config en entrée
GPIO:=%00000000;
ANSEL:=$00; //On désactive toutes les entrées analogiques
end;

 

procedure LectureByte;
 begin
Tableau[0]:=10; // correspond au chiffre 2 en décimal
//Tableau[0]:=11; // correspond au chiffre 3 en décimal
  begin
for iInc := 0 to 1 do // lecture en boucle du1er bit( 0=1er bit) , lecture en boucle du 2ème bits (1=2ème bits),
 
   begin
GPIO.0:= Tableau[0].iInc; // lecture des bits les un après les autres et de les reproduire sur la broche GPIO.0 du PIC
end;
  end;
end;

 

begin
Init;
while true do
begin
LectureByte;
end;
end.

transmission_serie

Il est ainsi possible de mettre plusieurs bits dans le tableau et de lire ces bits les uns après les autres afin de pouvoir envoyer ces informations seulement sur une broche du PIC. Prenons l’exemple au nous voulons coder le chiffre 228 en binaire, il suffit de 8 bit pour pouvoir écrire 228 soit en binaire cela donne 11100100.La programmation correspond à 8 bits mais dans le programme la boucle est sur 7 bits !!! bien évidement sur 7 bits !!! puisque le zéro est compris dans la boucle (de 0 à 7 = 8 valeurs)

Programme du PIC


program Valeur_Tableau;
var
Tableau : Array[2] of byte;
iInc: byte;
procedure Init();
begin
CMCON:=%00000111; // comparateurs OFF
TRISIO:=%00000000; // GPIO.1 config en entrée
GPIO:=%00000000;
ANSEL:=$00; //On désactive toutes les entrées analogiques
end;

 

procedure LectureByte;
begin
Tableau[0]:=%11100100; // chiffre 228 ecrit en binaire
begin
for iInc := 0 to 7 do // on scrute un à un les bits à l’aide d’une boucle
begin
GPIO.0:=Tableau[0].iInc; // la boucle permet de lire les bits un après l’autre
end;
end;
end;

 

begin
Init;
while true do
begin
LectureByte;
end;
end.

transmission_serie_228

Afin d’enfoncer plus loin le clou un petit montage électronique qui permet d’allumer les leds d’un afficheur 7 segments en utilisant un CD4094 qui est situé à cette article Afficheur 7 segments – CD4094 avec PIC 12F675

Dernière mise à jour le 16/04/18

Présentation


Afin de comprendre dans ses moindres détails ce montage électronique qui celui-ci n’est pas si simple qu’il en a l’air, je vous conseil d’aller faire un tour à cette article qui est Tableau – Array .

Schéma 001a


afficheur-7-segments-avec-cd4094

CD4094
Le CD4094 est composé d’un registre à décalage de 8 bits, les données sont décalées à chaque front montant de l’horloge (CLK). La sortie QS peut être utilisée pour cascader plusieurs CD4094 et passe à l’état logique « 1 » lorsque Q7 est activé. En ce qui concerne QS(barre) cette sortie s’active lorsque le front de l’horloge est descendant.




Fonctionnement avec un PIC 12F675
Si vous avez compris le rôle d’un tableau dans la programmation en MikroPascal dans le paragraphe “présentation”, alors nous pouvons commencer à décortiquer le programme qui satellite autour d’un PIC12F675. Lorsque l’entrée DATA (broche 2) du CD4094 est à l’état logique « haut » (présence d’un bit), et qu’à ce même instant l’entrée CLK (broche 3) qui est l’horloge passe à l’état logique haut, ce bit va donc être conduit directement en sortie sur la broche Q0. Une fois que la broche DATA repasse à l’état logique « bas » et que l’horloge aussi , le cycle peut recommencer. Si de nouveau nous avons sur l’entrée DATA un état logique « haut » et que au même instant l’entrée CLK repasse à l’état logique haut, un deuxième bit va apparaitre sur la broche Q0 et va donc décaler le bit précédent sur la broche Q1. Voila ce qu’on appel un registre à décalage.Chaque bits est décalés à chaque coups d’horloge, il faut donc trouver un moyen d’envoyer en série ces bits sur la broche 2 du CD4094 tout en ayant des coup d’horloge régulier hum !!! pas facile !!.
En ce qui concerne le bouton poussoir, celui-ci permet à chaque appuis d’incrémenter une valeur de 0 à 9 sur l’affichage 7 segments. En ce qui concerne l’allumage de l’afficheur, je vous laisse faire les calculs à savoir que la tension en sortie de CD4094 est de 5V pour 88mA qui suffiront largement. Il ne reste plus qu’à utiliser la fameuse formule de la loi d’ohm U=R*I..

Logiciel du PIC



Programme MikroPascal du PIC 12F675 Afficheur 7 segments 001a – Pour PIC 12F675
Programme MikroC + fichier source du PIC 12F675 Afficheur 7 segments 001a – Pour PIC 12F675

Protoype


Non pas pour l’instant un jour peut-être….

Circuit imprimé


Aucun

Historiques


– 16/04/18
Mise à jour Logiciel du PIC en MikroC + fichier source suite demande d’un internaute.
– 18/02/18
Mise à jour
– 09/10/16
Première mise à disposition.

Dernière mise à jour le 29/09/16

Les interruptions PIC24/PIC32


La lecture qui va suivre permet de nous intéresser sur les interruptions issu d’un microcontrôleur et de prendre plusieurs exemples afin de voir et comprendre le fonctionnement des ces fameuses interruptions. Les interruptions d’un PIC de la famille 12F/16F/18F… est différents d’un PIC de la famille 24 ou 32 puisque ce dernier dispose de 5 timers qui peuvent être réglés soit sur 16 bits ou soit 32 bits. Pour comprendre en détails j’ai réalisés plusieurs exemples ci-dessous, ou je vais utiliser dans un 1er temps le PIC24FJ16GA002 de chez Microchip qui sera une simulation via Proteus, puis dans un 2ème temps je vais utiliser sur une platine d’essais sans soudure le PIC32MX534F064H de chez MikroElectronika vendu sous le nom de MINI-32.

Bon maintenant assez discuté et rentrons désormais dans le vif du sujet !!

Appel de la routine iv IVT_ADDR_TXINTERRUPT
Pour lancer une interruption il faut avant tout appeler la routine nommée« iv IVT_ADDR_TXINTERRUPT » (X à remplacer par le timer désiré).
Comme vous pouvez le constater, il faut utiliser une structure qui est bien différentes des PIC12F/16F/18F. La structure du programme sera de cette façon:


procedure TimerX; // procedure nommée Timer1
iv IVT_ADDR_TXINTERRUPT; // Appel de l’interruption du TimerX
// (X sera remplacé par le timer désiré)
begin
// Programme de l’interruption
end;
begin
while true do
begin
// programme principal
end;
end.

J’ai donné un nom pour la procédure « TimerX » mais rien ne vous empêche de l’appeler autrement. Sous ce nom s’enchaine immédiatement la routine iv IVT_ADDR_TXINTERRUPT qui fait appel à l’interruption du timerX. Ensuite entre « begin » le début du programme et « end » la fin du programme il faudra bien évidemment écrire une ligne de code qui s’exécutera uniquement lorsque l’interruption sera appelée.En ce qui concerne le programme principal, celui-ci est exécuté lorsque l’interruption a terminée mais nous verrons plus loin comme une interruption commence et se termine.

Remarque :
Pour faire appel à l’interruption d’un autre Timers (Timer2/Timer3/Timer4/Timer5)
grâce à la routine :
iv IVT_ADDR_TXINTERRUPT, il suffit de remplacer « X » par le numéro du timer désiré comme dis précédemment
Voilà en ce qui concerne l’appel de l’interruption pas compliqué n’est-ce pas ?

Configurations TimerX


Nous venons de voir comment appeler une procédure d’interruption ainsi que la structure du programme mais ce n’est pas pour autant que le PIC va fonctionner … Il faut pour que ce microcontrôleur fonctionne, le programmer et l’initialiser lors de sa première mise sous tension.

TXCON
Le bit TXCON permet de réaliser beaucoup de chose (à vous de consulter la datasheet). (X sera remplacé par le timer désiré). Le Quartz oscille à une fréquence de 10Mhz et que cette oscillation est présente sur les broches OSCI et OSCO, cette oscillation n’est plus la même une fois arrivée à «l’intérieur» du PIC. En effet l’oscillation en interne est divisée par 2 (Fosc/2) soit deux fois moins vite. Dans les exemples qui vont suivres le prescaler sera réglé à 1:64, il en résulte que la durée pour chaque coups d’horloge est d’environ de 840 ms ce qui proche de la seconde et largement suffisant pour observer le clignotements des leds.

IEC0.TXIE ou IEC1.TXIE
Ce bit quant à lui permet d’activer les interruptions du timerX (cas contraire rien ne fonctionnera)

IFS0.TXIF ou IFS1.TXIF
Tout d’abord le bit « IFS0.TXIF ou IFS1.TXIF » (X sera remplacé par le timer désiré) permet lorsque le timer à débordé c’est-à-dire une fois que le timer est arrivé au bout de son comptage (soit sur 16 bits soit sur 32 bits), une interruption sera déclenchée et, celle-ci permettra de faire passer le drapeau « Flag » à l’état logique « 1 ». Une fois ce drapeau à l’état logique « 1 » le programme principal est stoppé laissant place à l’interruption. Afin que le programme principal s’exécute correctement dès la mise sous tension du microcontroleur, il faut pour cela initialiser le bit IFS0.TXIF à l’état logique « 0 ».

TMRX
Ce bit permet de régler et d’affiner une valeur comprise entre 0 et 65535 pour un comptage sur 16 bits ou bien de 0 à 4294967295 pour un comptage sur 32 bits (X sera remplacé par le timer désiré). Le drapeau qui déclenche l’interruption, qu’il soit à l’état logique “1” ou l’état logique “0” n’aura aucune influence sur le comptage du ou des timers configurés.

Exemple Timer1


1er-exemple
Fonctionnement
Nous avons évoqué précédemment que les coups d’horloge étaient d’environ 840ms. Chaque fois que l’horloge arrivera à un temps de 840ms le drapeau via le bit IFS0.T1IF passera à l’état logique «1 » ce qui va interrompre la programme principal qui celui-ci ne fait que de scruter en permanence la procédure « Reset_LATA_timer1 » cette procédure ne fait que de désactiver la led. La subtilité d’une interruption fait que pendant 840ms le programme principal est scruté et à la fin des 840ms celui-ci est stoppé laissant place à l’interruption jusqu’à ce que le bit IFS0.T1IF soit remis à l’état logique “0” pour permettre au programme principal d’être de nouveau scruté. Je vous laisse réfléchir sur le code ci-dessous.


program Exemple_1_Timer1;
{ Declarations section }

procedure init;
begin
TRISA:=$0000;
LATA:=$0000;
AD1PCFG := $FFFF; // permet d’activer toutes les entrées en numérique
IFS0.T1IF := 0; // mise à zéro du bit T1IF
IEC0.T1IE := 1; // activation des interruptions du Timer1
T1CON :=%1000000000100000; // Timer1 ON, prescaler 1:64
TMR1:=$7FFF; // on commence à compterà parti de zéro
IPC0:=$7000;
IPC1:=$7000;
end;

procedure Timer1;
iv IVT_ADDR_T1INTERRUPT;
begin
if IFS0.T1IF = 1 then
begin
LATA.0:=1;
delay_ms(419);
IFS0.T1IF := 0; // remise à zéro du drapeau
end;
end;

procedure Reset_LATA_timer1;
begin
LATA.0:=0;
end;

// Programme principal
begin
init;
while true do
begin
Reset_LATA_timer1;
end;
end.

Exemple Timer1/Timer2


exemple_2

Passons maintenant à l’exemple suivant ou nous allons utiliser deux timers, (Timer1/Timer2). Avec l’aide des ces 2 timers le but est de faire clignoter alternativement les leds (D1 et D2). Au départ dans la procédure init du programme, Le Timer1 (TMR1) a été initialisé à $7FFF (Hex) soit 32767 (Dec). En ce qui concerne le Timer2 (TMR2) lui a été initialisé à $0000 (Hex) soit 0 (Dec). Le timer1 à donc une longueur d’avance sur le timer2 ?

TMR1/TMR2 comment ça fonctionne ?
Voilà un point important à élaborer qui consiste à comprendre le fonctionnement d’un timer. La configuration d’un timer via un PIC de la famille 24 ou 32 peut se faire soit sur 16 bits ou soit 32 bits, il en résulte que le timer à soit 65536 possibilité en 16 bits ou bien 4294967295 pour un 32 bits, hum !! Celà dit beaucoup de comptage pour le timer.
Prenons 16 bits afin de rester dans le contexte de l’exemple 2. Sur 16 bits le timer mathématiquement compte de 0 à 65536 (2^16=65536) soit 65536 possibilité puisque le zéro est compris. Imaginer le jeu de l’oie ou la case départ commence par zéro, au moment où vous allez avancer le pion cette case départ ne sera pas compter puisque vous allez commencer à compter à partir de la 1ere case… Et bien vous savez quoi ?!! Il en est de même pour le timer où il se verra de compter à partir de « 1 » soit 65535 possibilités (soit une case de moins). Lorsque le timer aura compté jusqu’à 65535 le drapeau « Flag » passera à l’état logique « 1 ».

Enfonçons un peu plus loin le clou!! et essayons de comprendre comment ce relais drapeau passe à l’état logique « 1 ». Imaginé une formule 1 qui aurait effectuée ces 65535 tours de pistes et arrive à tout vitesse sur la ligne d’arrivée ou à cet instant le drapeau se lève… Et bien encore une fois c’est le même principe pour le timer qui « enclenchera » ce relais drapeau lorsqu’il aura compté jusqu’à 65535 afin de stopper le programme principal.





Comment comparer 65535 avec un temps en ms ?
Comment calculer le temps en milliseconde à partir d’une valeur décimale ?
Nous avons évoqué dans le paragraphe « Configurations TimerX » que tout va dépendre du Quartz utilisé. Pour un Quartz de 10Mhz la cadence du PIC en interne sera deux fois moins rapide soit 5Mhz. Ensuite va venir des coefficients comme le prescaler (1:64) ainsi que le nombre de bits utilisés 16 bits soit 65535.

La temporisation obtenue en interne du Pic sera :
Tpic = (2/Fosc)*prescaler*nbrs de bits
Tpic = (2/10000000)*64*65535 = 0,838 sec soit 838ms

Pour un prescaler réglé à 1:64 et une configuration du PIC sur 16Bits avec un Quartz de 10Mhz la durée du comptage de 1 à 65535 est d’environ 838ms

Fonctionnement des 2 timers
Afin que les leds clignotent simultanément, et que nous puissions observer ces deux clignotements, il suffit de partager le temps en deux. Pendant qu’une led sera allumée l’autre sera éteinte et vice versa. La durée étant de 838ms ce qui donne pour deux clignotements 419ms.

Lorsque le timer1 aura compté jusqu’à 65535 la routine du timer1 s’exécutera suite au passage du drapeau à l’état logique « 1 ». Cela entraine l’allumage de la led et dans la foulé une temporisation de 418ms (petite parenthèse ce n’est pas une erreur oui!! il s’agit bien de 418ms soit 1ms de moins histoire de laisser un peu de temps pour que a procédure “Reset_LATA_…..” s’exécute bien ) afin de retarder le timer1 avant d’éteindre la led. Le fait de rajouter une temporisation n’aura aucun impact sur le comptage des timers. Cette temporisation permettra de voir le clignotement des leds une après l’autre.

Le programme en MikroPascal ci-dessous :


program Exemple_1_Timer1_Timer2;

{ Declarations section }

procedure init;
begin
TRISA:=$0000;
LATA:=$0000;
AD1PCFG := $FFFF; // permet d’activer toutes les entrées en numérique
IFS0.T1IF := 0; // mise à zéro du bit T1IF à l’initialisation
IFS0.T2IF := 0; // mise à zéro du bit T2IF à l’initialisation
IEC0.T1IE := 1; // activation des interruptions du Timer1
IEC0.T2IE := 1; // activation des interruptions du Timer2
T1CON :=%1000000000100000; // Timer1 activé, prescaler 1:64
T2CON :=%1000000000100000; // Timer2 activé, prescaler 1:64
TMR1:=$7FFF; // on commence à compter à parti de 32767
TMR2:=$0000; // on commence à compter à parti de 0
IPC0:=$7000;
IPC1:=$7000;
end;

procedure Timer1;
iv IVT_ADDR_T1INTERRUPT;
begin
if IFS0.T1IF = 1 then
begin
LATA.0:=1;
delay_ms(418); //(0,838 / 2 = 0,419) réglé à 418ms soit 1ms de moins
IFS0.T1IF := 0; // remise à zéro du drapeau du timer1
end;
end;

procedure Timer2;
iv IVT_ADDR_T2INTERRUPT;
begin
if IFS0.T2IF = 1 then
begin
LATA.1:=1;
delay_ms(418); //(0,838 / 2 = 0,419) réglé à 418ms soit 1ms de moins
IFS0.T2IF := 0; // remise à zéro du drapeau du Timer2
end;
end;

procedure Reset_LATA_timer1;
begin
LATA.0:=0; // on éteint la led D1
end;

procedure Reset_LATA_timer2;
begin
LATA.1:=0; // on éteint la led D2
end;

// Programme principal
begin
init;
while true do
begin
Reset_LATA_timer1;
Reset_LATA_timer2;
end;
end.

Exemples de code pour PIC32


Les exemples disponibles via les liens suivants ont été établis avec MikroPascal Pro for PIC32. Il existe une version de démonstration entièrement fonctionnelle mais limitée à 2 KO de code compilé sur le site Mikroe, que vous pouvez utiliser pour essayer ces exemples et même pour commencer vos projets personnel.
 
PIC32MX534F064H sur Mini-32
Présentation et réglages du Mini-32 (PIC32)

 
Captures/comparaison/PWM
Capture d’un signal en entrée (Input Capture) 

Sortie de comparaison (Output Compare) – PWM En cours….
 
Entrées/Sorties numériques ou analogiques
Configurations entrées/sorties (I/O)

Configurations entrées analogiques (A/N)
 
Les interruptions
Les interruptions

Les interruptions – Timer1
Les interruptions – Timer2/Timer3
 
Communications USBHID
Configuration port USB – VID/PID

Interface UsbHid – communication PC -> PIC
Interface USB – PIC32 – Sorties numériques

Dernière mise à jour le 25/09/16

Présentation


Ce présent article permet de programmer les entrées ainsi que les sorties d’un PIC24FJ64GA004. le programme qui va suivre permet lorsque nous appuyons sur un bouton poussoir, d’allumer une à une des leds par l’intermédiaire d’un bargraph. Chaque fois qu’une pression sur le bouton poussoir sera effectuée, les leds vont s’allumées les unes après les autres.


ATTENTION!!! Quartz non représenté sur le schéma électronique bien entendu celui-ci n’est pas optionnel 8Mhz ou 10Mhz fera largement l’affaire

Schéma


entrees_sorties
Le PIC24FJ64GA004 comporte deux PORTs (PORTA et PORTB). Le PORTA comporte uniquement 5 broches (RA0/RA1/../RA4), ces broches peuvent être utilisées pour différentes façon (analogique/numériques/tension de références/…) mais utilisons uniquement la broches RA0 pour l’exemple. En ce qui concerne le PORTB celui-ci comporte aux total 16 broches (RB0/RB1/.. /RB15). ont remarque très vite que la capacité d’un tel microcontrôleur sont plus importantes, et il en est de même pour le nombre d’entrées et sorties.





Config broches TRISA
La datasheet du PIC24FJ64GA004 nous informe que il y’a bien 16 bits (RA0/RA1/.. /RA15) à configurer mais attention la datasheet précise que les bits RA7/../R10 ne sont pas valides et que pour les autres bits formés par un “-” doivent être mis à l’état “0” logique. Il en résulte que tous les bits seront à l’état logique “0” sauf le bit RA0 qui sera à l’état logique “1” pour préciser qu’il s’agit d’une entrée. Le programme qui va suivre permet d’initialiser uniquement les entrées et les sorties du PIC24FJ64GA004


procedure init;
begin
TRISA:=$0001; // les broches RA0 et RA4 est à l’état 1
TRISB:=$0000; // les broches sont configurées en sorties
LATA:=$0000;
LATB:=$0000;// à l’état logique “0”
AD1PCFG := $FFFF; // permet d’activer toutes les entrées en numérique
end;

Le code complet le voici…


program Entrees_Sorties;
var
bStateBp1 : boolean;
i : byte;
procedure init;
begin
TRISA:=$0001; // les broches RA0 et RA4 est à l’état 1
TRISB:=$0000; // les broches sont configurées en sorties
LATA:=$0000;
LATB:=$0000;// à l’état logique “0”
AD1PCFG := $FFFF; // permet d’activer toutes les entrées en numérique
end;

procedure Bp1(i:byte);
begin
case i of
1 : LATB.0:=1;
2 : LATB.1:=1;
3 : LATB.2:=1;
4 : LATB.3:=1;
5 : LATB.4:=1;
6 : LATB.5:=1;
7 : LATB.6:=1;
8 : LATB.7:=1;
9 : LATB.8:=1;
10 : LATB.9:=1;
end;
end;

procedure ReadButton;
begin
begin
if ((PORTA.0=1) and (bStateBp1=false)) then
begin
bStateBp1:=true;
inc(i);
Bp1(i);
end;

begin
if (PORTA.0=0) and (bStateBp1=true) then bStateBp1:=false;
end;

// remise à zéro de la variable “i”…
begin
if i=11 then
begin
LATB:=$0000;
i:=0;
end;
end;
end;
end;

begin
init;
while true do
begin
ReadButton; // lecture en boucle du bouton
end;
end.

Dernière mise à jour le  01/05/16

Présentation


Implantation
Ce montage électronique est un temporisateur qui en fonction des valeurs de la résistance (Rx) et du condensateur (Cx) de modifier la largeur de l’impulsions. Ce montage électronique ne peut en aucun cas alimenter directement un relis par exemple, car le courant en sortie du CD4528 est de l’ordre de 8mA maxi. Il faudra ajouter à ce montage électronique un montage de puissance afin d’augmenter la capacité du courant en sortie du CD4528.

Schéma


Temporisateur_003

Alimentation
L’alimentation du montage électronique est réalisée via la diode de redressement et le condensateur C1.


Quelle valeur du condensateur C1

Le calcul du condensateur C1 dépend du courant d’alimentation qui est nécessaire pour faire fonctionner le montage électronique, j’ai décidé de façon arbitraire à ce que l’alimentation est capable de fournir un courant de 600mA pour une tension de 12V continue. L’alimentation qui alimente le circuit électronique (alimentation externe) est de 12V alternatif 50Hz, le transformateur que j’utilise délivre un courant de 3200mA donc suffisant pour assurer les 600mA.Afin d’obtenir une tension de 10V pour un courant de 600mA il faut faire des petits calculs pour déterminer la dimensionnement du condensateur C1.

Dimensionnement du condensateur C1
Prenons l’exemple suivant avec le montage ci-dessous:

Exemple 1

Afin d’obtenir une tension de 12V entre le + et le – de l’alimentation pour un courant de 600mA la charge devra avoir une résistance de 20 Ohms (R=U/I=12/0,6)=20 Ohms.
Avec les conditions respectées ci-dessus il faut maintenant trouver par calcul la valeur du condensateur C1. Pour cela nous allons commencer par exprimer le courant qui circule dans ce même condensateur grâce la célèbre formule Ic=c*(dU/dt) (dU qui veut dire delta et qui représente une petite variation de tension et dt représente aussi une petite variation mais par rapport au temps).
Le rôle de la diode D2 permet de redresser la 1er alternance, cette configuration permet de retrouver aux bornes du condensateur C1 une tension redressée mais de type simple alternance de fréquence 50Hz soit une période de 20ms.

Si nous mettons en place la charge de 20 Ohms directement en sortie du pont nous retrouvons un signal en sortie une allure comme représenté sur le graph ci-dessous.


charge_et_décharge


Sur le graph le temps t=5ms représente la valeur crête de la tension aux bornes du condensateur qui se calcul de cette façon :
Uc1=Uréseau-Ud2=12*1,414-0,8V=16V, la chute de tension aux bornes de la diode D2 dépend du courant qui la traverse. En l’occurrence dans notre exemple le courant est de 600mA, et pour un courant de 600mA la chute de tension aux bornes de D2 est environ proche des 0,8V


Bon et bien maintenant que nous avons déterminé la tension aux bornes du condensateur C1 il suffit de passer aux choses sérieuses. La charge du condensateur est faite sur la partie croissante de la courbe le but est de déterminer le de trouver son minimum. Pour ma part j’ai décidé d’avoir une tension moyenne aux bornes du condensateur de 11V, la tension minimum serais de 5,9V (Umoy=(16,1+5,9)/2=11V).A l’instant t1=4ms le minimum serait de 5,9V et à l’instant t=5ms la tension serait de 16,1V. Une formule va nous permettre de déduire le temps t1 en faisant :
t1= (ArcSin (Umin/Umax))/(100*3,14)= (ArcSin (5,9/16,1))/(100*3,14)=1,2ms
(de t1 à t : il s’agit de la charge du condensateur)


Lorsque le condensateur va se décharger il doit être capable sur un temps de 16,2ms (21,2ms-5ms=16,2ms) de fournir un courant de 600mA ce qui veut dire que la capacité du condensateur doit être égale à :
C=Ic*(dt/dU)=0,6*(0,0162/(16,1-5,9)=952µF (normalisé =1000µF)
il faut une charge qui consomme un courant de 600mA pour que la tension tombe à environ 10V ce qui ne sera pas le cas avec ce montage qui ne consomme que quelques milliampères !!
Réglage temporisation
Le réglage de la temporisation est effectué en modifiant les valeurs de Rx et Cx.


Temporisations comprise entre 5sec et 1min
Rx=100K et Cx=100uF pour environ 5sec
Rx=220k et Cx=100uF pour environ 8sec
Rx=1M et Cx=100uF pour environ 55sec
Rx=2M et Cx=100uF pour environ 1min40
Rx=10M et Cx=100uF pour environ >5min


Remarque :
Sur l’implantation des composants de la carte électronique les valeurs de Rx et Cx sont :
Rx représente R3/R4
Cx représente C2/C3

Prototype


Oui un petit prototype pour les différents essais de valeur Rx et Cx

Proto 1 Proto 2



Test de l’alimentation

Test 1

Les créneaux en sortie du montage ont une valeurs max de 10V crête, il en résulte que la diode zéner régule bien en sortie.

Oscillioscope

Circuit(s) imprimé(s)


Circuit imprimé

Typon au format PDF / Composants

Historiques


01/05/16
– Première mise à disposition.

Présentation


Je ne vais pas rentrer dans les détails puisqu’un exemple est évoqué ci-dessous:
Chute de tension


Ah oui!! j’avais oublié d’évoquer un règle à respecter. Si le pourcentage est supérieur aux valeurs indiquées ci-dessous il faudra augmenter la section du câbles, bien évidemment si la longueur est importante la chute de tension est aussi importante. Afin d’obtenir une faible chute de tension il faut donc “jouer” sur la section du câble ou bien de diminuer la longueur mais ça c’est à vous de voir…
Chute de tension_2

Présentation


Dans ce présent article nous allons aborder le calcul du courant de défaut, qui permet de régler le magnétique du disjoncteur voir Réglage disjoncteur

Protection contre les contacts indirects


Le courant de défaut entre phase et masse – ou entre un conducteur de phase et le conducteur de protection – doit être éliminé dans un temps compatible avec la sécurité des personnes.
Ce temps est déterminé par une courbe en fonction de la tension de contact présumée, basé sur les effets physiologiques du courant électrique sur le corps humain voir
Protection contre les risques du courant électrique


Temps de coupure

Application au schéma TN


Le courant de défaut If est égal à :

If=U0/Zd
U0 étant la tension nominale de l’installation entre phase et neutre,
Zs étant l’impédance de la boucle de défaut.


Protection par fusibles


Protection par fusible


La règle de protection consiste alors à s’assurer que le courant de défaut If provoque certainement la fusion du fusible dans le temps prescrit, en vérifiant que le point correspondant du graphique de fonctionnement des fusibles I(t) se trouve au-dessus de la caractéristique supérieure de la zone de fusion du fusible.
Le point A correspondant au temps t0 prescrit pour le courant de défaut If doit se trouver au-dessus de la limite supérieure de la zone de fonctionnement du fusible (FF). t1 est le temps réel de fusion du fusible résultant du courant de défaut If.


Protection par disjoncteurs

Protection par disjoncteur


Lorsque le dispositif de protection est un disjoncteur, il suffit de s’assurer que le courant de défaut If est au moins égal au plus petit courant Im assurant le fonctionnement instantané ou de court-retard du disjoncteur ; en effet, les temps de fonctionnement des disjoncteurs sont généralement inférieurs aux temps prescrits.

Si If est supérieur ou égal à Im, la protection est assurée.
Si If est inférieur à Im., il y a alors lieu, soit de diminuer le courant de fonctionnement instantané Im ou de court retard du disjoncteur (réglage du magnétique) si cela est possible, soit de réaliser des liaisons équipotentielles supplémentaires satisfaisant à la condition du paragraphe 415.2 de la NF C 15-100 telles que la résistance R entre toute masse et tout élément conducteur simultanément accessibles soit telle que :
R ≤ 50/Im
 

 
soit d’assurer une protection par des dispositifs à courant différentiel-résiduel de courant différentiel-résiduel assigné IΔn ≤ If.
Des disjoncteurs sélectifs peuvent être utilisés dans les circuits de distribution.

Si le courant de défaut If est supérieur au plus petit courant assurant le fonctionnement instantané du disjoncteur Im’ le temps de fonctionnement instantané ou de court-retard t1 du disjoncteur est nettement inférieur au temps t0 prescrit..

Méthodes de calcul



Courant de défaut

Présentation


Ce présent article à pour principe d’expliquer comment déterminer la section des conducteurs dans une installation électrique en industrie .

Pertes par effet joules


Les câbles électriques sont généralement en cuivre, un métal considéré comme un excellent conducteur. Ce constat est a priori vrai sur les courtes distances, mais dès que la longueur
devient importante, la perte par effet Joule (échauffement) n’est pas négligeable surtout pour de fortes intensités. Une installation électrique nécessite plusieurs types de conducteurs pour transporter le courant du tableau général aux différents points d’utilisation. Entre les uns et les autres, le choix est avant tout une question de normes.

Comment dimensionner un conducteur


La détermination de la section du conducteurs doit correspondre à un courant admissible au moins égal à :
I’z=k/f
I’z correspond aux courant fictif qui traverse le conducteur
k une constante qui dépend en fonction du type d’appareillages utilisé

  • Si Fusibles gG : I’z=(K3*In)/f
  • Si disjoncteur domestiques : I’z=In/f
  • Si disjoncteur industriels : I’z=Ir/f

f correspond à un coefficient qui dépend de (température/pose des conducteurs/méthode de référence/…)

Logiciel Ecodial


Nous allons utiliser le logiciel Ecodial pour simuler une installation électrique et verrons en détails comment celui-ci a fait ses calculs en utilisant la normes UTE C15-105. Il faut savoir que Ecodial ne prend pas tout les facteurs en comptes car beaucoup de paramètres peuvent exister, Ecodial (en mode automatique) va se contenter d’apporter un calcul simple afin d’avoir une approche sur la section du ou des conducteurs à mettre en place.




Calcul section de la Phase
Prenons un cas ou nous souhaitons installer un câble monophasé:

Type d’isolant : PR2 (2 car monophasé)

Type de conducteur : unipolaire

Longueur : Longueur du câble 100m

Température : 40°C – facteur de correction f1=0,85

Mode de pose : Câbles mono- ou multiconducteurs dans des conduits-profilés en montage apparent – méthode de référence B – facteur de correction f2=0,90

Neutre chargé : non (pas d’harmoniques)

Arrangement conducteurs (pose jointive): 7 circuits jointifs référence 1 facteur de correction f3=0,55

Nombres de couches : 3 facteur de correction f4=0,73


f=f1*f2*f3*f4=0,85*0,90*0,55*0,73=0,307


Pour un courant du disjoncteur réglé à Ir=0,7xIn=112A
I’z=Ir/f=1120,307=365A

Ainsi pour un courant fictif on trouve d’après le tableau une section de 150mm² pour la phase.

section câble

Calcul section du Neutre

Le conducteur neutre doit avoir une section supérieure à celle des conducteurs de phase dans le cas de circuits polyphasés constitués de câbles unipolaires et lorsque le taux d’harmoniques en courant de rang 3 et multiple de 3 dépasse 33 %. La section déterminante est celle du conducteur neutre calculée pour un courant d’emploi pris égal à 1,45 fois le courant d’emploi dans la phase. Le conducteur neutre est considéré comme chargé et un facteur de réduction du courant admissible de 0,84 doit être pris en compte.

Tableau de synthèse

Dans le cas de circuits triphasés avec neutre et lorsque le taux d’harmoniques en courant de rang 3 et multiple de 3 n’est défini ni par l’utilisateur ni par l’application, il est recommandé que le
concepteur applique au moins les règles suivantes :
• prévoir une section du conducteur neutre égale à celle de la phase (facteur 0,84) ;
• protéger le conducteur neutre contre les surintensités ;
• ne pas utiliser de conducteur PEN.

Dans notre exemple le neutre n’est pas chargé (aucune présence d’harmoniques), il en résulte que le conducteur neutre est égale au conducteur de phase c’est d’ailleurs ce que nous trouve Ecodial.


Conducteur neutre égale conducteur phase


Calcul section du PE (Protection Electrique)
Section PE

Rien de bien compliqué encore, il suffit de respecter les données du tableau ci-dessus.Dans notre exemple la section du conducteur de phase est bien supérieur à 35mm², et donc la section du conducteur PE est donc égale à Sph/2=150/2=75mm² (valeur normalisée 95mm²), c’est bien ce que Ecodial nous préconise!!

Présentation


Il est évident que les réglages du déclencheur d’un disjoncteur ne se font pas à la légère. En règle générale les réglages font l’objet de règles précises que je vais développer ci-après. Ces réglages sont le résultat de la note de calculs conformes à la NFC 15-100 et de ses guides pratiques dont le principal est le guide UTE C15-105. Afin d’interpréter correctement les réglages d’un disjoncteur, il est indispensable de connaître la NFC 15-100 et les textes satellites dans le cas contraire c’est un coup d’épée dans l’eau.

Conditions à respecter


Trois conditions sont à respecter pour qu’un dispositif de protection assure la protection d’une canalisation contre les surcharges :


* Condition 1) IB ≤ In
* Condition 2) In ≤ lz
* Condition 3) I2 ≤ 1,45.lz qui peut s’écrire k2.ln ≤ 1,45 lz ou k3.ln ≤ lz ou In ≤(Iz/k3)


IB Courant d’emploi,
In Courant assigné du dispositif de protection ; pour les dispositifs de protection réglables, In est le courant de réglage choisi (Ir),
I2 Courant de fonctionnement du dispositif de protection dans le temps conventionnel,
Iz Courant admissible dans la canalisation, compte tenu des facteurs de correction éventuels,
k2 Rapport du courant I2 assurant effectivement le fonctionnement du dispositif de protection à son courant nominal In,
k3 = k2/1,45.


Fusible
pour les fusibles, les deux conditions à respecter sont les suivantes :
Condition 1a) IB ≤ In
Condition 2) I2 ≤ 1,45.lz ou In ≤(Iz/K3) ou k3 In ≤ Iz


Le facteur k3 ayant les valeurs suivantes :
In < 16 A, k3 = 1,31
Fusibles gG
In ≥ 16 A, k3 = 1,10


Disjoncteur
Pour les disjoncteurs, les deux conditions à respecter sont les suivantes :
Condition 1a) IB ≤ In
Condition 1b) In ≤ lz

 Les caractéristiques fondamentales d’un disjoncteur on parlera de la taille du disjoncteur qui correspond au courant assigné (In) le plus élevé des déclencheurs qui peuvent l’équiper.

Réglages thermique


Comme évoqué ci-dessus, le réglage In est choisi en affinant avec Ir (courant de réglage), il en résulte que le choix du disjoncteur doit être au plus proche ou égale au courant d’emploi que consomme la charge en aval, il protège contre les surcharges.

Réglages magnétique


Réglage du magnétique
Le réglage du magnétique ce fera au plus prés du courant de défaut If . Il convient également de prendre en compte l’incertitude de +20% sur le déclenchement du magnétique

À l’aide du logiciel Ecodial (ancienne version), j’ai simulé une charge qui consomme un courant de 100A sous 230V, la longueur entre le transformateur et la charge est de 10m.
Sans titre
La charge consomme un courant de 100A Ib<=In => In=100A, le mode de pose du câble en prenant en compte toutes les contraintes donne un coeff  f= 1, il en résulte que  Iz=Ir(In)/f=100/1  Iz=100A.
La section de la phase est de 25mm² (tolérance 5%) et même chose pour le neutre.
Section PE < 25mm² ce qui donne un PE=16mm² Rpe=12mohms Xpe=0.8mohms

tableau-10

Pour trouver le courant de court circuit Ik1 entre phase et protection électrique à l’extrémité de la canalisation nous faisons:
racine ((Rtotal+Rpe)²+(Xtotal+Xpe)²)=racine ((16,48+12)²+(27,96+0,8)²)=40,475 mhoms
Icc=(V/Z)=230/40,475=5,68 kA (il faudra multiplier ces valeurs par des coefficient suivant le type de régime de neutre*m*Cmini).

 

 

Réglage du magnétique
Le réglage du magnétique ce fera au plus près du courant de défaut If (proche de 5,68kA). Il convient également de prendre en compte l’incertitude de +20% sur le déclenchement du magnétique
Im(Isd)=X*5,68*1,02

X: Correspond au nombre de fois le courant Ir le coefficient multiplicateur dépend de la technologie du disjoncteur (micrologic ou autres)

1,02: correspond à la tolérance de +20%.

Si par exemple nous avons une boucle de défaut (impédance de la boucle Zd=27miliOhms), et que nous trouvons par calcul un courant de 6000A!!!
il faudra régler le magnétique afin d’obtenir Im<=(If/1,2)=6000/1,2=5000 soit 5kA (le réglage du magnétique doit être inférieur à 5kA. (voir courbe du disjoncteur en bas).
Réglage magnétique
Avec fusible
Lorsqu’on utilise des fusibles, il faudra regarder la courbe sur la doc technique de celui-ci.

Exemple


Prenons un  exemple simple ou l’on considère que nous voulons alimenter une charge entre phase et neutre (230V 50Hz), et que cette charge consomme un courant de 500A sous un Cos Fi=0,85.
Avec ces éléments nous pouvons en calculer la puissance qui est: P=U*I*Cos Fi=230*500*0,85=97750W soit 97,86KW.

Thermique= réglage long retard (Protection contre les surcharges)

Afin de protéger cette charge nous devons mettre en place le disjoncteur de ligne qui devra être réglé au plus près du courant nominal de la charge Ir=500A. Si on respecte la norme UTE C15-105, celle-ci indique clairement que le courant de réglage du disjoncteur (Ir) Ir ≥ Ib (Ib correspond au courant nominal ou courant d’emploi qui circule dans la charge).Ir ≥ 500A,
il faudra donc trouver un disjoncteur supérieur ou égale à 500A. La gamme Compact de Scheider electric propose une large gamme de disjoncteur comme le NS630N qui admet un courant In=630A, l’appareil peux donc accepter et laisser passer un courant de 630A, mais aussi il est équipé d’une micrologie qui permet de régler Ir (Thermique) ainsi que Im (Magnétique)

NS630N compact

Le réglage du thermique se fera à 0,8xIn soit Ir=0,8×630=504A Ir ≥ Ib on respect bien la norme et nous somme proche des 500A!! (le faite de régler le thermique nous allons affiner pour être encore plus proche du courant Ib (courant nominal ou d’emploi de la charge))

Maintenant que le thermique est réglé il faut régler le magnétique qui celui-ci est réglé en fonction du courant de défaut (courant de court-circuit).

Magnétique = réglage court-retard (Protection contre les courts-circuits)
Le réglage du magnétique du disjoncteur est toujours effectué en prenant en compte d’une part le courant de défaut (If) (C’est en règle générale le cas le plus défavorable) et d’autre part l’incertitude sur le fonctionnement du magnétique (+20%), le magnétique protège contre les courts-circuits, il s’agit du courant de défaut simple (Schéma TT ou TN) ou de double défaut (Schéma IT) et le déclenchement au 1er défaut est obligatoire!! les dispositifs de protection contre les court-circuit doivent couper l’alimentation dans un temps inférieur à celui indiqué par les courbes de sécurité. Ensuite il suffit de connaître l’impédance de la boucle de défaut , pour cela revoir l’explication situé dans le paragraphe “Réglage du magnétique” d’ailleurs le réglage du magnétique est effectué grâce à cette formule Im<=(If/1,2)

Courbe du disjoncteur


Réglage
Le réglage du magnétique est bien inférieur à 5kA

1 8 9 10 11 12 25