PWM sur PIC18f45K20
Répondre à la discussion
Affichage des résultats 1 à 30 sur 30

PWM sur PIC18f45K20



  1. #1
    flolarajasse

    PWM sur PIC18f45K20


    ------

    Bonjour à tous,

    Simple question, je souhaite utiliser un PIC18F45K20 pour une application. Il faut que j'utilise 4 sorties PWM ; le problème est de savoir à quelle broches correspondent ces sorties. Dans la datasheet, par exemple pour PWM2, elle correspond à RB3 et RC1? Pareil pour PWM3 qu'on retrouve sur RB5 et RE0.

    Sauriez vous m'éclairer?

    Merci d'avance.

    PS : Je ne suis pas un grand utilisateur des PWM sur PIC, d'où ma question

    -----
    Java is the best!

  2. #2
    cubitus_54

    Re : PWM sur PIC18f45K20

    Bonjour,

    C'est une alternative possible, c'est à toi dans ton programme de définir quelle boche tu affectes au CCP

    11.1.2 CCP2 PIN ASSIGNMENT
    The pin assignment for CCP2 (Capture input, Compare and PWM output) can change, based on device configuration.
    The CCP2MX Configuration bit determines the pin with which CCP2 is multiplexed. By default, it is assigned to RC1 (CCP2MX = 1). If the Configuration bit is cleared, CCP2 is multiplexed with RB3.
    Changing the pin assignment of CCP2 does not automatically change any requirements for configuring the port pin. Users must always verify that the appropriate TRIS register is configured correctly for CCP2 operation, regardless of where it is located.
    Dernière modification par cubitus_54 ; 25/06/2014 à 12h35.

  3. #3
    flolarajasse

    Re : PWM sur PIC18f45K20

    Ok, je croyais qu'il y avait une importance quelconque.

    Merci
    Dernière modification par flolarajasse ; 25/06/2014 à 12h37.
    Java is the best!

  4. #4
    RISC

    Re : PWM sur PIC18f45K20

    Salut,

    Attention aux 4 sorties PWM dans le PIC18F45K20 : elles ne sont pas indépendantes. Ils sont prévus pour piloter des bridges ou demi-bridges.
    Si tu as besoin de sorties PWM complètement indépendantes il vaudrait mieux regarder le PIC18F45K22

    a+

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

    Re : PWM sur PIC18f45K20

    Citation Envoyé par RISC Voir le message
    Salut,

    Attention aux 4 sorties PWM dans le PIC18F45K20 : elles ne sont pas indépendantes. Ils sont prévus pour piloter des bridges ou demi-bridges.
    Si tu as besoin de sorties PWM complètement indépendantes il vaudrait mieux regarder le PIC18F45K22

    a+
    Erreur de frappe de ma part, je voulais parler d'un PIC18F45K22
    Java is the best!

  7. #6
    flolarajasse

    Re : PWM sur PIC18f45K22

    Bonjour à tous,

    Je déterre un peu ce sujet, simplement pour poser une question : est-il possible d'augmenter la résolution du PWM sur ce PIC, ou est-on limité à 10 bits?
    Je ne trouve pas la réponse dans la datasheet.

    Merci d'avance,
    Java is the best!

  8. #7
    RISC

    Re : PWM sur PIC18f45K22

    Salut,

    La datasheet fait foi. C'est bien 10 bits de résolution sur le PIC18F45K20
    Si tu cherches des PICs avec jusqu'à 16bits de résolution, plus trouveras avec MAPS 17 PIC12 et PIC16 qui ont de 1 à 3 canaux de PWM 16 bits.

    a+

  9. #8
    flolarajasse

    Re : PWM sur PIC18f45K20

    En effet, c'est bien 10 bits, tant pis je m'en contenterais.

    Reste maintenant à mettre ce PWM en œuvre.
    Java is the best!

  10. #9
    flolarajasse

    Re : PWM sur PIC18f45K20

    Re RISC,

    Petite question ; je viens de terminer un petit programme avec le PWM, je le fais augmenter jusqu'à 100 puis redescendre à 0 avec des petites tempos (juste histoire de la maniper ).
    En revanche, je voulais savoir une petite chose ; étant donné que j'ai 8 bits dans CCPR1L(MSB) et 2 dans CCP1CON(LSB), comment est ce que je fais pour tous les mettre dans une variable (un int) afin de pouvoir effectuer mon traitement? Le but est de pouvoir envoyer toutes les valeurs possibles (de 0 à 2^10 = 1024).

    Merci d'avance pour ton aide.
    Java is the best!

  11. #10
    RISC

    Re : PWM sur PIC18f45K20

    Salut,

    Tu déclares un int pour ta valeur PWM et tu utilises l'operateur de decalage <<
    Attention à caster (int) avant d'additioner

    Code:
    unsigned int PWMval;
    
    PWMval =  ( (int) CCPR1L << 2 ) + CCP1CONbits.DC2B ;
    a+

  12. #11
    flolarajasse

    Re : PWM sur PIC18f45K20

    En effectuant cette opération, j'aurais donc ma varialble PWMval sur 10 bits?
    Je vais regarder sérieusement les opérateurs à décalage

    Merci beaucoup.
    Java is the best!

  13. #12
    flolarajasse

    Re : PWM sur PIC18f45K20

    Petite modif :

    En effectuant cette opération, j'aurais donc ma varialble PWMval sur 10 bits?
    Je vais regarder sérieusement les opérateurs à décalage

    Pour envoyer ma valeur avant ta réponse, j'utilisais CCPR1L = valeur;
    Maintenant que je travaille sur 10 bits, et avec la nouvelle opération, comment procéder?
    Je n'utilise plus CCPR1L?

    Merci beaucoup.(Fin de journée désolé, je fatigue un peu).
    Java is the best!

  14. #13
    RISC

    Re : PWM sur PIC18f45K20

    Salut,

    Le morceau de code que j'ai écrit montre simplement comment avoir le duty cycle sur 10 bits.
    Quand tu écris les registres tu dois faire l'inverse.
    En supposant que dans ton programme tu veuilles 50% de duty, tu mets PWMval = 511 et ensuite je te laisse trouver comment récupérer les 8 bits de poids fort pour les mettre dans CCPR1L et les 2 bits de poids faible dans CCP1CONbits.DC2B

    Encore une fois c'est l'opérateur de décalage mais cette fois dans l'autre sens.

    a+

  15. #14
    flolarajasse

    Re : PWM sur PIC18f45K20

    Merci pour tes réponses, je regarderais demain, une fois frais et dispo .
    Java is the best!

  16. #15
    flolarajasse

    Re : PWM sur PIC18f45K20

    Je viens de regarder les registres à décalage ; Si PWMval = 511 ;

    Code:
    PWMval =  ( (int) CCPR1L << 2 ) + CCP1CONbits.DC1B ;
    PWMval = 511 ; // On obtient PWMval = 0b111111111;
    PWMval =  ( (int) CCPR1L >> 1 ) + CCP1CONbits.DC1B ; // On obtient CCPR1L = 0b01111111 & CCP1CONbits.DC1B = 11;
    Je me trompe non?Quels instructions dois-je enlever?
    Java is the best!

  17. #16
    flolarajasse

    Re : PWM sur PIC18f45K20

    Changement de programme ; pour certains impératifs, je dois changer de PIC, passer au PIC18F4431 donc PWM de 14 bits. Déjà qu'avaec 10 je galèrais...
    Java is the best!

  18. #17
    flolarajasse

    Re : PWM sur PIC18f45K20

    Re RISC, excuse moi de te déranger, pourrais tu juste répondre à mon message en #11 stp, c'est juste pour valider le principe de fonctionnement.
    Merci,
    Java is the best!

  19. #18
    RISC

    Re : PWM sur PIC18f45K20

    Salut,

    Sais-tu utiliser le debug ?
    Si ce n'est pas le cas il faut t'y mettre immédiatement car il est impossible de développer correctement sans cela...
    La question que tu poses trouve sa réponse en mode debug même en simulation en utilisant la Watch window ou variable window et le mode pas à pas.
    N'oublie pas de déclarer PWMval en unsigned int (valeur sur 16 bits).

    Crois moi, cela t'a pris plus de temps à poster la quesion sur ce forum qu'à faire le test en simulation sur MPLAB X.
    Il faut faire des erreurs et trouver la raison pour progresser.

    a+
    Dernière modification par RISC ; 16/10/2014 à 11h38.

  20. #19
    flolarajasse

    Re : PWM sur PIC18f45K20

    Non en effet, je ne sais pas me servir du mode debug, et je vais m'y mettre sans tarder si cela a une grande utilité ; as tu un bon tuto pour son utilisation?
    Java is the best!

  21. #20
    RISC

    Re : PWM sur PIC18f45K20

    Salut,

    Les tutos c'est ici : http://microchip.wikidot.com/

    Archive ce lien qui est le site d'aide aux dévelopeurs pour MPLAB X et les librairies.

    Pour MPLAB X c'est ici : http://microchip.wikidot.com/tls0101:start

    a+

  22. #21
    flolarajasse

    Re : PWM sur PIC18f45K20

    Salut RISC,

    Comme je t'ai dis, je suis passé sur un PIC18F4431 afin d'avoir une meilleure résolution de mon PWM (14bits).
    Est ce que mon raisonnement est bon?

    - Tout d'abord, étant donné que les 14 bits se trouve sur 2 octets différents, il faut tous les mettre dans une variable int?Ce sera toujours plus simple à manipuler dans le programme, non?

    Le problème est que je ne vois pas comment mettre la valeur de registres dans une variable.
    Avec ton exemple :
    Code:
    PWMval =  ( (int) CCPR1L << 2 ) + CCP1CONbits.DC2B ;
    Pourquoi l'utilisation d'un décalage à gauche?Déjà je ne comprends pas ce point.

    Ensuite, le fait d'écrire dans PWMval ne va pas modifier les valeurs dans les registres?Il faudrait inverser cette instruction, non?Mais a t-on le droit?

    Désolé de toutes ces questions, mais j'ai vraiment envie de maitriser le sujet, et je ne trouve pas mon bonheur sur le net.

    Merci.
    Java is the best!

  23. #22
    RISC

    Red face Re : PWM sur PIC18f45K20

    Salut,

    Je pense que tu as maintenant compris ce que j'ai expliqué aux posts #10 et #13.
    Tu m'as tout d'abord demandé :

    En revanche, je voulais savoir une petite chose ; étant donné que j'ai 8 bits dans CCPR1L(MSB) et 2 dans CCP1CON(LSB), comment est ce que je fais pour tous les mettre dans une variable (un int) afin de pouvoir effectuer mon traitement? Le but est de pouvoir envoyer toutes les valeurs possibles (de 0 à 2^10 = 1024).
    J'ai répondu à ta question car tu as parlé de variable et pas de registre du PIC. Je me doutais que tu voulais l'inverse

    C'est pourquoi au post #13 je t'ai expliqué comment faire l'inverse. Transférer la valeur de ta variable qui contient le rapport cyclique, dans les registres du PIC.

    Tu as décidé de passer sur le PIC18F4431. Fais attention car l'unité de PWM qui a 14 bits est totalement différente de l'unité classique. Cette dernière existe aussi sur le PIC1F4431 (comme dans tous les PIC18) mais en plus il y a une unité de PWM dédiée spécialisée, entre autre, pour le contrôle moteur.
    Il faut utiliser le chapitre 18 de la datasheet du PIC18F4431.

    Je te conseille de lire les notes d'application, elles permettent de comprendre comment initialiser les registres

    A bientôt pour la suite ;=)
    Dernière modification par RISC ; 31/10/2014 à 15h29.

  24. #23
    flolarajasse

    Re : PWM sur PIC18f45K20

    Salut RISC,

    Oui, petit à petit je comprends, et c'est ce qui importe
    Oui tout à fait, le but est d'écrire la valeur de mon rapport cyclique dans une variable, et ensuite la "transférer" dans mes différents registres.
    C'est justement là que je bloque quand tu dis de faire l'inverse, je ne vois pas comment procéder.
    Je suppose que l'instruction sera inversé, du genre :

    Code:
    CCPR1L ..... =  PWMval
    C'est ça?
    Le problème est que n'ayant jamais pratiqué ce genre d'opérations, je rame un peu. Faut-il utiliser les registres à décalage?
    Si tu peux juste m'indiquer comment procéder, afin que je comprenne (enfin), ça serait cool.

    Merci, bon week.
    Java is the best!

  25. #24
    RISC

    Re : PWM sur PIC18f45K20

    bonsoir,

    En supposant que PWMval contienne ton rapport cyclique, il faut tout d'abord que tu déclares PWMval comme un entier non signé (unsigned int) pour qu'il puisse contenir au-moins 10bits ou 14bits suivant l'unité de PWM que tu veux utiliser sur le PIC.

    Je vais donc faire l'exemple pour l'unité PWM de 10bits qui est similaire au PIC18F45K20 et à tous les PIC18
    Il faudra que tu fasses différemment pour l'unité PWM spécialisée du PIC18F4431 mais le principe reste le même.


    Code:
    unsigned int PWMval=0 ;
    ...
    CCPR1L = PWMval >> 2;                          // on garde les 8 bits de poids fort pour les copier dans CCPR1L
    CCP1CONbits.DC2B = PWMval & 0b11;     // on masque les 8 bits de poids fort pour garder les 2 bits de poids faible ;
    Etudie maintenant l'unité spéciale du PIC18F4431

    a+

  26. #25
    flolarajasse

    Re : PWM sur PIC18f45K20

    Salut RISC,

    Si je souhaite utiliser l'unité 14 bits du PIC18F4431 ; il faut utiliser PDC0H & PDC0L.

    Code:
    unsigned int PWMval = 0;
    
    PDC0H = PWMval & 0b111111; // On masque les 2 bits de poids fort et on garde les 6 bits de poids faible
    PDC0L = PWMval >> 8 // Il faut utiliser les registres à décalage à ce moment?
    C'est le principe du décalage que je n'ai pas trop assimilé ;
    Code:
    CCPR1L = PWMval >> 2;                          // on garde les 8 bits de poids fort pour les copier dans CCPR1L
    Pourquoi tu fais un décalage de 2 vers la droite?C'est pour les 2 bits de CCP1CONbits.DC2B?
    Java is the best!

  27. #26
    flolarajasse

    Re : PWM sur PIC18f45K20

    The PWM period has 12-bit resolution by combining 4 LSBs of PTPERH and 8-bits of PTPERL
    Il va falloir que je procède de la même façon pour la période (résolution sur 12 bits)?Ecrire la valeur dans une variable puis écrire dans les registres?

    Dans mon bout de programme, j'ai bien peur que je n'ai pas configuré assez de registres, car je n'ai absolument rien sur ma sortie PWM1.
    Java is the best!

  28. #27
    flolarajasse

    Re : PWM sur PIC18f45K20

    Oula mal réveillé, je ne voulais pas mettre registre à décalage ^^, mais décalage à droite.

    Pour le PWM1 du PIC, si j'ai bien compris, pour la période et pour le rapport cyclique, le principe est le même :

    Période : 4 LSB de PTPERH et 8 bits de PTPERL
    Rapport cyclique : 6 LSB de PDC0H & 8 bits de PDC0L.


    Je pense que j'ai fais une erreur dans mon code ; est ce que pour la période, le code serait-celui ci :

    Code:
    unsigned int periode = 0;
    
    PTPERH =  periode >> 4; // J'ai repris ton exemple mais je n'ai pas compris en quoi nous sert le décalage à droite (Les zéros qui sortent à droite sont perdus, tandis que le bit non nul de poids plus fort est recopié à gauche)
    PTPERL = periode & 0b11111111; //On masque les 4 bits de poids fort pour garder les 8 bits de poids faible.
    Java is the best!

  29. #28
    flolarajasse

    Re : PWM sur PIC18f45K20

    JE crois que j'ai (enfin) compris le principe du décalage de bits.

    Est ce que ce code serait correct?

    Code:
    unsigned int valeur_periode = 0;
    
    PTPERH = valeur_periode >> 8; // Décalage de 8 bits à droite
    PTPERL = valeur_periode; //est ce que dans ce cas PTPERL prend la valeur de mes bits de poids faible?Ce qui revient à faire PTPERL = valeur_periode & 0b11111111;
    Java is the best!

  30. #29
    flolarajasse

    Re : PWM sur PIC18f45K20

    ça y est, j'ai réussi cette histoire de décalage ; en revanche, petite question, étant donné que je souhaite travailler sur 14 bits (0 à 16383), je dois adapter ma période en fonction? Car là quand je rentre 255 comme valeur de PWM, je suis environ à 75%.
    Il faut utiliser cette formule?

    Nom : Sans titre.jpg
Affichages : 80
Taille : 8,9 Ko

    Si tu peux juste valider mon code

    Code:
        periode_PWM =  100;
        PTPERH = periode_PWM >> 8; // On stocke les 4 bits de poids fort dans PTPERH
        PTPERL = periode_PWM; // On masque les 4 bits de poids fort et on stocke les 8 bits de poids faible
        valeur_PWM = 255;
        PDC0H = valeur_PWM >> 8; // On stocke les 6 bits de poids fort dans PDC0H
        PDC0L = valeur_PWM; //On stocke les 8 bits de poids faible dans PDC0L
    Dernière modification par flolarajasse ; 03/11/2014 à 13h46.
    Java is the best!

  31. #30
    flolarajasse

    Re : PWM sur PIC18f45K20

    Dernier petit soucis :

    J'ai un petit soucis avec ma base temps ; je l'ai régler au maximum afin de pouvoir visualiser mes 2^14 = 16383 bits de rapport cyclique. Le problème lorsque je règle ma période au maximum (sur 12 bits donc 4096), mais quand je règle mon rapport cyclique au maximum (16383 ou un peu moins), mon PWM retombe à 0 ; exemple, si je mets 16375, je vois mon rapport cyclique (quasiment à 100%), quand je le met à 16380, je n'ai plus rien en sortie.
    Comment faut-il faire, étant donné que je ne peut pas augmenter la valeur de ma période?Faut-il utiliser un postscaler?Avec un pre-scaler, ça ne fonctionne encore moins étant donné que ça augmente la valeur de ma période (> à 12 bits).
    Java is the best!

Discussions similaires

  1. Utiliser module gsm sur PIC18f45K20
    Par franofcholet dans le forum Électronique
    Réponses: 6
    Dernier message: 08/08/2013, 20h38
  2. Tension de référence pic18f45k20
    Par bob75140 dans le forum Électronique
    Réponses: 7
    Dernier message: 17/05/2013, 21h52
  3. pickit et pic18f45k20
    Par Potentiometre dans le forum Électronique
    Réponses: 10
    Dernier message: 19/01/2013, 17h12
  4. Probleme pic18f45k20
    Par invite6fb3495b dans le forum Électronique
    Réponses: 4
    Dernier message: 01/08/2012, 14h58
  5. Interruption avec PIC18F45K20
    Par *Baby* dans le forum Électronique
    Réponses: 6
    Dernier message: 16/06/2010, 22h09
Découvrez nos comparatifs produits sur l'informatique et les technologies.