Aller au contenu


Photo
- - - - -

Signal carré 30kHz Arduino


14 réponses à ce sujet

#1 Sani300

Sani300

    Habitué

  • Membres
  • PipPip
  • 150 messages
  • Gender:Male

Posté 05 octobre 2011 - 06:48

Bonjour,

Je voulais realiser un signal carré d'amplitude 5V et de frequence 30kHz avec ma carte arduino mais je n'ai jamais reussi a le faire.
J'avais calculé que la periode devait etre de 33.3us et de demi periode 16,6s

J'ai donc fait un programme comme ça :
int valeur = 0;

void setup()
{
  pinMode(9, OUTPUT);
}

void loop()
{
  do
  {
  valeur = 255; 
  digitalWrite(9,HIGH);
  delay(16000);
  valeur = 0;
  digitalWrite(9,LOW);
  delay(16000);
  }while(160);
}

Mais je n'arrive pas a trouver la bonne valeur du delay pour avoir la bonne frequence quelqu'un a une idée?

Sani300

#2 Microrupteurman

Microrupteurman

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 2 210 messages
  • Gender:Male
  • Location:Aquitaine,Gironde

Posté 05 octobre 2011 - 07:04

Salut, déjà tu peut enlever, int valeur =0; valeur = 255 et valeur =0, ca ne sert a rien ici.

 
Page Facebook : https://www.facebook...appartelier2.0/
Page Twitter :  https://twitter.com/2Appartelier (bateau seulement)
Boutique Robot-Maker : https://www.robot-ma...er-20/produits/

Besoin d'une impression 3D grand format ? Contactez moi !
 


#3 Sani300

Sani300

    Habitué

  • Membres
  • PipPip
  • 150 messages
  • Gender:Male

Posté 05 octobre 2011 - 07:13

Oui je sais c'est parce que je l'avais fait en analogWrite juste avant...

#4 Luj

Luj

    Habitué

  • Membres
  • PipPip
  • 295 messages
  • Gender:Not Telling

Posté 05 octobre 2011 - 08:08

delay prend des millisecondes, donc delay(16000) c'est 16 secondes... pour une fréquence supérieure au Hertz (1/s) ça ne va pas du tout.

30 kHz = 30 000 Hz = 30 000 changements par seconde, soit 1 changement toutes les 33 microsecondes, et donc effectivement toutes les 16 microsecondes un changement de niveau.

Ce n'est donc pas delay (millisecondes) que tu dois utiliser mais le délai des microsecondes, soit DelayMicroseconds : http://www.arduino.c...layMicroseconds

Ton code devient donc :

void loop()
{
   // phase haute
   digitalWrite(9,HIGH);
   delayMicroseconds(16);
   // phase basse
   digitalWrite(9,LOW);
   delayMicroseconds(16);
}

Ce qui fera 31,25 kHz

#5 SRWieZ

SRWieZ

    Membre

  • Membres
  • PipPip
  • 231 messages
  • Gender:Male
  • Location:Evreux, Haute-Normandie, France

Posté 05 octobre 2011 - 08:38

Très instructif ce topic, merci pour cette explication Luj, ça va me resservir. :)

#6 Sani300

Sani300

    Habitué

  • Membres
  • PipPip
  • 150 messages
  • Gender:Male

Posté 05 octobre 2011 - 09:13

Merci pour ta réponse, je viens d'essayé mais je ne comprends pas quand je met 16 j'ai 24khz... mais si je met 12 je me retrouve avec 30.5kHz... pourquoi? je ne comprends pas...

#7 Mic*

Mic*

    Habitué

  • Membres
  • PipPip
  • 232 messages
  • Gender:Male
  • Location:Sarthe

Posté 05 octobre 2011 - 09:29

Bonjour,
Il faut aussi compter le temps d'exécution de tes instruction, pour cela il faut voir le programme désassemblé,
tu divise ta fréquence quartz par 4 avec un quartz de 4 MHz ça donne 1µS par instruction et 2µS pour les instructions de branchement genre GOTO ou GOSUB.
C'est une piste pour vraiment faire de bons calculs, il faut lire le DataSheet de ton microcontrôleur.
A+

#8 Luj

Luj

    Habitué

  • Membres
  • PipPip
  • 295 messages
  • Gender:Not Telling

Posté 05 octobre 2011 - 09:30

Merci pour ta réponse, je viens d'essayé mais je ne comprends pas quand je met 16 j'ai 24khz... mais si je met 12 je me retrouve avec 30.5kHz... pourquoi? je ne comprends pas...


L'appel à la fonction "delayMicroseconds" prends du temps en plus. Regarde mon exemple sur l'optimisation de code où j'avais mesuré toute la consommation de temps par les appels de fonction (jusqu'à 50 microsecondes) : http://www.pobot.org...on-de-code.html

Le dernier exemple est parfaitement adapté à ce que tu constates : j'avais 9 µs mesuré au lieu de 5 µs théorique, soit les 4 µs qui te manquent aussi :)

(je viens de voir le message de Mic* : je pense que tu parles d'un PIC pour diviser par quatre la fréquence. Sur un AVR comme le µC de l'Arduino et avec un quartz à 16 MHz, chaque coup d'horloge dure 62.5 nanoseconde, et une instruction "set bit" ou "clear bit" prenant deux tops d'horloge, cela fait seulement 0,125 µs pour ces instructions. C'est donc bien les appels de fonction qui prennent ces 4 microsecondes perdues).

#9 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 05 octobre 2011 - 09:41

A potasser : Fréquence.

Formule importante : Image IPB

Quand tu mets 16µs d'alternance haute et 16µs d'alternance basse, tu as une période ( T ) de 32µs.
f = 1 / T = 1 / (32*10^[-6]) = 31250 Hz = 31,25kHz.

Si tu mets 12µs, tu auras :
f = 1 / T= 1 / (24*10^[-6]) = 41666,66...Hz = 41,7kHz

Et ainsi de suite.


[Edit : Ah, en effet, les instructions prennent un certain temps à s'exécuter, c'est clair. Je n'y avais même pas pensé. ^^'

Esprit
*Rêve d'en caser un dans un robot*


#10 Luj

Luj

    Habitué

  • Membres
  • PipPip
  • 295 messages
  • Gender:Not Telling

Posté 05 octobre 2011 - 09:59

[Edit : Ah, en effet, les instructions prennent un certain temps à s'exécuter, c'est clair. Je n'y avais même pas pensé. ^^'


Non, les appels de fonctions surtout. C'est pour ça qu'utiliser une API comme Arduino c'est sympa, mais quand on veut faire des choses précises ou rapides comme générer un signal de plusieurs kHz il faut revenir aux fondamentaux du micro-contrôleur utilisé.

Idem pour les boucles "for", à bannir dès que possible.

#11 David_CH

David_CH

    Membre

  • Membres
  • 19 messages

Posté 06 octobre 2011 - 04:45

C'est pour ça qu'utiliser une API comme Arduino c'est sympa, mais quand on veut faire des choses précises ou rapides comme générer un signal de plusieurs kHz il faut


Je cherche un remplaçant à cet IDE, je ne le trouve pas pratique dès qu'on fait des projets plus sérieux / ambitieux, est-ce que quelqu'un utilise Eclipse ou AVR Studio? Je n'arrive pas à les faire fonctionner correctement malgré les divers tuto trouvé sur le net. Ce que je cherche avant tout est un IDE avec un debugger car il faut l'avouer, ça simplifie la vie quand le programme ne marche pas :wub:

#12 Luj

Luj

    Habitué

  • Membres
  • PipPip
  • 295 messages
  • Gender:Not Telling

Posté 06 octobre 2011 - 05:22

Tu veux débugger avec quoi : jtag ?

#13 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 06 octobre 2011 - 05:33

Non, les appels de fonctions surtout. C'est pour ça qu'utiliser une API comme Arduino c'est sympa, mais quand on veut faire des choses précises ou rapides comme générer un signal de plusieurs kHz il faut revenir aux fondamentaux du micro-contrôleur utilisé.

Idem pour les boucles "for", à bannir dès que possible.


Merci pour ces explications, je pense que je ne m'étais pas encore bien rendu compte de l'importance de tout ça. Il faut dire qu'on ne cherche pas tous les jours à faire des signaux de plusieurs kHz.

Quand tu dis qu'il faut bannir les boucles "for", c'est pourquoi ? Parce qu'elles font "perdre" beaucoup de temps ?


Pour David_CH, regarde du côté du magasine Open Silicium (n°2). Ils ont fait un très bon article sur l'arduino et sur comment se passer de l'environement de développement classique.

Esprit
*Rêve d'en caser un dans un robot*


#14 Luj

Luj

    Habitué

  • Membres
  • PipPip
  • 295 messages
  • Gender:Not Telling

Posté 06 octobre 2011 - 05:44

Lire mon article cité plus haut. On passe de 5 us à 65 us pour le même résultat car le micro enregistre l'état courant à chaque itération. Et le restitue à la fin d'où la symétrie du chronogramme

#15 David_CH

David_CH

    Membre

  • Membres
  • 19 messages

Posté 06 octobre 2011 - 10:24

Oui un jtag pourquoi pas, je ne sais pas trop avec quoi on peut debuger mise à part ça?



Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users