J'aimerais faire a partir d'un arduino un comparateur de phase. Pour cela il faudrait que je puisse multiplier deux signaux sinusoïdaux, u(t)=[V1*sin(wt)V2sin(wt+phi)].
Il me semble qu'il soit possible de traiter les deux signaux d entrer en les connectant aux ports PWM.
Cela est-il possible ? Si oui, suffit-il de multiplier les deux variables ?
Je ne peux pas t'aider, mais je peux quand même te dire que les PWM s utilisent UNIQUEMENT en sortie,
Pour des variables analogique il n'y a que les entrées analogique qui peuvent être utilisés. A0 à A5 sur le uno
I've deleted/merged your other cross-post(s) @HardOuno.
Cross posting is against the rules of the forum. The reason is that duplicate posts can waste the time of the people trying to help. Someone might spend 15 minutes (or more) writing a detailed answer on this topic, without knowing that someone else already did the same in the other topic.
Repeated cross posting will result in a suspension from the forum.
In the future, please take some time to pick the forum board that best suits the topic of your question and then only post once to that forum board. This is basic forum etiquette, as explained in the sticky "How to use this forum - please read." post you will find at the top of every forum board. It contains a lot of other useful information. Please read it.
Le produit de deux signaux sinusoïdaux à la même fréquence se linéarise en deux composantes :
L’une à la fréquence double
L’autre continue, dépendant directement du déphasage. Elle peut être récupérée grâce à un simple filtre passe bas (une résistance et un condensateur). Par contre la tension après le filtre sera proportionnelle à cette composante et non la composante directement
Après le filtre passe bas : u = Q * 1/2 V1 V2 cos(phi)
Maintenant! As tu réussi à récupérer le produit de tes deux tensions ? Il existe des circuits intégrés qui le font. Mais il y a sans doute d’autres methodes.
Pour ceux qui voudraient faire de l'acquisition/traitement de signal avec un Arduino, ne pas oublier ceci:
les entrées analogiques n'enregistrent que les tensions positives. Sur un signal à base de sinusoïdes, on pert toute une moitié du signal (à moins de le décaler électroniquement). On peut encore en tirer des infos, mais...
le fréquence d'échantillonage n'est pas connue, et rien ne dit qu'elle soit constante (que fait le proc. en dehors de loop() ?)
Or toute la théorie du signal échantilloné se base sur une fréquence constante et connue. Programmer un filtre numérique dans ces conditions peut être assez fantaisiste.
Y' a pas de mémoire ! (ou si peu)
Maintenant on peut toujours calculer une valeur efficace et la comparer à un seuil ajusté par essais. Mais faut renoncer à ce qui est pointu.
Sur un signal à base de sinusoïdes, on pert toute une moitié du signal (à moins de le décaler électroniquement).
On ne fait pas que perdre la moitié du signal, on peut détruire le microcontroleur si on applique une tension négative de plus 0,5V par rapport à la masse. Cette valeur est tirée de la datasheet des microcontroleurs Atmel avr.
le fréquence d'échantillonage n'est pas connue, et rien ne dit qu'elle soit constante
Elle est parfaitement connue, voir fichier Arduino.h et le code de la fonction init(), et constante.
Le convertisseur analogique digital (CAN) est constitué par une zone du silcium située part de la zone pour la programmation. Cette zone du CAN est de l'électronique numérique pure et une fois lancé le CAN est totalement indépendant du programme : le programme et la liaison série, le SPI, l4I2C, le CAN, etc ne se perturbent pas.
La configuration arduino faite dans la fonction init() qui est lancée au démarage du micro est très conservatrice.
Sans bien sûr pouvoir faire des miracles avec un micro 8bit, 16 MHz d'horloge, il est possible d'obtenir de meilleures performances à condition de lire la datasheet du microcontroleur et de bien respecter les mises en garde de la datasheet, principalement sur l'impédance de sortie de la source à mesurer.
Le véritable programme qui est transmis au compilateur ne se limite pas à setup() et loop().
C'est un vrai fichier C/C++ avec une fonction main() plus la configuration du micro à la sauce arduino.
Le code de la fonction init() se trouve dans les répertoires de l'IDE.
Ceci dit on ne sait toujours pas ce que veux faire l'auteur de la question.
68tjs:
Elle est parfaitement connue, voir fichier Arduino.h et le code de la fonction init(), et constante.
Et elle vaut ?
(rien trouvé dans Arduino.h, et pas pu trouver la fonction init() )
A te lire, on dirait que le CAN peut marcher seul (à l'instar d'une carte son sur PC), c-à-d déposer en mémoire des échantillons à intervalles réguliers, sans intervention du CPU.
Si c'est bien ça, je le découvre, et trouve que ça mériterait une documentation plus apparente.
Si ce n'est pas le cas, il faut faire une boucle et y invoquer analogRead(). J'imagine que les gens qui viennent ici demander de l'aide font cela.
Et donc le code compte. A la fois pour la fréquence, et pour la régularité.
le fréquence d'échantillonage n'est pas connue, et rien ne dit qu'elle soit constante (que fait le proc. en dehors de loop() ?)
Bien sûr que la programmation intervient ne serait-ce que pour lancer une acquisition, mais le CAN une fois lancé tourne tout seul sans être influencé par la programmation et c'est fait exprès parce que, a technologie silicium égale, l'électronique numérique sera toujours plus rapide que la programmation : en électronique numérique on peut sans aucune difficulté faire plusieurs opération en parallèle, en programmation il faut tout mettre en série.
Une fois l'acquisition terminée elle est récupérée par le programme.
Il faut lire la datasheet du microcontroleur, tout y est expliqué et tout se gère par analogRead() NON, tout ce gère par les registres, analogRead ne fait que gérer les registres à ta place.
Je suis d'accord que la documentation arduino est non seulement indigente mais aussi malhonnête : elle cherche à faire croire qu'en dehors d'arduino point de salut, Je suis même persuadé que des utilisateurs arduino pensent que sans arduino la programmation des micros est impossible, il y en a aussi qui pensent que c'est arduino qui fait le microcontrôleur..
Emplacement du fichier init():
Son prototype de fonction est défini dans Arduino.h à la ligne 128, c'est donc qu'il existe toujours.
arduino-1.8.10/hardware/arduino/avr/cores/arduino/Arduino.h
S'il n’apparaît pas en tant que nom de fichier dans la liste des fonctions et classes de l'IDE Arduino c'est qu'il est défini à l'intérieur d'un autre fichier.
Si on se rappelle que l'IDE arduino n'est au départ qu'une simple copie de l'IDE Wiring et qu'on regarde la liste des fichiers dont le nom commence soit par un W soit par wiring on trouve un fichier wiring.c à l'intérieur duquel on trouve les fonctions de temps (delay, millis, etc) et la fonction init().
Alors bien sûr l'exploiter ce n'est plus de l' "Arduino finger in the nose". Lecture de la datasheet obligatoire.
Mais le microcontrôleur peut faire plus que ce qu'en fait Arduino avec ses fonctions "ceinture plus bretelles".
A te lire, on dirait que le CAN peut marcher seul (à l'instar d'une carte son sur PC), c-à-d déposer en mémoire des échantillons à intervalles réguliers, sans intervention du CPU.
Pas en mémoire mais dans un registre de l'ADC.
L'horloge de l'ADC est fixée par défaut à 125KHz par le code ARDUINO, mais on peut l'augmenter à 500KHz et le faire tourner en free-running.
Ensuite le code de analogRead() ne s'exécute pas à la vitesse de la lumière, et elle reconfigure les registres à chaque appel. La vitesse d'acquisition par défaut est d'environ 9000 SPS (échantillons par secondes).
Si tu fais tourner l'ADC en free-running à 500KHz et que vas toi même lire les registres pour savoir si un échantillon est disponible, tu peux monter à plus de 38000 SPS.
Pour info sur un STM32F429ZI tournant à 180MHz, en utilisant 2 ADC en alternance pour lire la même entrée il est possible de monter presque à 1000000 SPS !
Excusez moi mais je n’en comprends pas très bien l’intérêt ici de faire la multiplication dans l’arduino. Mis à part pour la beauté de raisonnement ou pour éviter d’acheter un composant supplémentaire.
L’ad633 semble capable de multiplier analogiquement des tensions de 1MHz selon la datasheet.
A vrai dire ma question portait sur les avantages et inconvénients des multiplications analogiques et numériques.
La méthode de hbattechi me semble puissante mais un peu compliquée, à mes yeux du moins, comparée à l’utilisation d’un unique composant électronique. Autant j’imagine qu’elle peut permettre des calculs complexes sur des signaux acquis (transformée de fourrier ...), autant je m’interroge sur l’intérêt pour une multiplication (mis à part celui d’éviter d’ajouter un composant)
Typiquement, la méthode numérique permet-elle de travailler a plus haute fréquence ? A t elle une meilleure précision ? Une moindre sensibilité au bruit ? Le filtrage serait il plus précis qu’un filtre RC ?
Avez vous un (mauvais) retour d’ expériences avec les multiplieurs analogiques ? Si vous les avez utilisé, dans quelle zone de fréquences et quels composants utiliseriez vous ?
Fantoche:
Typiquement, la méthode numérique permet-elle de travailler a plus haute fréquence ? A t elle une meilleure précision ? Une moindre sensibilité au bruit ? Le filtrage serait il plus précis qu’un filtre RC ?
Peut-être qu'il s'en fiche. Il veut juste le faire parce qu'il a envie d'essayer tout simplement, pour voir, par curiosité.