Problème pour générer une fréquence de 40 kHz en sortie de mon microcontrôleur ?
Répondre à la discussion
Affichage des résultats 1 à 19 sur 19

Problème pour générer une fréquence de 40 kHz en sortie de mon microcontrôleur ?



  1. #1
    Albert-cosmoff

    Problème pour générer une fréquence de 40 kHz en sortie de mon microcontrôleur ?


    ------

    bonjour a tous,
    voila je veux creer une frequence de 40KHz en sortie de mon microcontroleur( PIC16F1508),
    j'utilise comme compilateur MPLABX,

    donc je crée un TIMER0 de frequence 80KHz pour que toutes les 12.5 micro secondes ma tension en sortie du pic soit = 5v puis 12.5 micro secondes apres
    la tension est a 0 ce qui me fera une frequence en sortie de pic de 40KHz.
    j'explique mon code : la frequence du quartz est de 2MHz , le microcontroleur etant de 8 bits( = 255 en decimal ) alors il faut 128 micro secondes pour deborder (t0if=1), avec un produit en croix j'obtiens un TMR0 a 231 pour avoir une frequence de 80KHz,

    voici mon code:
    Code:
    #include <xc.h>
    #include <stdlib.h>
    
    // configuration du PIC16F1508
    #pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
    #pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
    #pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
    #pragma config MCLRE = ON       // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
    #pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
    #pragma config BOREN = OFF      // Brown-out Reset Enable (Brown-out Reset disabled)
    #pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
    #pragma config IESO = OFF       // Internal/External Switchover (Internal/External Switchover mode is disabled)
    #pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
    
    // CONFIG2
    #pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
    #pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
    #pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
    #pragma config LVP = OFF   
    
    
    #ifndef _XTAL_FREQ
    	#define _XTAL_FREQ 8000000
    #endif
    
    #define SORTIE_ULTRASON RA4
    int debordement=0;
    
    void INIT_PIC()
    {
    OSCCON=0b01110010;  //Oscillateur interne à 8MHZ
    T0CS=0;   // comptage quartz, FOSC=2MHz
    GIE=1;    // autorisation générale IT
    T0IE=1;   //valide IT en cas de débordement de TMR0
    T0IF=0;   // initialise T0IF a 0, T0IF=1 quand debordement de TMR0
    PSA=1;    // On desactive les prediviseurs
    TMR0=231;      // TMR0 reglé pour avoir une frequence de 80KHZ
    
    //configuration des PORTS
    ANSELA=0; //numerique
    TRISA=0x00;// le PORTA  = sorties
    PORTA=0x00;//toutes les sorties a 0
    
        
    }
    void interrupt sous_programm()
    {
        if(T0IF==1)
        {
            T0IF=0;
            debordement=1;
            TMR0=231;
        }
    
    }
    void main()
    {
    INIT_PIC();
    SORTIE_ULTRASON=1;
    
    while(1)
        {
        if(debordement==1)//  frequence de 40 000 Hz
            {
                debordement=0;
                SORTIE_ULTRASON=!SORTIE_ULTRASON;
            }
        }
    }

    Le probleme quand je lance le code et je regarde a l'oscilloscope en sortie de pic je n'ai qu'une frequence de 25 KHz et je ne comprend pas du tout pourquoi,

    avez vous une idée d'ou peut venir le probleme , est ce que mon raisonnement est bon?

    merci d'avance

    -----

  2. #2
    paulfjujo

    Re : probleme pour générer une frequence de 40KHz en sortie de mon microcontroleur

    bonjour,

    si tu te sert de l'interrupt, ne refait pas la meme chose dans le main
    qui prend beaucoup plus de temps

    Code:
    void interrupt sous_programm()
    {
        if(T0IF==1)
        {
            T0IF=0;
             SORTIE_ULTRASON=!SORTIE_ULTRASON;
            TMR0=231;
        }
    
    }
    void main()
    {
    INIT_PIC();
    SORTIE_ULTRASON=1;
    while(1)
    {
    // c'est l'interrupt qui fait le boulot
    };
    }

  3. #3
    paulfjujo

    Re : probleme pour générer une frequence de 40KHz en sortie de mon microcontroleur

    de plus, avec Q=2MHz , la precision n'est pas assez grande
    moi, je trouve TMR0=250 pour 12µS !
    avec Prescaler=1
    soit 6 cycles

    autant le faire en direct dans le main, mais alors le PIC ne fait rien d'autre
    Code:
    _asm
    boucle:
       BSF SORTIE_ULTRASON 
       NOP ; 2µS
       NOP ; 2µS
       NOP;
       NOP;
       NOP;
       BCF SORTIE_ULTRASON 
       NOP ; 2µS
       NOP ; 2µS
       BRA boucle
    _endasm
    essaie plutot avec FOSC=16MHz et TMR0=206 ou 207
    Dernière modification par paulfjujo ; 07/05/2014 à 13h31.

  4. #4
    terriblement

    Re : probleme pour générer une frequence de 40KHz en sortie de mon microcontroleur

    Salut,

    ton raisonnement me semble juste.
    Il convient d'abord de vérifier que ton PIC fonctionne à la bonne vitesse. On voit deja dans tes registres de configuration que tu utilises l'oscillateur interne et non ton quartz.

    Code:
    LATBbits.LATB5 = 0;
    		#asm 
    		NOP
    		NOP		//4*NOP + CLEAR RB7 = 5 cycles
    		NOP
    		NOP 
    		#endasm
    	LATBbits.LATB5 = 1;
    		#asm 
    		NOP		//2*NOP + SET RB7 + GOTO = 5 cycles
    		NOP 
    		#endasm
    	goto boucle;	//10 cycles, soit 40 temps d'horloge. Mesure de la période du signal, a diviser par 40 pour avoir la periode de l'oscillateur
    Ensuite, sauf erreur de ma part, le timer prends Fosc/4 et non fosc pour le comptage.

    voila des pistes

  5. A voir en vidéo sur Futura
  6. #5
    Albert-cosmoff

    Re : probleme pour générer une frequence de 40KHz en sortie de mon microcontroleur

    merci paulfjujo,terriblement,

    j'ai changé en mettant
    Code:
    OSCCON=0b01111010;  //Oscillateur interne à 16MHZ
    T0CS=0;   // comptage quartz: FOSC/4=4MHz
    
    void interrupt sous_programm()
    {
        if(T0IF==1)
        {
            T0IF=0;
             SORTIE_ULTRASON=!SORTIE_ULTRASON;
            TMR0=206;
        }
    
    }
    en faisant mes calcules je tombe bien comme toi sur TMR0 = 206 , mais la frequence en sortie de pic a l'oscilloscope est de 32KHZ , il faut mettre TMR0 = 219 pour obtenir une frequence de 40KHz,
    mais je ne comprend pas pourquoi car le calcul theorique est bon pour TMR0 = 206
    avez vous une idée?

  7. #6
    terriblement

    Re : probleme pour générer une frequence de 40KHz en sortie de mon microcontroleur

    effectue mon test pour mesurer à qulle fréquence ton pic tourne

  8. #7
    paulfjujo

    Re : Problème pour générer une fréquence de 40 kHz en sortie de mon microcontrôleur ?

    je pense que l'ecart est du à la duree de traitement
    entrer et sortir de l'interrupt
    qui prend quelques cycles d'horloge; ici 13 cycles
    puisque 219 correspond à 9,25µS

  9. #8
    DAUDET78

    Re : Problème pour générer une fréquence de 40 kHz en sortie de mon microcontrôleur ?

    Citation Envoyé par paulfjujo Voir le message
    je pense que l'ecart est du à la duree de traitement
    J'y connais que dalle en PIC ..... mais il n'y a pas un module PWM pour faire ça ?
    J'aime pas le Grec

  10. #9
    terriblement

    Re : Problème pour générer une fréquence de 40 kHz en sortie de mon microcontrôleur ?

    si si, mais dans la mesure ou il est partis sur un timer, je me suis dis qu'il doit avoir ses raisons...

  11. #10
    Albert-cosmoff

    Re : Problème pour générer une fréquence de 40 kHz en sortie de mon microcontrôleur ?

    merci pour vos reponses , voila tout marche ,
    dernier petit probleme, lorsque je compile le programme celui marche tres bien mais le lendemain il n' y a plus de programme dans le microcontroleur et je dois le recompiler,
    il y a une histoire de memoire a activer mais je ne trouve pas comment faire , et dans la doc technique de 400 pages rien ne m'eclaire
    vous avez une idée?

  12. #11
    Jack
    Modérateur

    Re : Problème pour générer une fréquence de 40 kHz en sortie de mon microcontrôleur ?

    Citation Envoyé par paulfjujo Voir le message
    je pense que l'ecart est du à la duree de traitement
    entrer et sortir de l'interrupt
    qui prend quelques cycles d'horloge; ici 13 cycles
    puisque 219 correspond à 9,25µS
    Je ne connais pas bien les PICs, mais d'une manière générale, si un timer matériel émet une interruption périodique, la fréquence de sortie sera indépendante du temps de traitement de l'interruption (en supposant évidemment que ce dernier soit plus court que la période).

    D'autre part, plutôt que de faire basculer la sortie par software, les pics n'ont-ils pas une possibilité de "toggle on timeout" qui associe une pin à un timer?

  13. #12
    terriblement

    Re : Problème pour générer une fréquence de 40 kHz en sortie de mon microcontrôleur ?

    il y a de toute manière les modules PWM pour ca...

  14. #13
    Jack
    Modérateur

    Re : Problème pour générer une fréquence de 40 kHz en sortie de mon microcontrôleur ?

    Les 68HC05 savaient faire ça sans module pwm spécifique il y a plus de 30 ans.

    Je voulais juste intervenir parce que le message donnait une information erronée sur le traitement par interruption.
    Dernière modification par Jack ; 09/05/2014 à 13h24.

  15. #14
    paulfjujo

    Re : Problème pour générer une fréquence de 40 kHz en sortie de mon microcontrôleur ?

    bonsoir,


    jack : si un timer matériel émet une interruption périodique, la fréquence de sortie sera indépendante du temps de traitement de l'interruption
    il ne faut pas oublier que des que le flag Timer s'arme,
    il faut quelques cycles pour aller dans le traitement d'interruption
    dans lequel on reinitialise le timer ...
    sauf si on part sur la valeur 0 comme init du timer et que donc ,on n'a pas besoin de le reinitailiser
    dans le traitement d'interrupt!
    ce qui n'est pas le cas dans le sujet proposé.

    sinon comme le precise Daudet78 ou Terriblement, un PWM peut tres bien sortie 80Khz avec un rapport cyclique donné..
    Deja Testé OK sur un PIC12F ..sur un 68HC05.. je ne connais pas..

  16. #15
    Jack
    Modérateur

    Re : Problème pour générer une fréquence de 40 kHz en sortie de mon microcontrôleur ?

    il ne faut pas oublier que des que le flag Timer s'arme,
    il faut quelques cycles pour aller dans le traitement d'interruption
    dans lequel on reinitialise le timer
    Ah ok! Je me souviens maintenant: j'avais voulu évaluer les pics il y a quelques années lorsque le 16F84 était idolâtré et j'avais été étonné du fonctionnement de son timer qu'il fallait recharger à chaque timeout. Il y a pourtant longtemps que les autres fabricants savaient faire de vrais timer avec une vraie période.
    Ayant eu l'occasion de bricoler sur du pic24, j'ai constaté que microchip avait tout de même résolu le problème avec des produits plus récents.

  17. #16
    RISC

    Re : Problème pour générer une fréquence de 40 kHz en sortie de mon microcontrôleur ?

    Salut,
    Les PIC18 possèdent un timer auto-reload (TIMER2) depuis 15 ans ;=)
    Les quelques cycles perdus à recharger une valeur dans un timer ou le faible jitter engendré ne posent pas de PB dans beaucoup d'applications.
    On est parfois obligé "articiellement" de faire varier très légèrement la fréquence pour pouvoir réduire le bruit (EMI) d'une raie dans le spectre .
    Ce phénomène est d'ailleurs courant dans les étages d'entrée des oscillateurs pour les processeurs rapides.
    a+

  18. #17
    paulfjujo

    Re : Problème pour générer une fréquence de 40 kHz en sortie de mon microcontrôleur ?

    bonsoir RISC

    Les PIC18 possèdent un timer auto-reload (TIMER2) depuis 15 ans ;=)
    j'ai pourtant bien relu la doc de PIC18Fx6K22 par exemple et pas de trace d'auto-reload sur timer
    Aurais-tu un lien sur une doc traitant ce cas de figure
    ou un morceau de code ?

    sur le net je ne trouve que le 8051 ou 8052 traitant ce cas..

  19. #18
    RISC

    Re : Problème pour générer une fréquence de 40 kHz en sortie de mon microcontrôleur ?

    Salut Paul,
    Si tu cherches "auto reload" tu ne trouveras pas dans la documentation.
    Dans les PIC18 cette fonction ne se nomme pas de cette manière. Il s'agit plutôt d'un "auto reset" (ma définition perso).
    Le TIMER2, ainsi que d'autres TIMERs dans les PIC18 tels que TIMER4 et TIMER6 quand ils existent (famille PIC18FxxKyy) sont des timers à Reset automatique.
    Ils comptent jusqu'à la valeur programmée dans PR2 / PR4 / PR6. quand cette valeur est atteinte, cela génère une interruption et ce même signal Reset la valeur dans TMR2/TMR4 et TMR6. De cette manière aucun rechargement nécessaire, le timer recommence à compter jusqu'à la valeur PRx.
    a+

  20. #19
    paulfjujo

    Re : Problème pour générer une fréquence de 40 kHz en sortie de mon microcontrôleur ?

    Merci pour l'info,
    je pensais que les timers 2,4,6 etaient plutot dedés à la commande PWM
    que le comptage comme les timers 0 et 1.

    Je penserai donc à les utiliser en comtage, la prochaine fois.

    On en apprend tous les jours sur ce forum !

Discussions similaires

  1. Réponses: 20
    Dernier message: 23/03/2014, 16h46
  2. Générer une fréquence variable ?
    Par invitece78da89 dans le forum Électronique
    Réponses: 37
    Dernier message: 07/06/2012, 18h46
  3. Probleme pour générer un graph sur Matlab
    Par invitee0cc8045 dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 17/12/2011, 00h27
  4. Générer une pwm à fréquence variable
    Par frenchy dans le forum Électronique
    Réponses: 2
    Dernier message: 16/03/2011, 12h20
  5. generer une frequence précise
    Par divide dans le forum Électronique
    Réponses: 25
    Dernier message: 08/03/2008, 18h48
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...