Une alimentation gérée par µC
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Une alimentation gérée par µC



  1. #1
    carcan

    Une alimentation gérée par µC


    ------

    Bonjour,

    je vais vous présenter une alimentation gérée par un microcontrôleur, qui permet d'obtenir une tension de sortie de 0 à 20Vdc et limitée à 1.5A.
    La gestion locale se fait via un clavier 16 touches et un LCD 2 lignes 16 caractères ; en mode USB, la tension est imposée à partir du PC et tension réelle et courant sont renvoyés vers le PC.

    Toute la partie analogique est basée sur les schémas de Tropique (http://forums.futura-sciences.com/pr...reference.html). Vous pouvez donc vous baser de toutes les précieuses informations de ce topic pour comprendre le fonctionnement et aussi l'adapter à vos besoins (autres tensions/courants).

    Le montage que je vais vous présenter se compose de 2 platines :
    - platine "puissance" : elle contient toute la partie analogique ainsi que le DAC et ADC
    - platine "µC" : elle possède le microcontrôleur PIC et toutes les connexions vers clavier, écran LCD, USB, liaison vers platine puissance

    La source d'énergie peut toujours être confiée à un classique transformateur + redressement et filtrage ; dans mon cas, j'ai utilisé un bloc alimentation 24V 2A disponible dans le commerce.

    La liaison entre le PIC et les convertisseurs se fait en SPI, les composants utilisés sont :
    - µC : PIC18F4553
    - ADC : MCP3202
    - DAC : MCP4921

    Je vous mets déjà en pièce jointe quelques photos, schéma de principe de la platine puissance, les typons au format WinTypon.

    Les explications, codes source, ... suivront dans les prochains posts

    A bientôt
    Laurent

    -----
    Images attachées Images attachées
    Fichiers attachés Fichiers attachés

  2. #2
    carcan

    Re : [Terminé] Une alimentation gérée par µC

    ... Le Typon au format .WT5 est dans le ZIP ...

    Tout tient sur une carte 10*16 (à découper après gravure).
    Sur la gauche, la carte puissance ; sur la droite, la carte µC.
    Fichiers attachés Fichiers attachés
    Dernière modification par carcan ; 14/08/2012 à 16h08.

  3. #3
    carcan

    Re : [Terminé] Une alimentation gérée par µC

    D'autres photos des 2 cartes électroniques ...
    Images attachées Images attachées

  4. #4
    carcan

    Re : [Terminé] Une alimentation gérée par µC

    Voici maintenant le principe de fonctionnement :

    Le microcontrôleur utilisé est un PIC 18F4553 (vous pouvez aussi utiliser le 4550), il se trouve "tout seul" sur une petite carte reprennant les éléments suivantes :
    - connecteur vers afficheur LCD 2x16 (par exemple : http://be01.rs-online.com/web/p/products/532-6521/)
    - connecteur vers clavier matricé 16 touches (par exemple : http://be01.rs-online.com/web/p/products/507-497/)
    - connecteur vers la platine principale (possédant la liaison SPI et l'alimentation 5V du µC)
    - connecteur pour extensions futures (il reprend les IO RA0 à RA5, RE0 et RE1)
    - le connecteur USB pour liaison vers le PC
    - un jumper "USBPwr" : il sert à alimenter cette petite platine via le port USB pendant la phase de développement*
    - un jumper "Loader" : il sert à activer le BootLoader pendant la phase de développement*
    - les quelques composants périphériques du PIC (résistances de pull-up, quartz, ...)

    *Il n'est pas utile de les souder si vous utilisez mon fichier HEX

    Je n'ai pas réalisé de schéma de principe de la carte "µC" vu la simplicité de celle-ci.

    Je ne reviens pas sur le fonctionnement de la régulation de l'alimentation, tous les détails sont disponibles dans les posts de Tropique.
    Les modifications apportées au schéma sont :
    - le 12V qui alimente les AOP est produit par un 78L12 (option déjà discutée)
    - la référence de tension n'est plus une zéner mais une référence de précision REF195 qui sert à l'ADC et au DAC
    - un convertisseur numérique / analogique SPI 12bits MCP4921 qui génère la tension de consigne
    - un convertisseur analogique /numérique SPI 12bits 2 canaux MCP3202 qui mesure l'image de la tension et du courant en sortie
    - un des AOP a été utilisé pour mettre à l'échelle la mesure du courant pour l'ADC
    - un régulateur LM7805 a été ajouté sur la carte afin d'alimenter la platine µC

  5. A voir en vidéo sur Futura
  6. #5
    carcan

    Re : [Terminé] Une alimentation gérée par µC

    Pour la réalisation pratique des circuits ... quelques conseils :

    - les résistances et condensateurs cms sont en boîtier 1206
    - sous le LM324, il y a un strap en forme de L à placer en premier lieu
    - je vous conseille d'utiliser ces connecteurs pour vous simplifier la vie : http://www.gotronic.fr/cat-connecteu...primes-856.htm (pour les 7 et 14 broches, j'ai mis des 8 et 15, en coupant la patte en trop).
    - le clavier utilisé permet de dessiner ses propres touches, le programme que j'ai créé permet d'utiliser les modèles fournis directement avec le clavier (touches 0 à 9, flèches < et >, Enter, Clear, '.', la touche libre a été mise en rouge comme "arrêt d'urgence"
    - le rétroéclairage du LCD a été câblé directement à l'arrière de l'afficheur, il faut ponter les straps adéquats et monter une résistance de limitations pour la LED (l'emplacement est prévu). Essayez de trouver un afficheur avec rétroéclairage à faible consommation. Ici, j'ai choisi un modèle blanc/bleu à grands caractères.
    - des semelles mica ou équivalent doivent être montées sur Q1 et Q5

  7. #6
    carcan

    Re : [Terminé] Une alimentation gérée par µC

    Voici maintenant le code source, il a été écrit en CCS :
    Code:
    #include <18F4553.h>
    #device adc=12
    #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOMCLR
    #use delay(clock=48000000)
    
    
    #include <stdlib.h>
    #include <usb_cdc.h>
    #include "Flex_LCD420.h"
    #include "KBD44.h"
    #include "MCP3202.c"
    #include "MCP4921.c"
    #include <usb_bootloader.h>
    
    static int1 EditMode, PCMode;
    static float Vmax = 20.0;
    
    void PSUCtrl (float Vout)
    {
       int16 DACVal;
       
       DACVal = (int16)(4095.0*Vout/Vmax);
       
       write_dac(DACVal);
    }
    
    float GetV(void)
    {
       int16 Digit;
       float V;
       
       Digit = read_analog_mcp(1);
       
       V = (float)(Digit)/4095.0*Vmax;
       
       return(V);
    }
    
    float GetI(void)
    {
       int16 Digit;
       float I;
       
       Digit = read_analog_mcp(0);
       
       I = (float)(Digit)/4095.0*2.032;//valeur de I mesure max (attention aux tolérences des composants)
       
       if (I<0.009) I = 0.0;
       
       return(I);
    }
    
    void main()
    {
       char k,c;
       char StrVolt[6] = {'0','0','.','0','0','\0'};
       static int index,Counter;
       float Voltage,RealV,RealI;
       
       Counter = 249;//affichage 2e ligne sans attendre à la MST
          
       usb_cdc_init();
       lcd_init();
       kbd_init();
       init_dac();
       
       delay_ms(5);
       PSUCtrl (0.0);
       
       printf(lcd_putc,"Digital PSU Unit\n");
       printf(lcd_putc,"Laurent Collard");
       delay_ms(2000);
       
       lcd_putc('\f');
       
       printf(lcd_putc,"%sVdc",StrVolt);
    
       while(TRUE)
       {
         //Gestion USB
         usb_task();
         enable_interrupts(GLOBAL);
         if (usb_cdc_connected())
         {
             PCMode = 1;
             if (usb_cdc_kbhit()) 
             {
                c=usb_cdc_getc();
                if (c=='U') printf(usb_cdc_putc, "%f\r\n",RealV);
                if (c=='I') printf(usb_cdc_putc, "%f\r\n",RealI);
                if (c=='?') printf(usb_cdc_putc, "DigPSU\r\n");
                if (c=='$') 
                {
                   Voltage = get_float_usb();
                   if (Voltage>Vmax) Voltage = Vmax;
                   if (Voltage<0.0)  Voltage = 0.0;
                   lcd_gotoxy(1,1);
                   if (Voltage<10.0) lcd_putc('0'); 
                   printf(lcd_putc,"%2.2f",Voltage);
                   PSUCtrl(Voltage);
                   printf(usb_cdc_putc, ">\r\n");
                }
             }
         }
         else PCMode = 0;
         
         //Gestion Clavier
         k=kbd_getc();
         if (k!='\0' && !PCMode) 
         {
             if (k>='0' && k<='9')//entrée numérique
             {
                if (!EditMode) {index=0;lcd_gotoxy(1,1);lcd_blink(1);EditMode=1;}
                
                if (index<5)
                {
                   lcd_putc(k);
                   StrVolt[index]=k;
                   index++;
                   if (index==2) {index++;lcd_putc('.');}
                } 
             }
             else //autres touches
             {
                if (k=='.' && EditMode) 
                { 
                   if (index==1)
                   {
                      StrVolt[1]=StrVolt[0];
                      StrVolt[0]='0';
                      lcd_gotoxy(1,1);
                      lcd_putc(StrVolt[0]);
                      lcd_putc(StrVolt[1]);
                      lcd_putc('.');
                   }  
                   index=3; lcd_gotoxy(4,1);
                }
                              
                if (k=='<' && index>0) { index--; if (index==2) index--; lcd_gotoxy(index+1,1); lcd_blink(1);EditMode=1;}
                if (k=='>' && index<4) { index++; if (index==2) index++; lcd_gotoxy(index+1,1); lcd_blink(1);EditMode=1;}
                if (k=='-') //arrêt urgence
                {
                   PSUCtrl(0.0);
                   lcd_blink(0);
                   EditMode=0;
                   lcd_gotoxy(1,1);
                   printf(lcd_putc,"00.00");
                }
                
                if (k=='E') //envoi tension au DAC
                {
                   lcd_blink(0);
                   EditMode=0;
                   Voltage = atof(StrVolt);
                   if (Voltage>Vmax) Voltage=Vmax;
                   lcd_gotoxy(1,1);
                   if (Voltage<10.0) lcd_putc('0'); 
                   printf(lcd_putc,"%2.2f",Voltage);
                   PSUCtrl(Voltage);
                }
                
                if (k=='C') //correction
                {
                   StrVolt[0]='0';
                   StrVolt[1]='0';
                   StrVolt[2]='.';
                   StrVolt[3]='0';
                   StrVolt[4]='0';
                   index=0;
                   lcd_gotoxy(1,1);
                   printf(lcd_putc,"00.00");
                   lcd_gotoxy(1,1);
                   lcd_blink(1);
                   EditMode=1;
                }
             }
         }
         
         //Délai
         delay_ms(1);
         
         //Boucle +-250ms
         if (Counter++==250 && !EditMode)
         {
            Counter=0;
            
            RealV = GetV();
            RealI = GetI();
            lcd_gotoxy(1,2);
            if (RealV<10.0) lcd_putc('0'); 
            printf(lcd_putc,"%2.2fVdc  %1.3fA",RealV,RealI);
            
            lcd_gotoxy(12,1);
            if (PCMode) printf(lcd_putc,"   PC");
            else        printf(lcd_putc,"LOCAL");
         }
       }
    
    }
    La liaison vers le PC en USB génère un port COM virtuel, vous pouvez interroger et contrôler l'alimentation de la manière suivante (par exemple avec Hyperterminal ou en créant votre propre application :
    - envoi du caractère U : donne la tension en volts
    - envoi du caractère I : donne le courant en ampères
    - envoi du caractère $ suivi de la tension désirée en volts impose la tension à la sortie de l'alimentation
    - envoi du caractère ? : retourne l'info "DigPSU" (ce qui permet d'identifier le matériel dans vos applications)

    Comme on est en port COM virtuel, la vitesse de communication est adaptée automatiquement, dans les réglages de hyperterminal, vous pouvez utiliser du 9600, 19200, ... bps en 8bits pas de parité 1 stop

    Le programme doit être modifié à la ligne 16 si une autre tension maximale de sortie est désirée.
    La ligne 46 doit aussi être modifiée si le courant Max est changé ou pour calibrer la mesure de courant.


    En pièce jointe un premier ZIP avec le code source, les drivers (LCD, clavier, ADC, DAC, ...) les fichiers Hex (version avec intégration BootLoader et version simple.
    Le second ZIP est le BootLoader adapté à ce projet.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [Energie] Intensité d'une LED 32V gérée par Arduino ?
    Par Jeremy-Zoe dans le forum Électronique
    Réponses: 60
    Dernier message: 20/12/2015, 17h35
  2. Autoconstruction VMC Double Flux Contre à Courant Gérée par Crouzet M3
    Par invite1ecec03d dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 7
    Dernier message: 14/12/2013, 21h08
  3. [Intro] Une alimentation gérée par µC
    Par carcan dans le forum Électronique
    Réponses: 2
    Dernier message: 14/08/2012, 18h15
  4. Pompe doseuse atypique gérée par informatique
    Par invitec46ceaa8 dans le forum Électronique
    Réponses: 3
    Dernier message: 18/05/2006, 08h52
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...