www.micro-examples.com
Microcontroller circuits and source code examples
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 
 

Signaux en déphasages pour driver un push-pull

 
Post new topic   Reply to topic    www.micro-examples.com Forum Index -> General Discussion About PIC Microcontrollers
View previous topic :: View next topic  
Author Message
SPONTEX



Joined: 12 Jun 2007
Posts: 45

PostPosted: Sun Sep 23, 2007 6:56 pm    Post subject: Signaux en déphasages pour driver un push-pull Reply with quote

Salut à tous et à brunog en particulier.

Grâce à tes conseils j'ai pu terminer mon projet.
J'ai fais la mise à jour 7.0.0.3 du compilo comme tu me l'avais conseillé, ce qui permet une utilisation plus confortable de PWM1 et PWM2 avec cette version.
Maintenant que je commence à manier mieux ce compilateur, j'aimerai m'attaquer à une nouvelle réalisation dont voici la description:

Je souhaiterai piloter un push-pull donc générer une fréquence variable de 25KHz à 40KHz avec un rapport cyclique également variable.
Les 2 signaux doivent être en opposition de phase avec un temps mort minimum pour éviter une commutation simultanée des transistors de puissances.

En gros ça donnerait quelque chose comme ça:

LHHHLLLLLLHHHLLLLLLH...
LLLLLLHHHLLLLLLHHHLL...

L:low level
H:high level

Pour faire varier la fréquence ça ne pose pas de problème en revanche pour décaler les signaux et créer le retard entre eux c'est déjà plus coton. Confused

Je suppose qu'il va falloir travailler avec les interruptions et CPP1 et CPP2, est-ce que quelqu'un à déjà travaillé sur ce genre de choses et aurait quelques conseils à me donner?
A bientôt de vous lire.
_________________
SPONTEX
Back to top
View user's profile Send private message
BrunoG
Site Admin


Joined: 22 Nov 2005
Posts: 636

PostPosted: Mon Sep 24, 2007 8:37 am    Post subject: Reply with quote

Hello,

Il faut dans ce cas t'orienter vers des PICs qui ont un module PWM amélioré, et qui sont destinés au contrôle moteur.
Je pense par exemple au PIC18F4431 qui possède des sorties PWM complémentaires et une gestion du dead time par hardware.
C'est un peu plus complexe à mettre en oeuvre qu'un module PWM classique, par contre cela simplifie énormément le logiciel.
Voir la doc du PIC18F4431 :
http://ww1.microchip.com/downloads/en/DeviceDoc/39616C.pdf
et voir la section "POWER CONTROL PWM MODULE"
_________________
BrunoG, Administrator
Back to top
View user's profile Send private message Send e-mail
SPONTEX



Joined: 12 Jun 2007
Posts: 45

PostPosted: Fri Sep 28, 2007 3:32 pm    Post subject: Reply with quote

Salut brunog,

oui en effet je me suis orienté en fait sur le PIC18F8722, compte tenu des ressources importantes nécessaires à mon projet.

En examinat la circuiterie interne des modules PWM, il y a de quoi faire mais ça à l'air un peu usine à gaz...
Je vais essayer de voir comment générer ces signaux, visiblement peu d'applications en C et pas de renseignement sont dispo hormis la datasheet malheureusement.
Même Microchip n'est pas très bavard en exemples d'appli.
@+
_________________
SPONTEX
Back to top
View user's profile Send private message
SPONTEX



Joined: 12 Jun 2007
Posts: 45

PostPosted: Fri Nov 30, 2007 9:35 am    Post subject: Reply with quote

Salut,

bon j'ai bien avancé sur les ressources PWM du PIC18F8722, et l'impression de départ était juste, c'est coton.

Il y a pas mal de registres qu'il faut configurer pour assurer un mode particulier de fonctionnement, mais bon j'obtiens des résultats et je ne bûte plus que sur un point.
Je me demande d'ailleurs si je n'ai pas trouvé un bug du compilo, c'est pour ça qu'avant de crier au loup, je sollicite votre avis:

Je vous joins la partie du prog qui traite l'init du PIC, du PWM et des interruptions pour plus de clarté.

L'initialisation du Pic:
Code:

//==============================================================================
//                           Initialisation du PIC
//==============================================================================

void init_pic()
{
INTCON  = 0b11110000;
INTCON2 = 0b00000100;
INTCON3 = 0b00111000;

//======================== Pramétrage du timer0 ================================

T0CON=0b11011111;     // Timer0 Go!, 8 bit, prescaler 1:256

//TMR0ON=0;
//T08BIT=1;
//T0CS=0;
//T0SE=1;
//PSA=1;
//T0PS0=1;
//T0PS1=1;
//T0PS2=1;

//==============================================================================

//Port A mesure des tensions analogiques

ADCON1 = 0b00000110; //AN0~AN8 mes.An, autres digital A/D, Vref+(Vcc)/Vref-(Gnd)
PORTA  = 0b11111111;
TRISA  = 0b11111111;  // RA0-RA7 en entrée.

//Port B

TRISB = 0b00001111;
PORTB = 0b00001111;

//Port C
PORTC = 0b10000100; //1000 0000 :b7 entrée cavalier S1 à 1 par défaut, RC2 en entrée
TRISC = 0b10000100; //Le port C en sortie sauf C7 et C2 en entrée.

//Port D
TRISD = 0;
PORTD=0b11110000;
//Port E
TRISE = 0;
PORTE = 0;
//Port F
//Port G
TRISG = 0b0001000;
PORTG = 0b0010000;  // G4 en entrée
//Port H

//Port J


I2C_Init(100000);
GIE=1;
}


La config PWM:
Code:

void configure_PWM(void)
{
TRISC.F2=1; // On met le tris en entrée pour débuter la config
PR2=49;       // on charge PR2 pour F=20KHz, quartz=4MHz

CCP1CON=0b00011100;   // b7, b6:Half-bridge mode, b5=0, b4=1 (Lsb CCPR1L)
                      // b3,b2,b1,b0 PWM mode;P1A,P1C active-high,P1B,P1D aussi
//b7  1: Half-bridge output mode
//b6  0: Half-bridge output mode
//b5  x: Lsb de CCPR1L
//b4  x  Lsb de CCPR1L
//b3  1: PWM mode
//b2  1: PWM mode
//b1  0: active high
//b0  0: active high

CCPR1L=0b00001110; // Msb

ECCP1DEL= 0b00000110;   // Dead time Delay = Tosc*4*10^6 (ici on fixe 6µs)
//  b7 PWM restart Enable bit
//  b6 Delay time
//  b5 Delay time
//  b4 Delay time
//  b3 Delay time
//  b2 Delay time
//  b1 Delay time
//  b0 Delay time

TMR2IF=0;
T2CON=0;
}


Interruptions:

Code:

//==============================================================================
//                         Traitement des interruptions
//==============================================================================

void interrupt()
{
//GIE=0;
     if (INT0IF)  // interruption suite à appui sur ligne X1 de la matrice clavier
      {
      X_ligne=1;
      INT0IF=0;
      }

     if (INT1IF)  // ligne matrice clavier X2
      {
      X_ligne=2;
      INT1IF=0;
      }

     if (INT2IF)  // ligne matrice clavier X3
      {
      X_ligne=3;
      INT2IF=0;
      }
     if(TMR0IF)     // Timer0 réglé sur 1 seconde
      {
      TMR0IF=0;
      cnt--;
      if(cnt==0)
        {
        PORTD.F7=0;
        Delay_ms(30);
        PORTD.F7=1;
        new_seconde=1;
        cnt=3633;
        }
      }
//     if(TMR2IF) TMR2IF=0;  Est-il nécessaire de remettre le flag à 0 manuellement?
}

Dans mon hard, j'utilise le mode ECCP1, mode PWM étendu cadencé par TIMER2.
L'afficheur utilise le portE pour les datas, et RE6 est multiplexé avec P1B que j'utilise comme sortie PWM, donc comme le registre CONFIGH3 me permet de déclarer soit RE6 soit RH7 j'ai pris RH7.
Seulement lorsque je démarre l'appli avec P1B sur RH7 l'affichage se rempli de hiéroglyphes, se qui signifie que le bus data de l'afficheur est pertubé par des signaux indésirables comme si il y avait un problème avec le multiplexage.
Le plus drôle c'est que si j'affecte RE6 sur P1B, l'init se déroule bien tant que je ne lance pas le start PWM... je retrouve bien mon signal PWM sur RE6 donc là il est normal que l'affichage soit perturbé, mais dans le premier cas je ne comprend pas du tout la cause du dysfonctionnement dès la mise en route.
J'oublie peut-être un détail à l'init, mais je ne vois pas pourquoi l'affichage est perturbé.
Si quelqu'un qui a eu la patience de me lire a une idée... Idea
_________________
SPONTEX
Back to top
View user's profile Send private message
SPONTEX



Joined: 12 Jun 2007
Posts: 45

PostPosted: Fri Nov 30, 2007 9:40 am    Post subject: Reply with quote

Enfin le lancement du PWM se fait ici:

Code:

void start_push-pull(void)
{
  {
  configure_PWM();
  T2CON.F2=1;
  TRISC.F2=0;   // On positionne le portC2 en sortie.
  PORTD.F4=0;   // led permettant de visualiser le passage dans cette routine

  Delay_ms(20);
  PORTD.F4=1;
  }
}

_________________
SPONTEX
Back to top
View user's profile Send private message
SPONTEX



Joined: 12 Jun 2007
Posts: 45

PostPosted: Fri Nov 30, 2007 8:41 pm    Post subject: Reply with quote

Bon, je vois que ça n'inspire personne, dommage...

Il est vrai que c'est un vrai casse tête, pour l'instant je laisse tomber. Confused

Je me demande si l'on peut faire 2 sorties à fréquences variables et indépendantes?
Est-ce que quelqu'un à déjà fait ce genre de truc?
_________________
SPONTEX
Back to top
View user's profile Send private message
SPONTEX



Joined: 12 Jun 2007
Posts: 45

PostPosted: Tue Dec 04, 2007 9:52 pm    Post subject: Reply with quote

Salut c'est encore moi,

après avoir regardé de près la datasheet, je crois comprendre que seul le mode étendu permettrai de réaliser 2 PWM totalement indépendants...
La page 180 montre un tableau ou seul les 2 cas du centre permettent cette config.
Me trompe-je?
Ce qui serait une sacré faiblesse je trouve, car cela veut dire que les autres timers deviennent dépendants.
Si brunog tu passes par là j'aimerai avoir ton opinion...
_________________
SPONTEX
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    www.micro-examples.com Forum Index -> General Discussion About PIC Microcontrollers All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum



Powered by phpBB © 2001, 2005 phpBB Group