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

Arduino générer une fréquence



  1. #1
    cubitus_54

    Arduino générer une fréquence

    Bonjour,

    Je cherche en utilisant les fonctions PWM à générer une fréquence particulière, par exemple 10kHz.

    Sur les PIC, c'était facile, une valeur du prédiviseur, une valeur pour la période et le rapport cyclique et hop...

    La, sur L'arduino Mega 2560.... je n'arrive qu'à changer le prédiviseur... ce qui fait pas grand choix de fréquence. 31k, 3.9k 490Hz 122Hz et 30Hz

    J'ai un peu cherché sur le NET, on trouve plein de tutos pour changer la fréquence en jouant avec le prédiviseur, mais je n’ai rien trouvé pour ajuster la fréquence...
    je suis en train de demander si c'est possible avec ce type de microcontrôleur....

    Si vous pouvez m'éclairer.

    -----


  2. Publicité
  3. #2
    HAYAC

    Re : Arduino générer une fréquence

    Citation Envoyé par cubitus_54 Voir le message
    je suis en train de demander si c'est possible avec ce type de microcontrôleur....
    Tout (ou presque) est possible lorsque l'on écrit du C correctement,
    Commence par poster ton code, suite à quoi nous taiderons

    Cordialement,

  4. #3
    antek

    Re : Arduino générer une fréquence

    Citation Envoyé par cubitus_54 Voir le message
    Je cherche en utilisant les fonctions PWM à générer une fréquence particulière, par exemple 10kHz.
    Sur les PIC, c'était facile, une valeur du prédiviseur, une valeur pour la période et le rapport cyclique et hop...
    La, sur L'arduino Mega 2560.... je n'arrive qu'à changer le prédiviseur... ce qui fait pas grand choix de fréquence. 31k, 3.9k 490Hz 122Hz et 30Hz
    Sur les PIC on ne peut pas choisir TOUTES les fréquences non plus pour un PWM.

  5. #4
    cubitus_54

    Re : Arduino générer une fréquence

    je n'ai pas essayé sur tous les PIC

    Mais sur ceux que j'ai essayés, fout=Fosc /prescaler/relover
    ça permet pas mal de possibilités.

    Je n'ai pas envie de générer une fréquence d'une façon soft genre : mise à 1 tempo mise à 0 tempo.

    J'aimerai savoir si c'est possible

  6. #5
    HAYAC

    Re : Arduino générer une fréquence

    Quelque soit le MCU, pour des usages spécifiques il faut réécrire ses propres fonctions.
    L'usage du Delay() avec inversion d'état en est un

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

    Re : Arduino générer une fréquence

    Non.....

    Si tu fais un signal rectangulaire avec des tempos, le microcontrôleur ne fait que ça et on ne peu rien faire d'autre....

    Les timers peuvent faire le boulot d'une façon autonome, sur les PIC ça fonctionne, sur AVR. j'ai l'impression que l'on ne peut pas.

  9. Publicité
  10. #7
    antek

    Re : Arduino générer une fréquence

    Citation Envoyé par cubitus_54 Voir le message
    , sur AVR. j'ai l'impression que l'on ne peut pas.
    Tu as la doc du µC ?

  11. #8
    ranarama

    Re : Arduino générer une fréquence

    bsr
    +1 avec Antek. Commence par lire le datasheet. tout est dedans

  12. #9
    cubitus_54

    Re : Arduino générer une fréquence



    On est sur un forum d'entraide.... tu penses m'aider en me disant de lire la doc ? Elle fait 447 pages et en anglais.

    Si vous ne savez pas, ne répondez pas, c'est plus simple que de me dire de voir la doc, non ?

  13. #10
    ranarama

    Re : Arduino générer une fréquence

    Non personne ne t'as demandé de tout lire.
    Et peu importe le nombre de page puisqu'il existe "CTRL+F" pour trouver l'info qu'il te manque.

  14. #11
    cubitus_54

    Re : Arduino générer une fréquence

    bien évidement que j'ai regardé les pages en question.... et si j'avais trouvé je ne serai pas venu demandé un peu d'aide....

  15. #12
    antek

    Re : Arduino générer une fréquence

    Citation Envoyé par cubitus_54 Voir le message
    On est sur un forum d'entraide.... tu penses m'aider en me disant de lire la doc ? Elle fait 447 pages et en anglais.
    Si vous ne savez pas, ne répondez pas, c'est plus simple que de me dire de voir la doc, non ?
    Je ne connais pas la réponse parce que j'ai jamais utilisé AVR.
    Mais si tu avais donné le lien vers la doc j'aurais pu la trouver.

  16. Publicité
  17. #13
    zibuth27

    Re : Arduino générer une fréquence

    hello,

    lors de ma réponse à une demande sur futura sciences (générateur de fréquence pour piloter un moteur synchrone de tourne-disque) j'ai créé rapidement un petit montage

    pour avoir ce signal à fréquence variable, j'ai utilisé une carte arduino pro équipée d'un mega 328p (prix 2$)
    le timer 1 permet un mode de comptage à fréquence variable de zéro à la valeur d'un registre 16 bits : ICR1.
    Cela permet une grande flexibilité (16 bits et des prédiviseurs, pour choisir la fréquence !)
    lorsque le timer1 a bouclé à la fréquence choisie, il génère une interruption
    Cette interruption fait simplement basculer le port T0. Evidemment, il est souhaitable que ce port ne soit pas utilisé à autre chose

    le port T0 sert d'entrée au timer 0 qui peut alors être activé comme PWM à fréquence d'entrée variable

    ce qui fait un programme très simple en c :
    • quelques lignes d'initialisations diverses,
    • deux lignes de code dans le main(),
    • deux interruptions simples



    description dans http://www.hackerschicken.eu/www/ele...ur_DDS_R2R.pdf


    ne reste pus qu'à l'adapter au mega 2560, qui, il me semble, possède des timers et des fonctions identiques !


    saluts

  18. #14
    Pauldair

    Re : Arduino générer une fréquence

    Bonjour,

    Ce que tu cherches est expliqué sur arduino-info, dans l'article: Changing PWM Frequency on the Arduino.

    Cet article fait lui-même référence à l'article de arduino.cc: Secrets of Arduino PWM

  19. #15
    cubitus_54

    Re : Arduino générer une fréquence

    Bonjour,

    Merci zibuth27, je vais regarder cela.

    Pauldair, c'est ce que j'ai constaté...

    La, sur L'arduino Mega 2560.... je n'arrive qu'à changer le prédiviseur... ce qui fait pas grand choix de fréquence. 31k, 3.9k 490Hz 122Hz et 30Hz
    //TCCR1B = TCCR1B & B11111000 | B00000001; // set timer 1 divisor to 1 for PWM frequency of 31372.55 Hz
    //TCCR1B = TCCR1B & B11111000 | B00000010; // set timer 1 divisor to 8 for PWM frequency of 3921.16 Hz
    TCCR1B = TCCR1B & B11111000 | B00000011; // set timer 1 divisor to 64 for PWM frequency of 490.20 Hz (The DEFAULT)
    //TCCR1B = TCCR1B & B11111000 | B00000100; // set timer 1 divisor to 256 for PWM frequency of 122.55 Hz
    //TCCR1B = TCCR1B & B11111000 | B00000101; // set timer 1 divisor to 1024 for PWM frequency of 30.64 Hz

  20. #16
    PA5CAL

    Re : Arduino générer une fréquence

    Bonjour

    Dans la documentation de l'ATmega2560, il est fait référence à deux timers 8 bits (0 et 2) et quatre timers 16 bits (1, 3, 4 et 5).

    Les timers peuvent utiliser des sorties de prédiviseur distinctes (fclk_io, fclk_io/8, fclk_io/64, fclk_io/256, ou fclk_io/1024, avec fclk_io issue du prédiviseur système).

    Chaque timer 8 bits (registre TCNTn avec n=0 ou 2) possède deux comparateurs (registres OCRnA et OCRnB). Chaque timer 16 bits (registre TCNTn avec n=1, 3, 4 ou 5) possède trois comparateurs (registres OCRnA, OCRnB et OCRnC).

    Les comparateurs peuvent chacun générer un signal PWM sur une sortie indépendante (pins OCnA, OCnB et éventuellement OCnC), sauf OC0A et OC1C qui partagent la même sortie. Les premiers comparateurs (registres OCRnA) peuvent être utilisés pour réduire l'amplitude de comptage de leur timer respectif afin d'en augmenter la fréquence (mode CTC "Clear Timer on Compare Match").

    L'ATmega2560 peut ainsi générer au maximum 15 signaux PWM, répartis en six groupes indépendants fonctionnant chacun à leur propre fréquence. Mais un signal PWM doit être supprimé quand on souhaite régler la fréquence du groupe à une valeur plus faible que le maximum prévu par le prédiviseur (on dispose alors au minimum de 10 signaux PWM).

    Par ailleurs, par défaut le logiciel Arduino gère déjà les timers, pour le comptage du temps et les fonctions de délai (sur le timer 0) et pour la génération de signaux (fonctions analogRead() et tone(), notamment). La génération de ses propres signaux impose donc certaines restrictions quand à la compatibilité avec cet environnement.


    Je ne vais pas recopier ici les chapitres de la datasheet de l'ATmega2560 spécifiques aux timers et au prédiviseur qui en expliquent le fonctionnement en détail, ni le code d'exemples pour programmer une PWM, qu'on peut trouver dans le code source Arduino et plus particulièrement dans la fonction init() dans le fichier wiring.c, la fonction analogRead() dans le fichier wiring_analog.c et la fonction toneBegin() dans le fichier Tone.cpp (voir dans le dossier /hardware/arduino/avr/cores/arduino/ ).

    Tout ça pour dire qu'il est donc tout-à-fait possible de générer des signaux PWM à la fréquence qu'on souhaite, moyennant quelques contraintes.
    Dernière modification par PA5CAL ; 28/07/2015 à 08h28.

  21. #17
    PA5CAL

    Re : Arduino générer une fréquence

    Oups... il faut lire analogWrite() et non pas analogRead().

  22. #18
    cubitus_54

    Re : Arduino générer une fréquence

    Bonjour, Pascal

    Sans abuser de toi, tu pourrais me donner un exemple, valeur à mettre dans les registres pour obtenir une fréquence.

    Merci

  23. Publicité
  24. #19
    PA5CAL

    Re : Arduino générer une fréquence

    J'ai oublié de préciser que si l'on ne prévoyait pas de moduler la fréquence, il était aussi possible (sur les timers 16 bits uniquement), de libérer le premier comparateur de chaque groupe et d'utiliser le registre ICRn (non bufferisé) à la place. Dans ces conditions, le nombre minimum de sorties PWM peut passer à 14.


    Citation Envoyé par cubitus_54 Voir le message
    Sans abuser de toi, tu pourrais me donner un exemple, valeur à mettre dans les registres pour obtenir une fréquence.
    Les valeurs à mettre dans les registres dépendent de ce que tu souhaites faire (fréquence, résolution, symétrie et polarité du signal, mode de modification des réglages). Ce qui suit ne va donc pas forcément convenir à ton application.


    Si l'on utilise un timer 16 bits n et son comparateur X, alors les bits CSn1:0 fixent le prédiviseur du timer, les bits WGMn3:0 fixent son mode de fonctionnement, le registre OCRnA ou ICRn fixe sa fréquence, le registre OCRnX fixe le rapport cyclique de la sortie et les bits COMnX1:0 fixent sa polarité.

    Les modes permettant de régler la fréquence sont 4, 8, 9, 10, 11, 12, 14 et 15. La formule de calcul de la fréquence dépend du mode choisi.

    Les bits COMnX1:0 et WGMn1:0 sont dans le registre TCCRnA. Les bits WGMn3:2 et CSn2:0 sont dans le registre TCCRnB.

    La pin utilisée doit être configurée en sortie via son registre DDR.


    Par exemple, pour programmer un signal PWM normal (lent), symétrique et non inversé sur la sortie OC1B/PB6 (timer 1/comparateur B) correspondant à la pin 12 de l'Arduino Mega, les valeurs peuvent être :
    - configuration sortie : DDRB[6] = 1
    - prédiviseur : CS1[2:0] = 1 (f/1)
    - mode : WGM1[3:0] = 8 ("PWM, Phase and Frequency Correct" avec ICR1)
    - fréquence : ICR1 = 800 (fout = 16MHz/(2·prédiviseur·ICR1) = 10 kHz)
    - polarité : COM1B[1:0] = 2 (signal non inversé)
    - rapport cyclique : OCR1B (relativement à la valeur de ICR1)

    Code:
    void setup() {
      // OC1A et OC1C inutilisées
      unsigned char com1A = 0;
      unsigned char com1C = 0;
      
      // 10 kHz sur sortie 12 Mega (OC1B/PB6)
      unsigned char cs1   = 1;   // prédiviseur = f/1
      unsigned char mode1 = 8;   // mode = 8
      unsigned int  icr1  = 800; // fréquence = 10 kHz
      unsigned char com1B = 2;   // signal non inversé
      unsigned int  ocr1B = 400; // rapport cyclique rel. icr1
    
      DDRB |= 1<<6;
      TCCR1A = (com1A<<6)|(com1B<<4)|(com1C<<2)|(mode1&3);
      TCCR1B = ((mode1>>2)<<3)|cs1;
      ICR1 = icr1;
      OCR1B = ocr1B;
    }
    
    void loop() {
    }
    Dernière modification par PA5CAL ; 28/07/2015 à 12h28.

  25. #20
    cubitus_54

    Re : Arduino générer une fréquence

    Salut Pascal,

    Une bonne explication et de la compétence !

    Ça fonctionne très bien.


    Bravo et toutes mes félicitations !

  26. #21
    ranarama

    Re : Arduino générer une fréquence

    +1 avec cubitus_54

    Encore une impressionnante intervention de Sir PA5CAL en forme de cours détaillée à copier/coller et à garder à vie précieusement.


Sur le même thème :

Discussions similaires

  1. montage pour générer une fréquence de 440hz
    Par Akaito dans le forum Électronique
    Réponses: 21
    Dernier message: 30/03/2015, 21h45
  2. Réponses: 18
    Dernier message: 11/05/2014, 14h47
  3. Générer une fréquence variable ?
    Par derbi31530 dans le forum Électronique
    Réponses: 37
    Dernier message: 07/06/2012, 18h46
  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