Bonjour, cliquez-ici pour vous inscrire et participer au forum.
  • Login:



+ Répondre à la discussion
Page 1 sur 3 12 DernièreDernière
Affichage des résultats 1 à 15 sur 35

Microcontroleur - convertisseur pur sinus

  1. KABEYA

    Date d'inscription
    novembre 2017
    Âge
    24
    Messages
    22

    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...

    -----

     


    • Publicité



  2. KABEYA

    Date d'inscription
    novembre 2017
    Âge
    24
    Messages
    22

    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 à 15h30. Motif: Ajout balises [code]
     

  3. Chtulhu

    Date d'inscription
    novembre 2017
    Messages
    741

    Re : Microcontroleur

    Bonjour,

    un while(1) dans la boucle d'interruption? Non jamais.
    C'est parce que nous n'osons pas suffisamment que les choses apparaissent difficiles.
     

  4. KABEYA

    Date d'inscription
    novembre 2017
    Âge
    24
    Messages
    22

    Re : Microcontroleur

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

  5. Chtulhu

    Date d'inscription
    novembre 2017
    Messages
    741

    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.
    C'est parce que nous n'osons pas suffisamment que les choses apparaissent difficiles.
     


    • Publicité



  6. Chtulhu

    Date d'inscription
    novembre 2017
    Messages
    741

    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.
    C'est parce que nous n'osons pas suffisamment que les choses apparaissent difficiles.
     

  7. KABEYA

    Date d'inscription
    novembre 2017
    Âge
    24
    Messages
    22

    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
     

  8. Chtulhu

    Date d'inscription
    novembre 2017
    Messages
    741

    Re : Microcontroleur

    Quelle partie?
    Un exemple?
    C'est parce que nous n'osons pas suffisamment que les choses apparaissent difficiles.
     

  9. KABEYA

    Date d'inscription
    novembre 2017
    Âge
    24
    Messages
    22

    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 à 08h10. Motif: Ajouté les balises code obligatoires sur les programmes
     

  10. Chtulhu

    Date d'inscription
    novembre 2017
    Messages
    741

    Re : Microcontroleur

    Quel µC utilisez vous et avec quel quartz?
    C'est parce que nous n'osons pas suffisamment que les choses apparaissent difficiles.
     

  11. Chtulhu

    Date d'inscription
    novembre 2017
    Messages
    741

    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)
    C'est parce que nous n'osons pas suffisamment que les choses apparaissent difficiles.
     

  12. Chtulhu

    Date d'inscription
    novembre 2017
    Messages
    741

    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.
    C'est parce que nous n'osons pas suffisamment que les choses apparaissent difficiles.
     

  13. KABEYA

    Date d'inscription
    novembre 2017
    Âge
    24
    Messages
    22

    Re : Microcontroleur

    je veux essayer et je reviens bientot...
    Merci
     

  14. Chtulhu

    Date d'inscription
    novembre 2017
    Messages
    741

    Re : Microcontroleur

    Pensez à me donner votre ref de µC et la valeur du quartz si vous voulez que je vous aide.
    C'est parce que nous n'osons pas suffisamment que les choses apparaissent difficiles.
     

  15. KABEYA

    Date d'inscription
    novembre 2017
    Âge
    24
    Messages
    22

    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
     


    • Publicité







Sur le même thème :





 

Discussions similaires

  1. [Analogique] Convertisseur à sinus pur
    Par KABEYA dans le forum Électronique
    Réponses: 14
    Dernier message: 29/11/2017, 17h44
  2. [Energie] Projet convertisseur pur sinus
    Par MacOlivier34 dans le forum Électronique
    Réponses: 32
    Dernier message: 02/10/2017, 20h07
  3. Probleme convertisseur 12 dc/ac 220 pur sinus power inverter
    Par GollumSaysay dans le forum Électronique
    Réponses: 13
    Dernier message: 06/12/2014, 11h16
  4. Convertisseur pur sinus et demarrage moteur
    Par lourson dans le forum Électronique
    Réponses: 0
    Dernier message: 18/07/2010, 21h46
  5. Convertisseur DC/AC sinus
    Par Tita3132 dans le forum Électronique
    Réponses: 10
    Dernier message: 17/04/2007, 21h22