Répondre à la discussion
Affichage des résultats 1 à 20 sur 20

MLI sinus triangle avec dspi33ep



  1. #1
    marc64ab

    MLI sinus triangle avec dspi33ep

    Bonjour à tous,

    J'utilise un dspic33EP512GM710 pour commander un onduleur triphasé et je souhaiterais faire une MLI sinus-triangle afin d'avoir la fréquence du fondamentale et les fréquences de découpage.

    Je voulais savoir par quels moyens cela est faisable ? J'arrive juste à avoir une MLI à la fréquence de découpage par exemple 10kHz. Faut-il d'abord réaliser du code pour avoir une sorte de sinus et la comparer avec un triangle ou avec les registres cela est faisable ?

    Cordialement
    Marc

    -----


  2. Publicité
  3. #2
    marc64ab

    Re : MLI sinus triangle avec dspi33ep

    --- up ---

    Je pense qu'il faut créer une fonction sinus et faire varier le registre PDC qui est le rapport cyclique mais je ne sais pas trop comment faire. Si quelqu'un a un exemple de code cela serait le bienvenue. Merci

    Cordialement
    Marc

  4. #3
    marc64ab

    Re : MLI sinus triangle avec dspi33ep

    bonjour,

    en gros je veux un rapport cyclique variable mais en ayant une fréquence fondamentale à par exemple 400Hz

    Merci
    Marc

  5. #4
    RISC

    Re : MLI sinus triangle avec dspi33ep

    Salut,

    Pour piloter en sinusoidal il faut creer une table en flash qui reflete ta sinusoide et tu envoie cette valeur regulièrement dans le registre de duty cycle.
    Il existe plusieurs note d'applications :

    1/ CE003 pour dsPIC30F
    2/ AN1017 : Sinusoidal Control of PMSM Motors with dsPIC30F / dsPIC33F/ dsPIC33E DSC

    a+
    Ma marotte ? les microcontrôleurs ;=)

  6. #5
    marc64ab

    Re : MLI sinus triangle avec dspi33ep

    Bonjour

    Merci pour ta réponse et tes exemples intéressants.

    J'ai essayé de faire ceci (voir programme). Je fais mon sinus à chaque interruption du timer et j'actualise mon rapport cyclique.

    J'obtiens bien un rapport cyclique variable mais il reste à 100% pendant un certain temps puis redevient variable.

    Code:
    void Init_Timer2( void )    // Initialize Timer2
    
    {
        T2CONbits.TON = 0;      // Disable Timer
        T2CONbits.T32 = 0;      // Timer 16 bits
        T2CONbits.TCS = 0;      // Select internal instruction cycle clock (Fosc/2)
        T2CONbits.TGATE = 0;    // Disable Gated Timer mode
        T2CONbits.TCKPS = 0b00; // Select 1:1 Prescaler (40MHz--->25ns)
    
    
        IFS0bits.T2IF = 0;      // Reset Timer2 interrupt flag
        IPC1bits.T2IP = 6;      // Timer1 Interrupt priority level=4
        IEC0bits.T2IE = 1;      // Enable Timer2 interrupt
    
        TMR2= 0;                // Clear timer register
        PR2 = 4000  ;           // Load the period value (2.5ns/100us=0.25ms --> 4000)
    
        T2CONbits.TON = 1;      // Enable Timer2 and start the counter
    }
    
     void __attribute__((interrupt,no_auto_psv)) _T2Interrupt( void )
     {
     	IFS0bits.T2IF = 0; 		// remise à zéro du flag d'interruption
    
     	// prend l'état inverse de l'état précédent
     	LATGbits.LATG11 = ~LATGbits.LATG11;
            
      t+=0.0001;
    
      m1 = sin(2*3.14*50*t);
      PDC1 = (80000000/20000)*m1;
    
        
     	TMR2 = 0;
     	T2CONbits.TON = 1;		// activer à nouveau le Timer
    
     }

  7. A voir en vidéo sur Futura
  8. #6
    marc64ab

    Re : MLI sinus triangle avec dspi33ep

    La formule de m1 n'est pas celle là

    m1= 0.5 + 0.5*sin(2*3.14*50*t)

    Désolé
    Merci
    Marc

  9. Publicité
  10. #7
    RISC

    Re : MLI sinus triangle avec dspi33ep

    Salut,

    Il faut pré-calculer les valeurs des sinus sinon tu vas assommer le dsPIC en faisant des culculs en virgule flottante et ton moteur ne pourra tourner qu'à une très faible vitesse...

    a+
    Dernière modification par RISC ; 14/06/2015 à 22h47.
    Ma marotte ? les microcontrôleurs ;=)

  11. #8
    marc64ab

    Re : MLI sinus triangle avec dspi33ep

    Bonjour,

    Un dspic contient un petit dsp non ? du coup il n'est pas capable de faire ce genre de calcul ? J'ai mis le programme et il fonctionne mais effectivement le dspic chauffe un peu

  12. #9
    RISC

    Re : MLI sinus triangle avec dspi33ep

    Salut,

    Oui, un dsPIC33 (16 bits) comme d'ailleurs les PIC16 sont tous capables de faire des operations en virugle flottante MAIS...n'oublie pas qu'ils fonctionnent de 5 à 70 MIPS.
    Par comparaison ton micro intel fonctionne à 3000MIPS et en plus il a une unité dédiée pour faire les calculs en virgule flottante.
    Il faut que tu comprennes qu'une opération en virgule flottante peut demander 100us voire plus (à mesurer exactement), donc si tu en fais plusieurs cela pourrait durer des dizaines de ms et le temps de calcul de ta régulation pourrait être trop long (tout dépend de ta boucle régulation...
    Un dsPIC33 ne nécessite pas de radiateur...il est IMPOSSIBLE de détecter à la main si la charge CPU est faible ou forte.
    Dans l'embarqué les radiateurs n'existent pas et la plupart des microcontroleurs peuvent fonctionner jusqu'à 85 voir 125 ou même 150C !

    Réfléchis bien..si ta fréquence de hachage est de 10kHz il faut faire ta régulation complète et l'action en moins de 100us...
    La bonne méthode est celle que j'ai déà indiquée : faire une table de lookup correspondant à un sinus et aller piocher avec en index le No de l'échantillon en fonction de l'angle.
    Exemple une table de 360 valeurs te donne une résolution de 1degré. tu calcule le sinus de 1 degre, de 2...jusqu'à 359 et tu mets ces valeurs (en entier) dans des signed int (16bits) ou tu les mets directement en forme de PWM (%)
    Il existe des notes d'applications qui explique cela...

    Autre chose, si tu ne connais les compilateurs ANSI-C il faut savoir que la compatiblité aNSI oblige le compilateur a ne PAS générer du code qui mets en jeu les instructions DSP car cette unité est spécifique au dsPIC et le code généré ne serait pas portable.
    Il faut donc pour certain types de fonctions (pas les opérations flottantes mais les FFT, FIR, IIR,..) utiliser les librairies spécifiques fournies par le constructeur du compilateur.
    si tu lis la documentation du compilateur XC16, tu trouveras ces fonctions dénommées __builtin_xxxxxxxx

    a+
    Dernière modification par RISC ; 15/06/2015 à 22h24.
    Ma marotte ? les microcontrôleurs ;=)

  13. #10
    marc64ab

    Re : MLI sinus triangle avec dspi33ep

    Bonjour,

    Merci pour tes conseils, je vais essayer de faire cela. Les notes d'applications sont sur le site microchip ?

    Cdlmt
    Marc

  14. #11
    marc64ab

    Re : MLI sinus triangle avec dspi33ep

    En fait pour mon application, pour l'instant je n'ai pas besoin de faire de la régulation, je reste en boucle ouverte. Je dois surement juste faire mon sinus qui sera ma référence et la comparer soit avec un triangle ou en utilisant les registres du module PWM high speed.

    C'est pour remettre le contexte

    Marc

  15. #12
    marc64ab

    Re : MLI sinus triangle avec dspi33ep

    Bonjour,

    Je n'ai pas encore trouvé de solutions. J'ai réalisé ce programme et j'ai bien la fréquence de découpage mais je ne retrouve pas la fréquence du fondamentale. Si vous pouvez y jeter un oeil.
    J'ai mis le timer à 10kHz. Fosc est à 140MHz. Fpwm à 10kHz. Fréquence fondamentale à 1Hz

    Merci
    Marc
    Code:
    #include <p33EP512GM710.h>
    #include <math.h>
    
    _FOSCSEL( FNOSC_PRI );                              // Select Primary Oscillator (Posc) at POR (Power-on Reset)
    _FOSC( POSCMD_XT & OSCIOFNC_OFF & FCKSM_CSECMD );   // Configure Posc in HS mode, Enable clock switching
    _FWDT( WDTPOST_PS32768 & FWDTEN_OFF );
    _FICD( JTAGEN_OFF );
    
    //--- prototype de fonction ---//
    
    void Init_Osci(void);
    void Init_Timer2(void);
    void Init_PWM(void);
    void Init_Port(void);
    float m1,m2,m3;                   // m sinus modulante
    float M=0;                        // Amplitude modulante
    unsigned int f=0;                          // Fréquence de la modulante
    double a=0;                       // Calcul pour 2*pi*f
    double t=0;
    float b=0;
    float dephasage=0;                // Déphasage du sinus
    long FMLI=0;                      // Fréquence MLI
    long c=0;                         // Variable pour le calcul de PDC c= Fosc/Fmli
    int flagpwm=0;
    int main(void)
    {
    
        RCONbits.SWDTEN=0;           // Disable Watch Dog Timer
    
        Init_Port();
        Init_Osci();                // Oscilator initialisation
        Init_Timer2();              // Timer2 initialisation
        Init_PWM();                 // PWM initialisation
        M=0.6;
        f=1000;
        FMLI=10000;
        b=0.5*M;
        a=2*3.141592*f;
        c=140000000/FMLI;
        dephasage=(2*3.141592)/3;
        PTCONbits.PTEN = 1;
    
    	while(1)
            {
    
                if(flagpwm=1)
                {
                    t=t+0.0001;     // Période du timer 
                    if(t>0.001)     // Période du sinus
                      {
                            t=0;
                      }
                    m1 = 0.5+(b*sin(a*t));
                    PDC1 = c*m1;
                    m2 = 0.5+(b*sin((a*t)-(dephasage)));
                    PDC2 = c*m2;
                    m3 = 0.5+(b*sin((a*t)+(dephasage)));
                    PDC4 = c*m3;
                    flagpwm=0;
                }
    
    
               /* if (PORTCbits.RC6==1)
                {
                    LATFbits.LATF7 = 1;
                    PTCONbits.PTEN = 0;         // disable PWM Module
                }
                if (PORTCbits.RC7==1)
                {
                    LATFbits.LATF7 = 1;
                    PTCONbits.PTEN = 0;         // disable PWM Module
                }
                if (PORTCbits.RC9==1)
                {
                    LATFbits.LATF7 = 1;
                    PTCONbits.PTEN = 0;         // disable PWM Module
                }*/
    
            }
    }
    
    /*---------------------------------------------------------------------
      Function Name: Init_Osci
      Description:   Initialize oscillator
      Inputs:        None
      Returns:       None
    -----------------------------------------------------------------------*/
    void Init_Osci( void )    // Fonction pour initialiser l'oscillateur
    
    {
        // Configure Oscillator to operate the device at 40Mhz
        // Fosc= Fin*M/(N1*N2), Fcy=Fosc/2
        // Fosc= 40M*49/(2*7)=140Mhz for 40M input clock
    
        // Configure PLL prescaler, PLL postscaler, PLL divisor
        CLKDIV = 0x05; 			// N2 = 7 N1=2
        PLLFBD = 0xF3;			// M = 245
    
        //  Clock switching to incorporate PLL (NOSC=0b011)
        __builtin_write_OSCCONH(0x03); 		// Initiate Clock Switch to Primary Oscillator with PLL (NOSC=0b011)										// configuration du registre NOSC (OSCCON) -->
        __builtin_write_OSCCONL(0x01);		// Start clock switching
    
        // Wait for Clock switch to occur
        while(OSCCONbits.COSC != 0b011);
    
        // Wait for PLL to lock
        while(OSCCONbits.LOCK != 1);
    }
    
    
    /*---------------------------------------------------------------------
      Function Name: Init_Port
      Description:   Initialize I/O
      Inputs:        None
      Returns:       None
    -----------------------------------------------------------------------*/
    void Init_Port( void )      // Fonction pour initialiser les I/O
    
    {
        TRISG = 0x0000;         // Port B is an output
        ANSELG = 0;        // Enables digital port pin
    
        TRISF = 0x0000;         // Port F is an output
        ANSELF = 0;        // Enables digital port pin
    
        TRISA = 0x0000;         // Port A is an output
        ANSELA = 0;        // Enables digital port pin
        ODCAbits.ODCA10=1;
        ODCAbits.ODCA7=1;
    
        TRISB = 0x0000;         // Port B is an output
        ANSELB = 0;        // Enables digital port pin
        
       ODCBbits.ODCB14=1;
       ODCBbits.ODCB15=1;
       ODCBbits.ODCB13=1;
       ODCBbits.ODCB12=1;
        
    
    
    
        TRISD = 0x0000;         // Port D is an output
        ANSELD = 0;        // Enables digital port pin
    
        TRISC = 1;         // Port C is an input
        ANSELC = 0;        // Enables digital port pin
        PORTC = 0;
    }
    
    
    /*---------------------------------------------------------------------
      Function Name: Init_Timer2
      Description:   Initialize Timer2 10kHz ---> 100us
      Inputs:        None
      Returns:       None
    -----------------------------------------------------------------------*/
    void Init_Timer2( void )    // Initialize Timer2
    
    {
        T2CONbits.TON = 0;      // Disable Timer
        T2CONbits.T32 = 0;      // Timer 16 bits
        T2CONbits.TCS = 0;      // Select internal instruction cycle clock (Fosc/2)
        T2CONbits.TGATE = 0;    // Disable Gated Timer mode
        T2CONbits.TCKPS = 0;    // Select 1:1 Prescaler (70MHz--->14285ps)
    
    
        IFS0bits.T2IF = 0;      // Reset Timer2 interrupt flag
        IPC1bits.T2IP = 2;      // Timer1 Interrupt priority level=4
        IEC0bits.T2IE = 1;      // Enable Timer2 interrupt
    
        TMR2= 0;                // Clear timer register
        PR2 = 6960;             // Load the period value (100us/14285ps=7000)   6960 pour l'ajustement
    
        T2CONbits.TON = 1;      // Enable Timer2 and start the counter
    }
    
    /*---------------------------------------------------------------------
      Function Name: Init_PWM
      Description:   Initialize PWM
      Inputs:        None
      Returns:       None
    -----------------------------------------------------------------------*/
    void Init_PWM(void)             // Initialize PWM
    
    {
        PTCON2bits.PCLKDIV = 0;     // 1:1 PWM prescaler
        PWMCON1bits.ITB = 0;        // PTPER provides the PWM time period value
        PWMCON2bits.ITB = 0;
        PWMCON4bits.ITB = 0;
    
        PTPER = 14000;               // Set PWM Period on Primary Time Base PTPER=Fosc/(Fpwm*PWMprescaler)=140MHz/(10kHz*1)
    
        PWMCON1bits.MDCS = 0;       // PDCx provides duty cycle value
        PWMCON2bits.MDCS = 0;
        PWMCON4bits.MDCS = 0;
    
        PDC1 = 7000;                // Independent Primary Duty Cycle is 50% of the period PDCx=(Fosc/(Fpwm*PWMprescaler))*DesiredDuty Cycle=(140MHz/(10kHz*1))*0.5=7000
        PDC2 = 7000;
        PDC4 = 7000;
    
        PHASE1 = 0;                 // Primary phase shift value  PTPER*value phase/360
        PHASE2 = 0;          // 333.333
        PHASE4 = 0;          // 666.666
    
        DTR1 = 0;                   // Set Dead Time Values  Fosc*(Desired dead time/PWMprescaler)= 80MHz*(1us/2)
        ALTDTR1 = 0;
        DTR2 = 0;                   // Set Dead Time Values  Fosc*(Desired dead time/PWMprescaler)
        ALTDTR2 = 0;
        DTR4 = 0;                   // Set Dead Time Values  Fosc*(Desired dead time/PWMprescaler)
        ALTDTR4 = 0;
    
        IOCON1bits.PENH = 1;        // PWM module controls PWM1H pin
        IOCON1bits.PENL = 1;        // PWM module controls PWM1L pin
        IOCON1bits.PMOD = 0;        // Set PWM Mode to Complementary
        IOCON2bits.PENH = 1;        // PWM module controls PWM1H pin
        IOCON2bits.PENL = 1;        // PWM module controls PWM1L pin
        IOCON2bits.PMOD = 0;        // Set PWM Mode to Complementary
        IOCON4bits.PENH = 1;        // PWM module controls PWM1H pin
        IOCON4bits.PENL = 1;        // PWM module controls PWM1L pin
        IOCON4bits.PMOD = 0;        // Set PWM Mode to Complementary
    
        PWMCON1 = 0x0000;           // Set Primary Time Base, Edge-Aligned Mode and Independent Duty Cycles
        PWMCON2 = 0x0000;
        PWMCON4 = 0x0000;
        FCLCON1 = 0x0003;           // Configure Faults
        FCLCON2 = 0x0003;
        FCLCON4 = 0x0003;
        _PWM1IP=6;
        
        PWMCON1bits.IUE = 1;        // PDCx immediate update
        PWMCON2bits.IUE = 1;
        PWMCON4bits.IUE = 1;
        
    
        PTCONbits.PTEN = 1;         // Enable PWM Module
        LATGbits.LATG10 = 1;
       // LATGbits.LATG3 = 1;
    }
    
    /*---------------------------------------------------------------------
      Function Name: _T2Interrupt
      Description:   interruption lié au timer, doit faire clignoter une led
                     chaque fois qu'on arrive dans cette boucle
      Inputs:        None
      Returns:       None
    -----------------------------------------------------------------------*/
     void __attribute__((interrupt,no_auto_psv)) _T2Interrupt( void )
     {
        IFS0bits.T2IF = 0; 		// remise à zéro du flag d'interruption
    
        // prend l'état inverse de l'état précédent
       LATGbits.LATG11 = ~LATGbits.LATG11;
    
    
       flagpwm=1;
    
      
       TMR2 = 0;
       T2CONbits.TON = 1;		// activer à nouveau le Timer
    
     }
    Dernière modification par marc64ab ; 17/06/2015 à 15h37.

  16. Publicité
  17. #13
    marc64ab

    Re : MLI sinus triangle avec dspi33ep

    bonjour

    petit up

    Pour vérifier ma fréquence du sinus j'ai fait ce petit programme. Ma fréquence n'est pas bonne pour 1Hz j'ai 1.63Hz pour 400Hz j'ai 675Hz pour 1kHz j'ai 1,6kHz.
    Je ne voit pas bien d'où l'erreur peut venir. Voici mon main. J'ai juste changer le type pour certain variable que j'ai mis en double au lieu de float. Le reste du programme est le même que au dessus. Timer à 10kHz et le flagpwm est mis à 1 à chaque interruption du timer.

    Merci encore pour vos aides
    Marc
    Code:
    #include <p33EP512GM710.h>
    #include <math.h>
    
    _FOSCSEL( FNOSC_PRI );                              // Select Primary Oscillator (Posc) at POR (Power-on Reset)
    _FOSC( POSCMD_XT & OSCIOFNC_OFF & FCKSM_CSECMD );   // Configure Posc in HS mode, Enable clock switching
    _FWDT( WDTPOST_PS32768 & FWDTEN_OFF );
    _FICD( JTAGEN_OFF );
    
    //--- prototype de fonction ---//
    
    void Init_Osci(void);
    void Init_Timer2(void);
    void Init_PWM(void);
    void Init_Port(void);
    double m1,m2,m3;                   // m sinus modulante
    float M=0;                        // Amplitude modulante
    double f=0;                          // Fréquence de la modulante
    double a=0;                       // Calcul pour 2*pi*f
    double t=0;
    float b=0;
    float dephasage=0;                // Déphasage du sinus
    long FMLI=0;                      // Fréquence MLI
    long c=0;                         // Variable pour le calcul de PDC c= Fosc/Fmli
    int flagpwm=0;
    int main(void)
    {
    
        RCONbits.SWDTEN=0;           // Disable Watch Dog Timer
    
        Init_Port();
        Init_Osci();                // Oscilator initialisation
        Init_Timer2();              // Timer2 initialisation
        Init_PWM();                 // PWM initialisation
        M=0.6;
        f=1;
        FMLI=10000;
        b=0.5*M;
        a=2*3.141592*f;
        c=140000000/FMLI;
        dephasage=(2*3.141592)/3;
        PTCONbits.PTEN = 1;
    
    	while(1)
            {
    
                if(flagpwm=1)
                {
                  
                    if(t>10000)
                      {
                            t=0;
                      }
                   // m1 = 0.5+(b*sin(a*t));
                    m1 = sin(a*t);
                    if (m1<0)
                    {
                     LATBbits.LATB1 = 1;
                    }
                    else if (m1>0)
                    {
                    LATBbits.LATB1 = 0;
                    }
                     t=t+0.0001;
                    //PDC1 = c*m1;
                    //m2 = 0.5+(b*sin((a*t)-(dephasage)));
                    //PDC2 = c*m2;
                    //m3 = 0.5+(b*sin((a*t)+(dephasage)));
                    //PDC4 = c*m3;
                    flagpwm=0;
                }
         }

  18. #14
    marc64ab

    Re : MLI sinus triangle avec dspi33ep

    bonjour

    J'ai aussi testé un autre programme qui calcul le sinus avant la boucle while. Avec le débegueur les valeurs du sinus dans le tableau sont bonnes mais au niveau de la sortie je n'ai pas la bonne fréquence, pour 1 Hz j'ai à peu près 200 Hz. Je vous mets ce code en espérant que cela ne vous perturbe pas avec les précédent. C'est juste le main qui change.
    Code:
    //--- prototype de fonction ---//
    
    void Init_Osci(void);
    void Init_Timer2(void);
    // Init_PWM(void);
    void Init_Port(void);
    double m1,m2,m3;                   // m sinus modulante
    float M=0;                        // Amplitude modulante
    double f=0;                          // Fréquence de la modulante
    double a=0;                       // Calcul pour 2*pi*f
    double t=0;
    float b=0;
    float dephasage=0;                // Déphasage du sinus
    long FMLI=0;                      // Fréquence MLI
    long c=0;                         // Variable pour le calcul de PDC c= Fosc/Fmli
    bool flagpwm=0;
    double LUT[100];
    int i=0;
    int y=0,j=0;
    double theta=0;
    double pi=3.141592;
    double tps=0;
    
    int main(void)
    {
    
        RCONbits.SWDTEN=0;           // Disable Watch Dog Timer
    
        Init_Port();
        Init_Osci();                // Oscilator initialisation
        Init_Timer2();              // Timer2 initialisation
        //Init_PWM();                 // PWM initialisation
        M=0.6;
        f=1.0;
        FMLI=10000;
        b=0.5*M;
        a=2*pi*f;
        c=140000000/FMLI;
        dephasage=(2*pi)/3;
        //PTCONbits.PTEN = 1;
    
        for(i=0;i<100;i++)                  // calcul du sinus dans un tableau de 100 valeurs
        {   
            LUT[i]= sin(2.0*pi*f*tps);
            tps=tps+0.01;                   // variable de temps pour atteindre 1s par période 0.01s*100 valeurs=1s 
        }
    
    	while(1)
            {
    
                if(flagpwm=1)               // flag de l'interruption du timer
                {
                   j++;                     
                   if(j>=100)              // on attend que j=100 pour prendre la valeur du tableau car nous avons un valeur tous les 0.01s 
                   {
                    m1=LUT[y];             // m1 par la valeur de la ligne y du tableau
                    
                    if (m1>0)              // si le sinus est >0 la sortie est mis à 1
                    {
                     _LATG2 = 1;
                    }
                    else                    // si <0 sortie à 0
                    {
                    _LATG2 = 0;
                    }
                    y++;                    // on incrémente y pour aller à la prochaine valeur du tableau
    
                    if (y>=100)             // si y atteint 100 à ce stade, le tableau est finis et on repart au début
                    {
                        y=0;
                    }
                    j=0;                    // reset de j jusqu'au prochain j=100
                   }
                   
                    flagpwm=0;              // reset du flag de l'interruption du timer
                }
    
            }
    }

  19. #15
    RISC

    Re : MLI sinus triangle avec dspi33ep

    Salut,

    Peux-tu faire une archive et poster tout ton projet ?
    Je ne vois pas la routine d'inititialisation de l'oscillateur. Le PB pourrais venir de là...
    Quelle carte utilises-tu ?
    Quel débogueur ? ICD3 ?

    a+
    Ma marotte ? les microcontrôleurs ;=)

  20. #16
    marc64ab

    Re : MLI sinus triangle avec dspi33ep

    Bonjour,

    L'init de l'oscillateur est dans le 2eme code que j'ai mis. C'est le même pour tous les autres.
    Comment faire une archive ? un ZIP ?
    J'utilise le dspic33EP512GM710 avec une carte de dévellopemment explorer16 et l'ICD3.

    Marc

  21. #17
    marc64ab

    Re : MLI sinus triangle avec dspi33ep

    Le premier prog pwm2 fait le sinus dans la boucle while. Le deuxieme pwm3 le fait avant et dans un tableau.

    Merci encore
    Marc
    Fichiers attachés Fichiers attachés

  22. #18
    marc64ab

    Re : MLI sinus triangle avec dspi33ep

    Juste une précision au niveau de la fonction de l'oscillateur. Les commentaires étaient erronés mais les registres bons. Voici le code de la fonction avec les bons commentaires et surtout la bonne formule.

    Code:
    void Init_Osci( void )    // Fonction pour initialiser l'oscillateur
    
    {
        // Configure Oscillator to operate the device at 40Mhz
        // Fosc= Fin*M/(N1*N2), Fcy=Fosc/2
        // Fosc= 8M*245/(2*7)=140Mhz for 8M input clock
    
        // Configure PLL prescaler, PLL postscaler, PLL divisor
        CLKDIV = 0x05; 			// N2 = 2 N1=7
        PLLFBD = 0xF3;			// M = 245
    
        //  Clock switching to incorporate PLL (NOSC=0b011)
        __builtin_write_OSCCONH(0x03); 		// Initiate Clock Switch to Primary Oscillator with PLL (NOSC=0b011)										// configuration du registre NOSC (OSCCON) -->
        __builtin_write_OSCCONL(0x01);		// Start clock switching
    
        // Wait for Clock switch to occur
        while(OSCCONbits.COSC != 0b011);
    
        // Wait for PLL to lock
        while(OSCCONbits.LOCK != 1);
    }

  23. Publicité
  24. #19
    marc64ab

    Re : MLI sinus triangle avec dspi33ep

    Bonjour J'ai finalement trouvé le problème. J'ai oublié un égal dans le test du flagpwm dans la boucle while. Et j'ai finalement mis les valeurs dans un tableau avant la boucle sinon les fréquences chutées.

    Merci
    Marc

  25. #20
    RISC

    Re : MLI sinus triangle avec dspi33ep

    Salut,

    Je suppose que tu avais confondu :
    Code:
    if ( toto = 5) 
    avec 
    if (toto == 5)
    Si c'est le cas il existe une méthode d'écriture du C pour éviter ce genre d'erreur :
    [code]if ( 5 == toto) [code] Car l'écriture de :
    Code:
    if ( 5 = toto)
    provoque la génération d'une erreur de compilation, ce qui n'est pas le cas de
    Code:
    if ( toto = 5)
    qui sera toujours vrai...

    a+
    Dernière modification par RISC ; 27/06/2015 à 13h15.
    Ma marotte ? les microcontrôleurs ;=)

Sur le même thème :

Discussions similaires

  1. Inéquation avec des sinus
    Par PetiteAnne dans le forum Mathématiques du supérieur
    Réponses: 12
    Dernier message: 27/12/2013, 11h12
  2. Fréquencemètre tension Sinus/Carré/Triangle
    Par gabydu25 dans le forum Électronique
    Réponses: 8
    Dernier message: 20/10/2012, 08h44
  3. PB avec fonction sinus
    Par fefe28100 dans le forum Mathématiques du collège et du lycée
    Réponses: 9
    Dernier message: 12/09/2008, 17h39
  4. Sinus , cosinus d'un triangle rectangle
    Par marc.suisse dans le forum Mathématiques du collège et du lycée
    Réponses: 26
    Dernier message: 13/08/2008, 16h03
  5. Equation avec sinus & cosinus ... Longueur d'un triangle ?!
    Par goluche dans le forum Mathématiques du collège et du lycée
    Réponses: 1
    Dernier message: 14/02/2008, 10h13