[Programmation] Microcontroleur - convertisseur pur sinus
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 35

Microcontroleur - convertisseur pur sinus



  1. #1
    invitee941d999

    Cool Microcontroleur - convertisseur pur sinus


    ------

    Je suis entrain de réaliser un oscillateur à sinus pur, avec microcontroleur.
    La meme carte integre le bloc d'indicateur de tension, le bloc de mesure de tension et
    l'affichage de celle-ci. Je tape mon code dans mikroc sauf que le progamme ne marche pas bien.
    J'ai réalisé separement le code qui me genère le signal sinus à l'aide du TMR0
    et le code qui mesure la tension de batterie.
    Tout marche separement, sauf que je voulais fusionner les deux codes pour avoir le système complèt
    et celà que je n'arrive pas à sychroniser le deux codes. J'ai besoin d'aide...

    -----

  2. #2
    invitee941d999

    Re : Microcontroleur

    Voici le code en MikroC
    Code:
    #define          Sin_Val    64
    #define          Pas_Sin    1   // Prescaller 1/16
    // LCD module connections
    sbit LCD_RS at RB1_bit;
    sbit LCD_EN at RB2_bit;
    sbit LCD_D4 at RB3_bit;
    sbit LCD_D5 at RB4_bit;
    sbit LCD_D6 at RB5_bit;
    sbit LCD_D7 at RB6_bit;
    
    sbit LCD_RS_Direction at TRISB1_bit;
    sbit LCD_EN_Direction at TRISB2_bit;
    sbit LCD_D4_Direction at TRISB3_bit;
    sbit LCD_D5_Direction at TRISB4_bit;
    sbit LCD_D6_Direction at TRISB5_bit;
    sbit LCD_D7_Direction at TRISB6_bit;
    // End LCD module connections
    
    //Declaration des variables
    unsigned char SineWave_1[Sin_Val] = {128,140,152,165,176,188,198,208,218,226,234,240,245,250,253,254,255,254,253,250,245,240,234,226,218,208,198,
                                       188,176,165,152,140,128,115,103,90,79,67,57,47,37,29,21,15,10,5,2,1,0,1,2,5,10,15,21,29,37,47,57,67,79,90,103,115};
    unsigned char SineWave_2[Sin_Val] = {115,103,90,79,67,57,47,37,29,21,15,10,5,2,1,0,1,2,5,10,15,21,29,37,47,57,67,79,90,103,115,128,140,152,165,176,188,
                                       198,208,218,226,234,240,245,250,253,254,255,254,253,250,245,240,234,226,218,208,198,188,176,165,152,140,128};
    unsigned short int count = 0;
    //unsigned short int ValTimer0=0;
    unsigned int v,i;
    char *volt = "00.0";
    char *current = "0.00";
    //Fin Declaration des variables
    
    // Fonction pour stopper le Timer0 (Stop)
    void Timer_Disable(void)
    {
      INTCON.GIE = 0;
      INTCON.PEIE = 0;
      INTCON = 0;
      INTCON.TMR0IE = 0;
      INTCON.TMR0IF = 0;
      PORTC = 0;
      PORTD = 0;
    }
    // Fonction pour lancer le signal (Start)
    void Timer_Enable(void)
    {
      INTCON.GIE = 1;
      INTCON.PEIE = 1;
      INTCON.TMR0IE = 1;
      //INTCON.TMR0IF = 1;
    }
    char look(int a)
    {
       switch(a)
       {
           case 0:
                  return '0';
           case 1:
                  return '1';
           case 2:
                  return '2';
           case 3:
                  return '3';
           case 4:
                  return '4';
           case 5:
                  return '5';
           case 6:
                  return '6';
           case 7:
                  return '7';
           case 8:
                  return '8';
           case 9:
                  return '9';
           default:
                  return '.';
       }
    }
    // Routine d'interruption (Timer0 ou PORTB)
    void interrupt()
    {
     if(RB0_bit == 1)
      {
       while(1)
        {
         Timer_disable();
         RB7_bit = ~RB7_bit;
         if(!RB0_bit) break;
        }
        RB7_bit = 0;
        Timer_Enable();
      }
      if(INTCON.TMR0IF == 1)
      {
       if(RB0_bit == 0)
       {
        INTCON.TMR0IE = 0;
        INTCON.TMR0IF = 0;
        PORTC=SineWave_1[count] ;
        PORTD=SineWave_2[count] ;
        count+=Pas_Sin;
        count = count % Sin_Val;
        INTCON.TMR0IE = 1;
       }
      }
    }
    
    void main()
    { 
      PORTA = 0;
      PORTB = 0;
      PORTC = 0x00;                      // Initialisation des ports  à 0
      PORTD = 0;
      TRISA = 0xFF;
      TRISB = 0x01;
      TRISC = 0x00;                      // Direction des ports
      Lcd_Init();
      Lcd_Cmd(_LCD_CLEAR);
      Lcd_Cmd(_LCD_CURSOR_OFF);
      TRISD = 0x00;
      // Configuration du TIMER0 pour une fréquence de 2MHZ max (8MHz Fosc)
      OPTION_REG.T0CS = 0;              // bit 5  Source d'horloge (0 interne)
      OPTION_REG.T0SE = 0;              // bit 4  Type de front 0 our front montenat
      OPTION_REG.PSA = 0;               // bit 3  Activer le prediviseur
      OPTION_REG.PS2 = 0;               // bits 2-0  PS2:PS0: (0 à 255) pré-diviseur
      OPTION_REG.PS1 = 0;
      OPTION_REG.PS0 = 0;
      //TMR0 = ValTimer0;                 // Initialisation du TIMER0 à 0 (fréquence max)
    
    // Interrupt Registers
      INTCON.TMR0IE = 1;
      INTCON.GIE = 1;
      OPTION_REG.INTEDG=1;
         ADCON1 = 0x00;
       volt[0] = look(v/10000);
       volt[1] = look((v/1000)%10);
       volt[3] = look((v/100)%10);
      while(1)
      {
      ADCON1 = 0x00;
       v = ADC_Read(2);
       i = ADC_Read(3);
       i = (i*4.89)/0.47;
       v = ((v*4.89)/20)*120;
       if(v!=vp || i!=ip )
       Lcd_Cmd(_LCD_CLEAR);
       vp = v;
       ip = i;
       volt[0] = look(v/10000);
       volt[1] = look((v/1000)%10);
       volt[3] = look((v/100)%10);
       Lcd_Out(1,1,"Voltage = ");
       Lcd_Out(1,11,volt);
       Lcd_Out(1,16,"V");
    
       current[0] = look(i/1000);
       current[2] = look((i/100)%10);
       current[3] = look((i/10)%10);
       Lcd_Out(2,1,"Current = ");
       Lcd_Out(2,11,current);
       Lcd_Out(2,16,"A");
       Delay_ms(250);
       if(INTCON.TMR0IF == 0)break;
      }
    }
    Dernière modification par Antoane ; 07/02/2018 à 14h30. Motif: Ajout balises [code]

  3. #3
    invite5a48ffd1

    Re : Microcontroleur

    Bonjour,

    un while(1) dans la boucle d'interruption? Non jamais.

  4. #4
    invitee941d999

    Re : Microcontroleur

    Propose une autre façon de faire merci d'avance...

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

    Re : Microcontroleur

    Plusieurs remarques dans votre code:

    1/aucun commentaire
    Il faut apprendre à commenter un code avec de préférence en tête de fonction un descriptif sommaire du rôle et de l'identification des variables utilisées, argument d'entrée, valeur retournée, etc.
    2/Pour une meilleure lisibilité on préfère généralement placer en tête de programme la routine d'interruption puis le main() et les fonctions.
    3/La routine d'interruption doit contenir un minimum de chose et surtout pas de traitement trop long, sans quoi des événements seront manqués.

  7. #6
    invite5a48ffd1

    Re : Microcontroleur

    Citation Envoyé par KABEYA Voir le message
    Propose une autre façon de faire merci d'avance...
    Vous retirez le while(1) tout simplement, il ne sert à rien.

  8. #7
    invitee941d999

    Re : Microcontroleur

    Bien merci je vais suivre les remarques. Toutefois quand j'écris une partie du code dans le main
    cette partie n'arrive pas à s'executer normalement. D'ou provient cette anomalie?
    Merci de m'aider

  9. #8
    invite5a48ffd1

    Re : Microcontroleur

    Quelle partie?
    Un exemple?

  10. #9
    invitee941d999

    Re : Microcontroleur

    Cette partie du code n'arrive pas à etre exécutée
    Code:
    ... while(1)
      {
      ADCON1 = 0x00;
       v = ADC_Read(2);
       i = ADC_Read(3);
       i = (i*4.89)/0.47;
       v = ((v*4.89)/20)*120;
       volt[0] = look(v/10000);
       volt[1] = look((v/1000)%10);
       volt[3] = look((v/100)%10);
       Lcd_Out(1,1,"Voltage = ");
       Lcd_Out(1,11,volt);
       Lcd_Out(1,16,"V");
    
       current[0] = look(i/1000);
       current[2] = look((i/100)%10);
       current[3] = look((i/10)%10);
       Lcd_Out(2,1,"Current = ");
       Lcd_Out(2,11,current);
       Lcd_Out(2,16,"A");
       Delay_ms(250);
       if(INTCON.TMR0IF == 0)break;
      }...
    Je vous fais rapidement un video demo...
    Merci pour l'aide...
    Dernière modification par gienas ; 08/02/2018 à 07h10. Motif: Ajouté les balises code obligatoires sur les programmes

  11. #10
    invite5a48ffd1

    Re : Microcontroleur

    Quel µC utilisez vous et avec quel quartz?

  12. #11
    invite5a48ffd1

    Re : Microcontroleur

    Vous avez déclaré v et i en int, or vous faites des calculs sur des flottants... ça ne peut pas fonctionner
    Code:
    unsigned int v,i;
    .....
    
    v = ADC_Read(2);
    i = ADC_Read(3);
    i = (i*4.89)/0.47;
    v = ((v*4.89)/20)*120;
    Il faudrait écrire:
    Code:
    float v, i;
    ....
    v = ADC_Read(2);
    i = ADC_Read(3);
    i = (i*4.89)/0.47;
    v = ((v*4.89)/20)*120;
    On doit pouvoir se passer des floats mais encore faut-il savoir d'où sortent 4.89, 0.47 et le reste (20, 120)

  13. #12
    invite5a48ffd1

    Re : Microcontroleur

    Egalement:
    Code:
    char look(int a)
    la fonction look reçoit un argument de type int et retourne un char.

    Mais vous l'utilisez ainsi:
    Code:
    volt[0] = look(v/10000);
    Ca ne peut rien donner de bon, votre argument est un flottant.
    Il faut reprendre toutes vos variables et vérifier de quoi vous avez réellement besoin.
    En général on essaye d'éviter les flottants tant que faire se peut.

  14. #13
    invitee941d999

    Re : Microcontroleur

    je veux essayer et je reviens bientot...
    Merci

  15. #14
    invite5a48ffd1

    Re : Microcontroleur

    Pensez à me donner votre ref de µC et la valeur du quartz si vous voulez que je vous aide.

  16. #15
    invitee941d999

    Re : Microcontroleur

    J'utilise le PIC 16F877A et le quart que j'utilise est de 8MHz
    Je veux aussi refaire me calcul et je vous tiens au courant.
    je n'arrive pas à vous joindre la video que je viens de faire pour plus de compréhension
    ça refuse d'etre joint, comment faire

  17. #16
    invite5a48ffd1

    Re : Microcontroleur

    Vous donnez le lien vers votre chaine youtube si vous en avez une.
    Sinon vous la créez c'est très simple.

  18. #17
    invite5a48ffd1

    Re : Microcontroleur

    Quelques questions supplémentaires:

    dans votre code vous avez mis:
    Code:
     i = (i*4.89)/0.47;
       v = ((v*4.89)/20)*120;
       if(v!=vp || i!=ip )
       Lcd_Cmd(_LCD_CLEAR);
       vp = v;
       ip = i;
    qu'est-ce que sont vp et ip, sachant que ces variables n'ont pas été déclarées?
    Et qu'avez-vous mis sur RB7?

  19. #18
    invitee941d999

    Re : Microcontroleur

    Salut je suis de retour
    Grand merci pour les orientations, le problème est déjà réglé
    j ai suivi les remarques et tout marche maintenant.
    Toutefois je suis entrain d essayer une autre approche de faire mon convertisseur sinus pur avec microcontroleur
    en utilisant le signal SPWM. Pour ce fait j ai déjà réussi a avoir les signaux de commande
    mais le problème réside au niveau du filtre que j utise il me semble. Voici ci dessous les images de ma simulation et
    l erreur et que quand j ajoute le filtre mon simulateur me charge le résultat partiel alors je n arrive pas a remédier au problème
    j ai besoin d aide svp
    N.B la première piece jointe est le graphique de la sortie transformateur avant filtre et
    le second charge la simulation partielle quand j ajoute le filtre
    Images attachées Images attachées
    Dernière modification par Antoane ; 13/02/2018 à 09h20. Motif: Conversion pdf -> png

  20. #19
    invite5a48ffd1

    Re : Microcontroleur

    Quel filtre?

  21. #20
    invitee941d999

    Re : Microcontroleur

    merci antoane
    voici donc les images de ma simulations en jpg
    le graphique du signal, sortie transformateur sans filtre
    Images attachées Images attachées  

  22. #21
    invite5a48ffd1

    Re : Microcontroleur

    Ce n'est pas le meilleur moyen de pratiquer ainsi.
    La charge inductive du primaire va fortement altérer le signal produit (on le voit sur votre simu) et filtrer de ce coté va être très coûteux au niveau du filtre.
    Ce type de modulation doit se faire de préférence au secondaire dans le pont en H reproduisant le sinus par découpage de la tension redressée et filtrer issue du découpage primaire.
    Au primaire vous faites un push-pull qui attaque un transfo ferrite en PWM (par exemple à 100kHz), puis vous obtenez avec la régulation en sortie environ 325VDC (donc au secondaire après redressement et filtrage).
    Ensuite vous pilotez votre pont en H avec votre commande ci-dessus, et vous filtrez par une (des) cellule(s) passe bas (RC) pour obtenir votre signal 230VAC sinus.

  23. #22
    invitee941d999

    Re : Microcontroleur - convertisseur pur sinus

    Donc si je comprend bien il me faut utiliser un autre filtre au lieu de LC, par exemple le filtre RC

  24. #23
    invite5a48ffd1

    Re : Microcontroleur - convertisseur pur sinus

    Non, il vous faut un filtre du second ordre donc LC mais après le pont en H coté secondaire.
    Pour le moment retirez votre transformateur et mettez une simple résistance à la place, ça vous permettra de voir si la modulation du signal est correcte.
    Ensuite je vous ai indiqué une marche à suivre, il y en a d'autres.
    Quelle puissance souhaitez vous obtenir?

  25. #24
    invitee941d999

    Re : Microcontroleur - convertisseur pur sinus

    Je viens d enlever mon transformateur dans la simulation puis j applique votre remarque,
    voici ci dessous le graphique que j obtiens. j observe que le signal n ai pas stable
    et aussi ce n est pas un vrai sinus je pense je suis presque au but. Toutefois les valeurs de l inductance et de la résistance que j utilise
    peut être, elles posent problème. j utilise L=1H et C = 10u pour avoir ce graphique
    Images attachées Images attachées  

  26. #25
    invitee941d999

    Re : Microcontroleur - convertisseur pur sinus

    Que faire pour améliorer la forme de ce signal dont je fais référence précédemment (Graphique2)

  27. #26
    invite5a48ffd1

    Re : Microcontroleur - convertisseur pur sinus

    Si vous pouviez dans vos réponses systématiquement insérer votre schéma de simulation on gagnera du temps.
    Où avez vous bien pu mettre ce LC....? Et pourquoi ce choix de 1H et de 10µF?

  28. #27
    invite5a48ffd1

    Re : Microcontroleur - convertisseur pur sinus

    De plus le signal n'est pas stable compte tenu de l'initialisation nécessaire à partir de t=0, après quelques cycles votre signal sera stable.

  29. #28
    invitee941d999

    Re : Microcontroleur - convertisseur pur sinus

    Salut et grand merci a vous chtulhu
    voici ci-joint le schema comme vous me l aviez demander afin de vous faciliter
    et la visualisation des signaux de commande que je genere a partir de mon microcontroleur
    merci de bien vouloir m aider
    Images attachées Images attachées

  30. #29
    invitee941d999

    Re : Microcontroleur - convertisseur pur sinus

    salut j attend toujours votre point de vue par rapport a ma requete
    aide moi svp

  31. #30
    invite5a48ffd1

    Re : Microcontroleur - convertisseur pur sinus

    Relisez mon post #21.
    Tel que fait dans votre schéma ça ne peut pas fonctionner.

    Il faut mettre une tension de 325VDC pour alimenter votre pont, produire un signal 50Hz et moduler votre MLI à au moins 25kHz.
    Voir le schéma corrigé ci-dessous à soumettre à votre simulateur:

    Filtre_sinus.PNG
    Images attachées Images attachées  

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. [Analogique] Convertisseur à sinus pur
    Par invitee941d999 dans le forum Électronique
    Réponses: 14
    Dernier message: 29/11/2017, 16h44
  2. [Energie] Projet convertisseur pur sinus
    Par MacOlivier34 dans le forum Électronique
    Réponses: 32
    Dernier message: 02/10/2017, 19h07
  3. Probleme convertisseur 12 dc/ac 220 pur sinus power inverter
    Par invite56434bfe dans le forum Électronique
    Réponses: 13
    Dernier message: 06/12/2014, 10h16
  4. Convertisseur pur sinus et demarrage moteur
    Par lourson dans le forum Électronique
    Réponses: 0
    Dernier message: 18/07/2010, 20h46
  5. Convertisseur DC/AC sinus
    Par invite8a18d06a dans le forum Électronique
    Réponses: 10
    Dernier message: 17/04/2007, 20h22
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...