Discussions au sujet de NI LabVIEW

annuler
Affichage des résultats de 
Rechercher plutôt 
Vouliez-vous dire : 

Génération de signal carré à fréquence variable

Résolu !
Accéder à la solution

Bonjour,
Cela fait deux jours que je bloque sur un problème, je me tourne donc vers le forum pour trouver une solution.

Contexte : J’utilise un châssis cDAQ-9188, avec un module d’écriture analogique (AO) NI-9264, et un module de Communication CAN XNET NI-9862. Le module d’écriture analogique est câblé vers un calculateur embarqué (ECU), pour le commander, à l’aide d’un signal carré 0-5 V qui varie en fréquence (signal PWM).
L’ECU lis le signal carré, et extrait sa fréquence. Cette fréquence lue par l’ECU est ensuite transmise par l’ECU sur le BUS CAN.
J’utilise LabView 2014, et DAQmx v14.

Mon problème : Je veux générer le signal carré avec une fréquence que je pourrai contrôler en face avant de mon VI. La gamme de fréquence s’étend de 0 Hz à 1600 Hz.
J’utilise donc le VI DAQmx Write, sur une tâche AO Tension, dans une boucle while, avec le VI Générateur de fonction élémentaire qui me génère mon signal à chaque itération.
En guise d’indicateur, je lis le signal sur le bus CAN et je l’affiche sur un Graphe XY qui défile avec le temps (voir VI ci-joint).

Comme vous pourrez le voir sur le screenshot n°1, mes points de mesure de la fréquence varient entre deux valeurs, alors que ma commande de fréquence est fixe … A noter que plus on se rapproche d’une commande en fréquence haute, plus l’écart est grand.
Je précise que l'ECU lis parfaitement la fréquence et retourne une seule valeur de fréquence constante quand j'utilise un GBF pour générer mon signal carré.

 

Je pense que ceci vient du fait de l’échantillonnage : certaines fréquences ne peuvent pas être échantillonnées correctement suivant la fréquence d’échantillonnage.
Exemple : Echantillonnage à 10 Khz donc chaque échantillon sera séparé par un temps dt = 0.1 ms. Pour un signal à 1.6 Khz, donc de période T = 0.625 ms, j’aurais 6 échantillons par période (3 échantillon à 5 V et 3 à 0 V), et j’aurais donc 0.025 ms qui « ne seront pas échantillonnés ».

Est-ce que c’est bien la source de mon problème ici ?

En première solution, je me suis dit que j’allais échantillonner à une fréquence d’échantillonnage Fe = 10 * f, avec f la fréquence voulue de mon signal carré, ce qui m’assurera toujours un échantillonnage parfait. En appliquant ce principe je réduis très significativement l’écart de fréquence lu sur mon graphe (voir screenshot 2).
Evidemment, faire varier ma fréquence d’échantillonnage me pose un autre problème : quand je dois générer une fréquence basse, ma fréquence d’échantillonnage devient également basse, et la génération prend du temps. Ainsi je perds en réactivité, il faut attendre plusieurs secondes pour qu’une nouvelle commande de fréquence soit prise en compte, et ceci ne sera pas compatible pour la suite de mon projet.

Avez vous des piste à me proposer pour corriger la génération du signal carré tout en gardant un temps de réponse < 0.5 seconde ?
 

Merci d'avance.

Tout télécharger
0 Compliments
Message 1 sur 5
5 625 Visites

Bonjour,

 

Il y a un premier détail qui me choque : pourquoi générer un signal carré à l'aide d'une AO ? Pour générer un signal de 5V entre 0 et 5V, soit du TTL, il doit y avoir de quoi faire au catalogue NI. Une sortie numérique serait plus approprié, en se basant sur une tâche compteur, en génération de fréquence.

 

Un premier moyen de "repousser le tas de sable" en analogique, si le problème est effectivement lié à l'échantillonnage, serait d'exploiter le module NI-9264 à sa pleine vitesse de mise à jour de la sortie analogique, 25kS/s. Mais cela ne suffira peut-être pas...

 

Cordialement,

 

0 Compliments
Message 2 sur 5
5 599 Visites

Bonjour,

Merci pour votre réponse.

J'ai effectivement à ma disposition d'autre module que des AO. J'ai un DO NI-9476, mais il ne peut pas générer de signal à 5 V (6 V mini), et encore moins être utilisé pour une tâche de type compteur.
Coté catalogue NI, j'imagine bien qu'il y a des modules plus performant et plus adéquat, mais j'aimerais bien éviter de devoir acheter d'autres modules.

Pouvez vous me confirmer que 25 KSample / sec équivaut à 25 Khz d'échantillonnage ?
Si c'est le cas, même à Fe = 25 Khz, le problème est le même. Cela me fait penser que j'ai un module NI-9263 qui peut monter jusqu'à 100 KS/s, je vais essayer de l'utiliser à la place du NI-9476.

Pour revenir sur l'histoire du ratio Fe / f (qui conduisait à une génération parfaite), j'ai pensé qu'en augmentant la valeur du ratio en approchant des basses fréquences, je gagnerai en réactivité. Seulement, il faut pouvoir modifier ce ratio seulement quand les derniers echantillons prévue pour le ratio Fe / f précédent sont généré (sinon j'ai un offset en sortie, le temps que ces derniers échantillons soient générés), chose que je n'ai pas réussi à faire. Est-il possible de savoir quand les échantillons de l'itération précédente ont été générés ?

Merci.

0 Compliments
Message 3 sur 5
5 594 Visites
Solution
Accepté par l'auteur du sujet Popolaresco

Pour le 25kS/s, oui c'est équivalent. Je parle généralement en échantillons par secondes (S/s) quand il s'agit d'un échantillonnage, et d'une fréquence lorsque je parle de l'horloge d'échantillonnage.

 

Pour la génération continue, sans regénération, le temps de "latence", c'est à dire de consommation du buffer passé vers la fonction DAQmx Write est directement liée à la taille du buffer en question. Si j'envoie 1000 échantillons à 1kS/s, il faudra 1 seconde à la carte pour le générer. A la même fréquence d'échantillonnage, si j'utilise un buffer de 10 échantillons, 10ms suffiront. En contrepartie, il faudra que je renouvelle mon buffer toute les 10ms.

 

Dans la mesure où la fonction de génération conserve la phase du signal généré à l'itération précédente, seule la finesse de l'échantillonnage va jouer sur la fréquence vue par le calculateur. En moyenne, la fréquence sera bonne, même si la granularité (ration Fs / f) ne permet pas un signal propre. Le bout de code suivant permet de le faire apparaître.

 

SuareWave.png

 

De même, pour un signal relativement lent par rapport à l'échantillonnage, tant que la phase est maintenue, on doit s'en sortir, y compris avec de petits buffer (à l'échelle d'un signal "lent"). On va générer plusieurs buffers ne contenant que des 0, puis un avec la transition 0 - 5V, des buffers à 5V, etc... Cette approche devrait permettre de rester réactif. Reste à trouver le bon dosage entre taille de buffer (fixe) et temps de boucle.

0 Compliments
Message 4 sur 5
5 588 Visites

Bonjour,

Merci pour toutes ces explications.

Finalement j'ai résolu mon problème en utilisant le module NI-9263 qui peut échantillonner jusqu'à 100 KS/s. L'augmentation de la fréquence d'échantillonnage permet bien de réduire les écarts de fréquence observé, mais ça n'a pas suffit à les rendre acceptable.

Pour réduire au maximum ces écarts, la fréquence du signal a généré est arrondie à une fréquence dont la période est finie à 1e-5 près, ce qui correspond à la précision de l'échantillonnage (qui se fait à 100 Khz). On obtient ainsi une fréquences en sortie qui ne varient pas ou très peu.
Le bémol de cette solution : toute les fréquences d'entrées ne peuvent être générées et on a une discrétisation des fréquences d'entrées.

Cordialement.

0 Compliments
Message 5 sur 5
5 552 Visites