faire varier la fréquence d'une sortie d'un picaxe

Ritounet

New Member
Bonjour à tous ,

comment faire varier la fréquence d'une sortie de 0 à 1000 hz d'un picaxe 08m2 à l'aide d'un potentiomètre, pouvez-vous me donner un bout de code pour me mettre sur la voie

merci à vous
 

MGU

Senior Member
Bonjour à tous ,

comment faire varier la fréquence d'une sortie de 0 à 1000 hz d'un picaxe 08m2 à l'aide d'un potentiomètre, pouvez-vous me donner un bout de code pour me mettre sur la voie

merci à vous
Bonjour,

Il faut utiliser la commande PWMOUT.
A 4 MHz, la fréquence mini est 61 Hz. Voir l'aide dans PE6 : PICAXE/ Assistants/PWNOUT Wizard pour le calcul de la commande.
En diminuant la fréquence horloge, on doit logiquement diminuer la fréquence de sortie,à voir.

A oui, au fait, y a aussi la doc qu'on peut lire....

MM
 

Ritounet

New Member
oui je sais modifier le rapport cyclique avec PWMOUT mais la fréquence reste fixe moi je veux faire varier la fréquence avec un potentiomètre comme quand on peut le faire avec le rapport cyclique

readadc C.2,b3 'reg pot C.2
w3= b3*4 max 1000 ' or
pwmout C.5, 249, w3
 

PieM

Senior Member
Bonjour,

En outre un potentiomètre lu par une entrée ana va donner au maxi 1024 valeurs.
la sortie pwm étant paramétrée en durée (période) et non en fréquence, la variation en sortie suivra une courbe parabolique:
variation très lente dans les basses fréquence, et très rapide vers les 1000 Hz. donc des incrémentation de fréquences élevées.
Il faudrait avoir un peu plus de précision sur le besoin....
A priori si c'est la seule fonction, une solution analogique avec un VCO genre CD4046 serait plus indiquée....
 

Ritounet

New Member
bonjour
je n'ai pas de besoin particulier je veux vérifier si un picaxe
est capable de générer une fréquence variable comme on pourrait le faire avec un multivibrateur
 

MGU

Senior Member
oui je sais modifier le rapport cyclique avec PWMOUT mais la fréquence reste fixe moi je veux faire varier la fréquence avec un potentiomètre comme quand on peut le faire avec le rapport cyclique

readadc C.2,b3 'reg pot C.2
w3= b3*4 max 1000 ' or
pwmout C.5, 249, w3
Oui, le rapport cyclique, se règle par w3, la fréquence c'est 249 dans cet exemple, il faut le remplacer par une variable par ex w1. Pour un rapport cyclique fixe ex 50%, ilfaut w3=2 * w1
Mais suivant la fréquence, le prédiviseur change, pas facile de faire une variation continue sur une bande de fréquence quelconque.

C'est pour faire quoi?

MM
 

Ritounet

New Member
j'ai regardé la vidéo la modification de la fréquence dans une boucle je l'ai déja fait on à pas une modification de la fréquence en continu a travers un potentiomètre
 

PieM

Senior Member
j'ai regardé la vidéo la modification de la fréquence dans une boucle je l'ai déja fait on à pas une modification de la fréquence en continu a travers un potentiomètre
Il faut tout de même comprendre qu'en numérique on ne peut pas avoir une variation continue !

Les µC ne gèrent pas directement une fréquence mais son inverse, la période.
outre le fait que la variation n'est pas linéaire comme déjà expliqué, le fait d'avoir 1024 valeurs du potentiomètre ne le permet pas.
Encore moins avec votre formule et le readadc qui ne donnera que 250 valeurs !
 

MGU

Senior Member
j'ai regardé la vidéo la modification de la fréquence dans une boucle je l'ai déja fait on à pas une modification de la fréquence en continu a travers un potentiomètre
Bonjour,

Pour faire varier la fréquence avec le potentiomètre, il faut le readadc(10)dans la boucle avec une mise à l'échelle pour obtenir la bande de fréquence voulue.
Mais comme déjà dit, ce ne sera pas une varition "continue".

On trouve encore des XR2206:
http://www.ebay.fr/itm/XR-2206-XR2206CP-XR2206-Monolithic-Generator-DIP-IC-/171906794039?hash=item2806718237:g:lGUAAOSw1vlUx4Wt

MM
 

BESQUEUT

Senior Member
On trouve encore des XR2206:
Je plussoie (excellent circuit), mais un bête 555 ne réponds-il pas au cahier des charges ?
Par ailleurs, en admettant que monsieur Ritounet soit conscient qu'un readADC10 ne peut produire plus de 1024 fréquences différentes, le terme "continue" est peut-être un lapsus pour "linéaire". (Comme on parle d'un sol "plat" pour dire un sol "horizontal", alors qu'un sol incliné peut être plat...)

Dans ce cas, il faudrait préciser la loi de correspondance entre position du potentiomètre et fréquence.
0 Hz ne sert à rien (il suffit de couper l'alim).
Disons que :
0=1 Hz
...
511=500 Hz
...
1023=1000 Hz
Dans ce cas, le montage aura une résolution de 1hz ce qui n'est déjà pas mal.

M. Ritounet peut-il confirmer ce cahier des charges ?
 
Last edited:

Ritounet

New Member
bonjour

Je ne présente pas de cahier de charge? M. Besqueut, les réponses exprimées me confortent dans l'idée que l'on ne peut pas faire mieux et je vous remercie de vos excellentes réponses
 

PieM

Senior Member
Disons que :
0=1 Hz
...
511=500 Hz
...
1023=1000 Hz
Dans ce cas, le montage aura une résolution de 1hz ce qui n'est déjà pas mal.
Absolument pas car le paramètre de PWM image de la position du potentiomètre est la période et non la fréquence.

A titre indicatif, avec une fréquence de 31kHz du picaxe, 1024 va donner 30.2 Hz, 510 va donner 60 Hz et 1 va donner 3875 Hz

Même problème avec un 555.
 
Last edited:

jojojo

Senior Member
Si seule la fréquence est a prendre en compte, et NON le rapport cyclique, j'opterais pour pulsout.

Une simple bascule en sortie (S/R), et retombe en 50%.

Et, plus simple, s'il faut élargir la bande a couvrir. Rien n'empêche, selon la valeur ADC lue, d'intercaler des SetFreq pour passer automatiquement d'un "palier" à un autre.

Intéressant... Un VCO avec un 08M2 ...
 

PieM

Senior Member
Si seule la fréquence est a prendre en compte, et NON le rapport cyclique, j'opterais pour pulsout.

Une simple bascule en sortie (S/R), et retombe en 50%.

Et, plus simple, s'il faut élargir la bande a couvrir. Rien n'empêche, selon la valeur ADC lue, d'intercaler des SetFreq pour passer automatiquement d'un "palier" à un autre.
Mais Georges, le problème ne change pas avec le pulsout! tu définis une période et non une fréquence. donc la loi de variation est toujours de 1/x donc une hyperbole.

grande résolution en basse fréquence, et minable en haute fréquence...
Non la vraie solution est d'utiliser un VCO simple ou un peu sophistiqué comme celui du XR2206.
(ou un autre µC avec la bibliothèque ad hoc...)
 
Last edited:

BESQUEUT

Senior Member
Absolument pas car le paramètre de PWM image de la position du potentiomètre est la période et non la fréquence.
A titre indicatif, avec une fréquence de 31kHz du picaxe, 1024 va donner 30.2 Hz, 510 va donner 60 Hz et 1 va donner 3875 Hz
Restez calme ! Je cherche juste à préciser le cahier des charges ; je ne sais pas à quel programme vous faites allusion.
Si "continu" doit être compris comme "linéaire" ce que M. Ritounet ne me semble pas avoir clairement confirmé, alors il faut trouver une façon de faire correspondre position du potentiomètre et fréquence.
jojojo propose un pulsout, mais un toggle peut aussi marcher et donnera directement un rapport cyclique 50/50 (ce qui n'est pas demandé).
On peut imaginer une simple boucle avec une pause finement calculée, et pourquoi pas un setfreq si nécessaire.
Ça peut peut-être aussi se faire avec des interruptions ?

Même problème avec un 555.
J'ai parlé de 555 (plus facile à trouver qu'un XR2206 et moins cher) AVANT de parler de linéarité fréquence/position du potar.
Et je suis d'accord avec vous : si la linéarité est requise, le 555 ne convient pas.
 

BESQUEUT

Senior Member
Je ne présente pas de cahier de charge
Ben si :
comment faire varier la fréquence d'une sortie de 0 à 1000 hz d'un picaxe 08m2 à l'aide d'un potentiomètre
on n'à pas une modification de la fréquence en continu a travers un potentiomètre
On en déduit que vous souhaitez une "modification de la fréquence en continu", ce dernier terme laissant place à interprétation.
C'est incomplet et imprécis ce qui oblige a faire des hypothèses de travail, mais je sais pas répondre à une question qui n'a pas été posée.
 

PieM

Senior Member
On peut imaginer une simple boucle avec une pause finement calculée, et pourquoi pas un setfreq si nécessaire.
Alors merci de préciser votre simple boucle et le "fin" calcul sur picaxe pour parcourir une fréquence de 1 Hz en 1 Hz. de 1 à 1000 Hz.
 

BESQUEUT

Senior Member
Alors merci de préciser votre simple boucle et le "fin" calcul sur picaxe pour parcourir une fréquence de 1 Hz en 1 Hz. de 1 à 1000 Hz.
J'ai partiellement répondu en #18, mais il me semble indispensable d'expérimenter, pour autant que M. Ritounet confirme mon interprétation très personnelle du terme "continu"
 

PieM

Senior Member
J'ai partiellement répondu en #18, mais il me semble indispensable d'expérimenter,
C'est gentil de me rappeler que la période = 1/F.
par contre avant d'expérimenter, il est souhaitable d'avoir un mode de calcul réalisable sur Picaxe.

Par exemple calcul pour avoir 963 Hz puis pour avoir 962 Hz.
 

BESQUEUT

Senior Member
Par exemple calcul pour avoir 963 Hz puis pour avoir 962 Hz.
Pour le calcul pur, je ferais un truc du genre :
Code:
[color=Navy]#simspeed 0[/color]
[color=Blue]symbol [/color][color=Purple]Freq[/color][color=DarkCyan]=[/color][color=Purple]w1[/color]
[color=Blue]symbol [/color][color=Purple]Period[/color][color=DarkCyan]=[/color][color=Purple]w2[/color]


[color=Blue]for [/color][color=Purple]freq[/color][color=DarkCyan]=[/color][color=Navy]930 [/color][color=Blue]to [/color][color=Navy]970
      [/color][color=Purple]w3[/color][color=DarkCyan]=[/color][color=Navy]65535[/color][color=DarkCyan]/[/color][color=Purple]Freq
      w4[/color][color=DarkCyan]=[/color][color=Purple]w3[/color][color=DarkCyan]*[/color][color=Purple]Freq
      w4[/color][color=DarkCyan]=[/color][color=Navy]65535[/color][color=DarkCyan]-[/color][color=Purple]w4[/color][color=DarkCyan]/[/color][color=Navy]60
      [/color][color=Purple]Period[/color][color=DarkCyan]=[/color][color=Purple]w3[/color][color=DarkCyan]*[/color][color=Navy]15[/color][color=DarkCyan]+[/color][color=Navy]18[/color][color=DarkCyan]+[/color][color=Purple]w4
      [/color][color=Blue]sertxd([/color][color=Navy]#Freq[/color][color=Black],[/color][color=Red]"Hz "[/color][color=Black],#[/color][color=Purple]Period[/color][color=Black],[/color][color=Red]"ms"[/color][color=Black],[/color][color=Navy]13[/color][color=Black],[/color][color=Navy]10[/color][color=Blue])
next [/color][color=Purple]Freq[/color]
Mais il y a des choses à corriger en fonction de l'expérimentation, en particulier à cause du temps de boucle qui dépends beaucoup du readadc10.
Je viens de faire quelques essais sur un 18m2 avec un setfreq m32 et toggle.
Ça va évidement pas trop mal aux faibles fréquences et on peut atteindre plus de 1000 hz avec un signal évidement symétrique dans ce cas. Mais la linéarité est difficile à obtenir.

Avec un pulsout ça va évidement deux fois plus vite, d'où une résolution meilleure au prix d'une moins bonne symétrie.

Reste à savoir ce que veut vraiment M. Ritounet, en particulier en terme de "mieux".
Si le but est de graduer le potar pour obtenir directement une fréquence au hz près, la graduation va être fine...
Si le but est d'avoir quelque chose de "quasi-analogique" avec des fréquences fractionnaires, on peut imaginer une saisie avec un potar grossier et un autre plus fin (voire un encodeur). Mais pour le coup, il me semble que l'on va atteindre les limites du Picaxe non seulement en calcul, mais surtout en timing.
On pourrait se faciliter un peu le travail en séparant la saisie (et l'affichage ?) de la fréquence, de la génération proprement dite.
Ceci permettrait de sortir de la boucle le ou les readadc ainsi que les calculs, mais il faut garder une interruption pour détecter la bascule d'un inter ou l'appui sur un bouton.
 
Last edited:

PieM

Senior Member
Mais il y a des choses à corriger en fonction de l'expérimentation, en particulier à cause du temps de boucle qui dépends du readadc10.
Je viens de faire quelques essais sur un 18m2 avec un setfreq m32 et toggle.
Ça va évidement pas trop mal aux faibles fréquences et on peut atteindre plus de 1000 hz avec un signal évidement symétrique dans ce cas. Mais la linéarité est difficile à obtenir.

Avec un pulsout ça va évidement deux fois plus vite, d'où une résolution meilleure au prix d'une moins bonne symétrie.

Reste à savoir ce que veut vraiment M. Ritounet, en particulier en terme de "mieux".
Si le but est de graduer le potar pour obtenir directement une fréquence au hz près, la graduation va être fine...
Si le but est d'avoir quelque chose de "quasi-linéaire" avec des fréquences fractionnaires, on peut imaginer une saisie avec un potar grossier et un autre plus fin. Mais pour le coup, il me semble que l'on va atteindre les limites du Picaxe non seulement en calcul, mais surtout en timing.

le calcul est une chose mais il est impossible de gérer des variations de l'ordre de la µs nécessaire pour des frequences hautes car passer de 1000 Hz à 999 Hz c'est ajouter 1 µs à la période.
Et on ne peut utiliser pauseus qui n'a aucune linéarité, comme montré dans les mesures réelles.
 

BESQUEUT

Senior Member
passer de 1000 Hz à 999 Hz c'est ajouter 1 µs à la période.
Très pointu en effet.
Le temps de boucle devient très sensible à ces fréquences, même avec un setfreq m32
D'où l'idée de sortir la saisie de la fréquence de la boucle de génération du signal.
Par ailleurs, si on accepte un signal dissymétrique, le pulsout est gradué en 1.25us
On pourrait utiliser différentes approches en fonction de la gamme souhaitée.
Mais il faudrait en savoir plus sur ce que souhaite réellement M. Ritounet.

Le programme d'essai :
Code:
[color=Navy]#picaxe [/color][color=Black]18m2[/color]
[color=Navy]#no_data[/color]

[color=Blue]setfreq m32

do
      readadc10 c.0[/color][color=Black],[/color][color=Purple]w1
      [/color][color=Blue]toggle b.3

      [/color][color=Purple]w1[/color][color=DarkCyan]=[/color][color=Purple]w1[/color][color=DarkCyan]+[/color][color=Navy]1
      [/color][color=Purple]w1[/color][color=DarkCyan]=[/color][color=Navy]4000[/color][color=DarkCyan]/[/color][color=Purple]w1[/color][color=DarkCyan]-[/color][color=Navy]3
      [/color][color=Blue]pause [/color][color=Purple]w1[/color]
[color=Blue]loop[/color]
et le résultat :
Freq.jpg
 
Last edited:

alainav1

Senior Member
Bonjour,
pour fabriquer un signal infrarouge je souhaitais générer du 38Khz
j'ai réaliser un programme avec un pic16F en incluant un sous programme en assembleur (ce qui permet de gère la micro seconde ) mais je ne pense pas si l'on peut inclure de l'assembleur dans les picaxe ?
cordialement
Alain
 

PieM

Senior Member
pour fabriquer un signal infrarouge je souhaitais générer du 38Khz
Encore que générer cette fréquence fixe avec un picaxe est parfaitement possible (à 1.2% près ) avec pwm.
le problème est lié au fait que les instructions pulsout ou pauseus ne sont absolument pas fiables du fait de l'interprétation;
par ex un pulsout 1 a 32 MHz au lieu de 1.25 µs va mettre 73 µs avant d'envoyer un pulse de 3 µs. En dehors du retard, il commence à être conforme à partir de pulsout 100
idem pour un pauseus 5 qui engendre une pause 20 fois plus grande.
 

BESQUEUT

Senior Member
le problème est lié au fait que les instructions pulsout ou pauseus ne sont absolument pas fiables du fait de l'interprétation;
par ex un pulsout 1 a 32 MHz au lieu de 1.25 µs va mettre 73 µs avant d'envoyer un pulse de 3 µs. En dehors du retard, il commence à être conforme à partir de pulsout 100
idem pour un pauseus 5 qui engendre une pause 20 fois plus grande.
Entièrement d'accord. Ceci dit, dans la mesure où, bien que très hors spécifications, ces instructions donnent un délai répétitif il reste en théorie possible d'ajuster le tir pour au final obtenir une fréquence proche de celle demandée. Mais c'est un gros travail nécessitant moults expérimentations...
D'où l'absolue nécessité de savoir à quoi on veut aboutir avant de se lancer dans un travail certes passionnant mais à coup sur chronophage.
A 1000 Hz, la période est de 1000µs soit un pauseus théorique autour de 800, un peu moins en réalité pour tenir compte du temps de boucle, disons 700.
Pour 999 Hz, il est probable qu'un pauseus de 701 donne une fréquence pas trop loin de la cible.
Mais pour généraliser cette approche, yadutaf !

En outre ça pourrait marcher jusqu'à pauseus 65535, soit 82 ms, soit 12 Hz
Pour aller en dessous, il faudrait avoir une autre approche, ce qui suppose un test qui va lui-même modifier le timing...
 
Last edited:

jojojo

Senior Member
Une idée, juste comme ça ...

Si l'on récupère les resultats de l'ADC (0-1023), et qu'on leur applique un coef anti hyperbolique, pour piloter le pulsout ?

Je cherche a poser ça en équation, mais, j'y arrive pas ... (bon, ça va viender, faut réveiller le neurone ...).
 

BESQUEUT

Senior Member
Je cherche a poser ça en équation, mais, j'y arrive pas ... (bon, ça va viender, faut réveiller le neurone ...).
Voir #18 : l'inverse de
Y=1/X
est :
X=1/Y
Ce qui n'est pas si simple avec l'arithmétique Picaxe, mais faisable (voir #24, qui n'est qu'une approximation)

Mais M. Ritounet n'ayant pas répondu à #22, la réflexion s'est arrêtée là...
 

jojojo

Senior Member
Bon, pas fait de test, mais ...

Ca devrait être linéaire, de un poil plus que le Hz, jusqu'à 1200Hz. (horloge à 32Mhz)
Code:
Do

   Readadc10 C.2,w0
   w0=65535/w0
   Toggle C.2
   Pause w0
   Toggle C.2
   Pause w0

Loop
A 1023 en ADC, w0 vaut 64. 10p6/64*125 =1250Hz
A 512 en ADC, w0 vaut 128. 10p6/125*128=625Hz
A (théorique, faut limiter à 9) 8.19, w0 vaut 800. 10p6/125*800=1hz

Je teste cet AM (pas à l'atelier, là).

Si je me plante, dites le, hein !...
 

BESQUEUT

Senior Member
Si je me plante, dites le, hein !...
Le soucis, c'est que :
65535/1023=64
mais c'est aussi vrai pour 1022, 1021, 1020,... 1009
Il faut atteindre 1008 pour passer à 65
D'où la nécessité d'ajuster en µs...
et donc de faire une division plus fine : voir #24
Il faut également tenir compte du temps de boucle, de moins en moins négligeable au fur et à mesure que la pause diminue...
 

PieM

Senior Member
Bon, pas fait de test, mais ...

Ca devrait être linéaire, de un poil plus que le Hz, jusqu'à 1200Hz. (horloge à 32Mhz)
temps de cycle estimé à 32 MHz, de l'ordre 600 µs.
Pour 1200 Hz, la période est de 833 µs; reste pas grand chose pour les pauses !
et pour te dégouter encore plus un pauseus 5 à 32 MHz c'est 131 µs au lieu des 6.25 µs théoriques...

Le résultat du calcul théorique est linéaire certes, mais on ne peut pas l'exploiter puisqu'à 1000 Hz il faut gérer des variations de pause inférieure à la µs !
 

BESQUEUT

Senior Member
temps de cycle estimé à 32 MHz, de l'ordre 600 µs.
Pour 1200 Hz, la période est de 833 µs; reste pas grand chose pour les pauses !
et pour te dégouter encore plus un pauseus 5 à 32 MHz c'est 131 µs au lieu des 6.25 µs théoriques.
Donc pour 1200 Hz, il faut une pause de 233µs
soit un pauseus entre 7 et 10
reste à calculer la bonne valeur.
Limite, mais jouable...
 

PieM

Senior Member
Donc pour 1200 Hz, il faut une pause de 233µs
soit un pauseus entre 7 et 10
reste à calculer la bonne valeur.
Limite, mais jouable...
Bonne chance pour calculer la bonne valeur !
les pauses diverses de faibles valeurs, (pauseus, pulsout) ne sont absolument pas fiables!
de même, les temps de calcul dépendent des valeurs des opérateurs...
valeurs en µs pour 32MHz:
Pauseus 5131
Pauseus 10137
Pauseus 50192
Pauseus 100255
Pauseus 200378
Pauseus 500774
Pauseus 10001 341
Pauseus 50006 404
 

jojojo

Senior Member
J'ai continué a réflêchir un peu au truc.

Le souci, aussi, c'est que Ritounet précise, en tête de post, vouloir utiliser un 08M2.

Vu que ce dernier ne SUPPORTE PAS l'instruction pauseus, ben ...

Bon, je poursuis, mais, avec un 40X2. C'est pas gagné ...

Surtout, qu'il faut générer une fréquence double de celle souhaitée, si l'on veut un rapport cyclique de 50% (utilisation de pulsout, et un 4013 en sortie).
 

Ritounet

New Member
Bonjour
si si M. Ritounet suit de près vos réponses il me semble maintenant que cela devient un casse-tête pour une question simple? j'essaierai dans trouvez une question plus simple la prochaine fois M.BESQUEUT
 
Top