High Speed PWM dspic33E
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

High Speed PWM dspic33E



  1. #1
    marc64ab

    High Speed PWM dspic33E


    ------

    Bonjour à tous,

    Je programme une PWM sur un dspic33EP512GM710 avec le module high speed PWM. J'ai cependant quelques interrogations.

    Tout d'abord, je ne suis pas sûr au sujet de la clock que le module utilise. Je sais pas si il l'a crée automatiquement.

    Ensuite, sur quel port il envoie les pwm ? Sont-ils fixés par le composant ? Par exemple PWM1H est sur RB14. Je me demandais du coup si il fallait mettre le port B en sortir et en digital.

    Je vous joins mon programme. Je n'ai rien en sortie sur une board explorer 16

    Merci d'avance

    Marc

    -----
    Fichiers attachés Fichiers attachés

  2. #2
    RISC

    Re : High Speed PWM dspic33E

    Salut,

    Je te recommande de télécharger les exemples de code (CE4xx) qui font voir comment initialiser les différents périphériques.
    Tu les trouveras généralement sur la page de ton dsPIC sous la rubrique software ou dans la page http://www.microchip.com/codeexamples
    Il y a plein d'exemples pour la carte EXPLORER16. Regarde en bas de cette page. Ce logiciel fonctionne sur une multitude de modules processeurs.

    a+
    Dernière modification par RISC ; 12/05/2015 à 08h14.

  3. #3
    marc64ab

    Re : High Speed PWM dspic33E

    Bonjour,

    J'ai essayé de comparer avec les exemples mais je ne vois pas pourquoi ma pwm ne sort pas de mon pic. Il doit surement me manquer un instruction.

    Le fonctionnement du timer et le clignotement des leds fonctionnent.

    Si quelqu'un pourrait essayer de me dire qu'est-ce qu'il manque à mon programme. Je vous le mets ci dessous.

    Merci d'avance

    Marc

    Code:
    #include <p33EP512GM710.h>
    
    _FOSCSEL( FNOSC_PRI );                              // Select Primary Oscillator (Posc) at POR (Power-on Reset)
    _FOSC( POSCMD_XT & OSCIOFNC_OFF & FCKSM_CSECMD );   // Configure Posc in XT 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);
    
    int main(void)
    {
        
        RCONbits.SWDTEN=0;           // Disable Watch Dog Timer
    
        Init_Port();
        Init_Osci();                // Oscilator initialisation
        Init_Timer2();              // Timer2 initialisation
        Init_PWM();                 // PWM initialisation
        
    	while(1);
                
                    
         
    }
    
    /*---------------------------------------------------------------------
      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= 8M*40/(2*2)=80Mhz for 8M input clock
    
        // Configure PLL prescaler, PLL postscaler, PLL divisor
        CLKDIVbits.PLLPRE 	= 0; 			// N1 = 2
        CLKDIVbits.PLLPOST 	= 0; 			// N2 = 2
        PLLFBDbits.PLLDIV 	= 38;			// M = 40
    
        //  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 = 0x0000;        // Enables digital port pin
        TRISF = 0x0000;         // Port F is an output
        ANSELF = 0x0000;        // Enables digital port pin
        
    }
    
    
    /*---------------------------------------------------------------------
      Function Name: Init_Timer2
      Description:   Initialize Timer2 1kHz
      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 = 0b11; // Select 1:256 Prescaler (40MHz/256=156250Hz--->6.4us)
    
        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 = 156250;           // Load the period value (1/6.4us=156250)
    
        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 = 6;     // 1:1 PWM prescaler
        PWMCON1bits.ITB = 0;        // PTPER provides the PWM time period value
        PTPER = 25000;               // Set PWM Period on Primary Time Base PTPER=Fosc/(Fpwm*PWMprescaler)=80MHz/(50kHz*1)
    
        PWMCON1bits.MDCS = 0;       // PDC1 provides duty cycle value
        PDC1 = 12500;                 // Independent Primary Duty Cycle is 50% of the period PDCx=(Fosc/(Fpwm*PWMprescaler))*DesiredDuty Cycle=(80MHz/(50kHz*1))*0.5=800
        PHASE1 = 0;                 // Primary phase shift value
        DTR1 = 0;                   // Set Dead Time Values  Fosc*(Desired dead time/PWMprescaler)
        ALTDTR1 = 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
    
        PWMCON1 = 0x0000;           // Set Primary Time Base, Edge-Aligned Mode and Independent Duty Cycles
        FCLCON1 = 0x0003;           // Configure Faults
    
        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ésédent
     	LATGbits.LATG11 = ~LATGbits.LATG11;
    
     	TMR2 = 0;
     	T2CONbits.TON = 1;		// activer à nouveau le Timer
     }
    Dernière modification par Antoane ; 13/05/2015 à 13h53. Motif: Remplacement balises quote par code

  4. #4
    RISC

    Re : High Speed PWM dspic33E

    Salut,

    L'exemple de code CE483 fait pour ton dsPIC devrait pouvoir t'aider :
    http://www.microchip.com/search/sear...x?id=2&q=CE483
    Il utilise aussi les PWM1L et H

    a+

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

    Re : High Speed PWM dspic33E

    Bonjour,

    C'est bon j'ai réussi. Merci pour vos aides.

    Dernier petit problème, les sorties sont en 3.3V et je voudrais les avoir en 5V. Est-ce que cela est possible ?

    Marc

  7. #6
    marc64ab

    Re : High Speed PWM dspic33E

    Bonjour

    petit up ...

  8. #7
    marc64ab

    Re : High Speed PWM dspic33E

    peut-être que je peux utiliser le registre Open-Drain Control vu que ceux sont des pins tolérantes 5V.

    Dans la datasheet il parle de mettre une résistance de pull-up externe, faut mettre combien ?

    Merci d'avance
    Marc

  9. #8
    RISC

    Re : High Speed PWM dspic33E

    Salut,

    Les broches tolérantes 5V doivent être mises en mode drain ouvert.
    Le calcul de la résistance de pull up est simple. Lorsque tu mettras ta sortie à 0V il ne pas excéder le courant entrant de la sortie du dsPIC ce qui doit être de l'ordre de 20mA (à vérifier dans la datasheet). Donc : Vout = Vol (Vol est donné en fonction du courant Iol). Une fois que tu as Vol tu fais Vresistance = 5V - Vol.
    Ensuite il suffit de faire Resistance = Vresistance / Iresistance
    Tu peux aussi faire cela rapidement si tu veux seulement mettre ta broche à 5V ou 0V en limitant le courant.
    En "approximant" tu fais R = 5V / 1mA = 5K (4.7K)

    a+

  10. #9
    marc64ab

    Re : High Speed PWM dspic33E

    Bonjour,

    J'ai mis une résistance de 1k, ça marchait.

    Mais je comprend pas ce que c'est Vol et Iol ?

    Marc

  11. #10
    antek

    Re : High Speed PWM dspic33E

    Citation Envoyé par marc64ab Voir le message
    Mais je comprend pas ce que c'est Vol et Iol ?
    Vol -> voltage output low
    Iol -> current output low

  12. #11
    marc64ab

    Re : High Speed PWM dspic33E

    Je pense que j'ai Vol à 0.4V et Iol à 12mA. page 443 de la datasheet . Pouvez-vous me le confirmer svp ?

    Si c'est bien cela, je trouve Vresistance=5-0.5=4.6 et donc R=5/5mA=920=1k si je veux limiter le courant à 5mA

    Merci
    Marc
    Dernière modification par marc64ab ; 21/05/2015 à 10h24.

  13. #12
    marc64ab

    Re : High Speed PWM dspic33E

    erreur de frappe c'est bien 5-0.4=4.6 et 4.6/5mA=920 désolé lol

  14. #13
    marc64ab

    Re : High Speed PWM dspic33E

    bonjour,

    et si je met ma pull-up au 15V pour avoir 15V finalement, ça peut marcher ou pas ? ou 5V est le maximum sachant que les pins sont tolérantes 5V ?

    Merci
    Marc

  15. #14
    marc64ab

    Re : High Speed PWM dspic33E

    -----up----

  16. #15
    RISC

    Re : High Speed PWM dspic33E

    Salut,

    Si tu mets une pull up à une tension supérieure à 5V tu crames le dsPIC...C'est un microcontroleur, pas un driver de puissance...
    Tout est marqué dans la datasheet, y compris les tensions max sur chaque broche. 5V tolerant cela veut dire 5V tolerant, pas 15V tolerant.
    Il faut soit ajouter des transistors externes , des mosfets externes ou des drivers haute tension externe...
    Il y a des centaines de schémas sur internet pour faire un interface de "puissance"

    a+
    Dernière modification par RISC ; 23/05/2015 à 18h04.

Discussions similaires

  1. USB High-speed "PHY"
    Par ningel85 dans le forum Matériel - Hardware
    Réponses: 2
    Dernier message: 13/11/2013, 17h45
  2. photo high speed contrôlée par arduino
    Par rodolphe.g dans le forum Électronique
    Réponses: 5
    Dernier message: 12/02/2013, 18h52
  3. High speed USB 3.0 CYUSB3014
    Par ritchyv dans le forum Électronique
    Réponses: 4
    Dernier message: 14/12/2011, 10h32
  4. Déclencheur sonore pour flash (photo high speed)
    Par invite6ef2b23a dans le forum Électronique
    Réponses: 11
    Dernier message: 28/02/2011, 08h09
  5. [Projet] Switching CAN High Speed/Can Low Speed
    Par invitefb142eb4 dans le forum Électronique
    Réponses: 0
    Dernier message: 08/05/2006, 13h36
Découvrez nos comparatifs produits sur l'informatique et les technologies.