Interface à base de pic pour gestion d'impulsions

jihelbi:
Je veux juste te dire que la multiplication de fréquence c'est du hardware et du software qui ne sert absolument à rien.

JLB

C'est bien ce que je pensais, t'as pas compris du tout... le PIC ne doit pas mesurer la fréquence, mais la multiplier (la valeur qu'il peut mesurer dans le premier timer, une fois qu'elle est transmise dans le second timer, on s'en fout). Regarde le graph que j'ai mis : c'est le nombre d'impulsions qui est multiplié, pas une valeur numérique! Si je compte mes impulsions sur la troisième courbe, tu ne crois pas que je vais compter plus ou moins d'impulsions? et pas forcément par bloc de 10... la preuve :

Si mon signal d'entrée fait 25 impulsions / sec (25Hz quoi), je le multiplie par 10 dans le pic à l'aide de ses deux timers. en sortie du pic, j'ai quoi? ben un signal qui fait 250 impulsions par seconde, non?

Bon, dans l'arduino qui est à l'autre bout du fil, si je compte les impulsions du signal d'entrée sur une fenêtre de 990ms, alors je trouve 24 (il faut une seconde complète pour trouver 25 imp). Avec cette même base de temps, je compte le signal généré par le pic : je trouve 247 impulsions. Pour savoir où j'en suis et retrouver le nombre d'impulsions de mon signal d'origine, comme la fréquence à été multipliée par 10, je divise le nombre d'impulsions par 10, et je trouve : float x = NB_Imp / 10 = 24.7

Est-ce que mon comptage n'est pas plus précis en multipliant ma fréquence avant comptage? avec 990ms, je suis très proche de la seconde, donc mon comptage devrait être très proche de 25. avec ma solution, je suis plus proche de 25 qu'en ne comptant que les impulsions de départ.

Dans mon exemple, mon moteur tourne à 34,090909... tr/min.

Comptage des impulsions d'entrée (abstraction des dents manquantes pour le coup) : je dois multiplier le nombre d'impulsions comptées par (60/44/0.99 = 1.37741) pour trouver la rotation du moteur. donc j'ai compté 24, je trouve une vitesse de 33.05784 tr/min Erreur = ~ -1,03.

Comptage des impulsions de sortie du pic : je dois maintenant multiplier par (60/44/0.99/10 = 0,137741), j'ai compté 247, je trouve 34,022027 tr/min. Erreur = ~ -0,07.

Quelle méthode est la plus précise? sachant qu'en réel, mon moteur tournant à 34.09090909... tr/min donne 24.75 impulsions par tranche de temps de 0.99s... dans le premier comptage, on a perdu 0,75 impulsions, dans le second, seulement 0,05. (0,75 x 1,37741 = 1,03305 et 0,05 x 1,37741 = 0.068882). Si t'arrives encore à me dire que je me plante, va falloir que je trouve une nouvelle forme pour te l'expliquer!

De même, il m'arrive d'utiliser le truc suivant pour arrondir un nombre avec des décimales :

float arrondi2(float x){
  float y;
  y = x*100;
  return (int(y)/100);
}

Tu vas me dire que x contenait déjà des décimales... ok, mais dans un beau signal carré où on synchronise les impulsions sur front montant, le front descendant ne correspond-il pas à une demi impulsion (0,5)?

Et un signal de période 1 seconde, est-ce que pour t = 1,4541220147 s on ne peut pas considérer le signal quand même? les impulsions contiennent une donnée importante : la période (le temps entre deux impulsions) qui s'exprime en secondes, ms, µs, ns... ne sont-ce pas des décimales, tout ça? Et c'est justement le rôle des impulsions d'un signal (hormis PWM) de donner des bases de temps. Si ta montre n'affichait pas les secondes, comment ferais-tu un oeuf à le coque? n'essaierais-tu pas d'inventer un système qui te permet de découper les minutes de ta montre et ainsi avoir le temps correct pour la cuisson?

sur mon moteur, une dent correspond à 8.182°. j'ai quand même le droit de savoir ce qu'il se passe quand il est à 45°, même si ça na correspond pas à une impulsion... c'est pas un moteur pas-à-pas... (45 degrées correspond à 5,5 dent).

essaie de comprendre : le système qui compte les impulsions existe déjà. il me faut juste un petit circuit qui adapte le signal. (vais finir pas le faire moi-même...)

Je reconnais que j'ai bien tartiné le truc, un beau pavé, alors si j'ai pris le temps de l'écrire, prends le temps de lire, merci.


A part ça, quelqu'un saurait me programmer un PIC? je viens de télécharger MPLab, pour voir si ça peut me le simuler dans un premier temps... Pis ben... J'voudrais bien programmer moi-même, mais j'ai pas de port // sur mon PC pour utiliser les montages du net.