le 07-18-2011 09:23 AM
Bonjour,
J'essaie de réaliser un programme simple constitué de deux boucles while. l'une sert à générer un signal sinusoïdale, et l'autre à le lire.
Lorsque je réalise l'écriture et la lecture dans une seul boucle while, ça marche à peut près, j'obtiens un sinus propre (1ère partie du signal sur l'image), mais par contre je ne peux pas programmer une fréquence d'échantillonnage et un nombre d'échantillons important sur ma génération de signal. je me suis donc limité à :
Fréquence d'éch. = 500Hz
Nombre d'éch. 1
Si j'augmente ces deux paramètres, le "raccordement" d'une période à l'autre de ma sinusoïde n'est pas bon lors de la génération. J'ai donc voulu séparer l'écriture et la lecture en deux boucles indépendantes pour régler ce problème.
Cependant, lorsque je sépare la lecture et l'écriture en 2 boucles, j'obtiens ce qui se trouve sur la partie droite du graphique dans l'image jointe. Je n'ai pourtant changé aucun paramètres.
J'ai regardé si les deux boucles s'exécutaient correctement en visualisant le "i", et je me suis aperçu que la boucle d'écriture ne s'exécutait que très peu de fois (d'où le profil saccade de mon sinus acquis).
Pouvez vous m'indiquer pourquoi cela ne fonctionne pas?
Cordialement
le 07-19-2011 02:40 AM
Bonjour
Remarque : Votre image est trops réduite pour être lisible. Utiliser plustot au autre format que jpg et ne la réduisez pas.
Plusieurs idées me viennent à l'esprit :
- Votre carte d'acquisition permet-elle de réaliser des acquisitions et des générations en simultanée ?
- Lors des générations avez vous des buffers tournants dans la carte (c'est rarement le cas) ?
si ce n'est pas le cas, durant le transfert des nouvelles données à générer, la génération peut s'arrpeter.
Faite un test de génération seul puis de lecture seul. Si les deux sont fluides, cela signifie que c'est l'inerraction des deux code qui pose problème.
Qu'utilisez vous comme matériel ?
Salutations
EricC
le 07-19-2011 06:57 AM
Bonjour,
Je ne sais pas ce qu'est un buffer tournant, mais par contre j'ai testé les boucles séparément et ça fonctionne.
Il me semble pourtant que labview permet d'exécuter deux boucles while en même temps sans qu'elles interfèrent entre elles.
J'utilise les cartes NI 9263 et NI 9215 montées sur un chassis pouvant accueillir 4 cartes.
Cordialement,
Teka
le 07-20-2011 01:23 AM
Bonjour,
Je pense avoir résolu une partie du problème.
J'ai paramétré un nombre d'échantillon sur le bloc de lecture analogique et le signal sinusoïdal généré est devenu lise.
Cependant, sa fréquence ne correspond pas à ce que j'ai paramétré sur le bloc de génération de signal.
Cela vient-il du fait que la carte d'acquisition est ralentie par un trop grand nombre d'échantillons demandés?
Cordialement,
Teka
le 07-20-2011 02:22 AM
Bonjour
En regardant de plus prés, je me rend compte que lors de la génération des points à écrire, vous simuler le temps d'acquisition
Or cela implique que pour un sinus de 5s, il vous faudra 5s pour la générer.
(Option Simuler les temps s'acquisition dans Informations temporelles)
(A)
De plus vous ecriver les données sans attendre que la génération soient terminées.
Du coup je me pose une question :
- Est ce que les nouvelles données se mettent à la suite des anciennes ou écrase-t-elles les valeurs actelles ?
Un moyen de vérifier cela serait de réaliser une génération de 1s (par exemple), d'attendre qu'elle soit terminée, d'attendre volontairement 200ms puis de recommencer.
Si vous avez une belle sinus, un trou, un belle sinus, ... cela signifie que vos nouvelles données écrasent les anciennes et que votre carte de génération ne possède qu'un seul buffer de sortie.
Pour faire une génération continue d'un signal quelconque il faut un buffer de génération et un second buffeur dans lequelle vous écriver pendant la génération. Lorsque le permier buffer est terminée, la carte doit automatiquement swapper les buffers.
Sans cela vous aurez toujours une rupure de continuité entre deux émissions de données.
Pour faire un génération continue d'un signal periodique, il faut pourvoir émettre tout le signal et dire à la carte répéter à l'infinie (cela est possible mais je ne me souviens plus comment)
Losque les paramètres changes, ont fait stop generation, émission nouveau parametre, start génération.
Hélas cela implique une discontinuité
Je ne pense pas que votre code pose beaucoup de problème (à part la vérificaiton du point (A) ), par contre il faudrait controler les spécifications de votre matériel (carte d'écriture) pour être certain de pouvoir faire ce que vous voullez !
salutations
EricC
le 07-20-2011 06:50 AM
Bonjour,
J'ai effectué les tests en question, et je vous indique qu'il n'y a pas de trou et que le signal est continu.
Je pense que la fréquence est affectée par un trop grand nombre d'échantillons demandés à une fréquence trop importante. Ainsi, la carte n'arrive pas à suivre.
Je vais donc rester dans des régimes compatibles avec mon matériel.
J'ai maintenant un nouveau problème.
Lorsque je fais l'acquisition de mon sinus par la carte d'acquisition, celui-ci est saccadé.
J'ai alors vérifié le signal à l'aide d'un oscilloscope, et celui-ci était propre.
J'en déduis donc que le problème se situe au niveau de mes cartes une nouvelle fois.
J'ai essayé de réduire le nombre d'échantillons et la fréquence d'échantillonnage mais rien n'y fait.
Avez-vous déjà rencontré un problème similaire?
Merci de votre aide.
Cordialement,
Teka
le 07-21-2011 05:18 AM
Bonjour,
L'acquisition n'est pas le problème. Changer la fréquence d'échantillonnage comme le nombre d'échantillon n'aura pas d'effet.
Attention à bien respecter Shannon quand même.
Autre conseil (qui n'est pas une règle mais qui s trouve être bien adapté dans 90% des cas), respectez l'égalité suivante : fréquence d'écahntillonnage = 10 x nombre d'échantillon.
Revenons à votre problème.
Essayez de contruire votre tâche de génération de la manière suivante :
1 - Créez une tâche de génération NI-DAQmx dans MAX.
2 - Glissez-déposez cette tâche dans votre diagramme (je commencerai par un VI vide de sorte à ce que l'acquisition et la génération soient dans 2 VIs bien distinct)
3 - Faites un clic droit sur la constante tâche du diagramme nouvellement créée et choisissez "Générez le code"->"Configuration et Exemples"
Vous aurez un VI de génération pré-construit qui génerera une rampe entre les valeurs min et max que vous avez défini dans la configuration. Il ne vous restera plus qu'à modifier le VI indiqué pour obtenir le sinus que vous voulez.
Je vous conseille pour cela de vous inspirer des exemples LabVIEW. En effet, le VI express que vous choisissez n'est pas très adapté puisque sa fonction première est de simuler un signal, pas d'en créer un dans le but de le faire générer par une carte. De plus, vous l'avez intégré dans votre boucle, ce qui fait que les données sont générées à chaque tour de boucle. D'une part on perd du temps, d'autre part, ça ne sert à rien puisque c'est le même motif.
Cordialement
Jean-Philippe C.
National Instruments France
le 07-26-2011 05:48 AM
Bonjour,
J'ai changé le Vi de simulation par un de génération, ce qui a réglé pas mal de problèmes.
Merci pour votre aide et bonne continuation.
Teka