Show Posts
Pages: 1 [2] 3 4 ... 19
16  International / Réalisations et Projets Finis / Re: Commande automatique de groupe électrogène - machine à états et autres questions on: July 04, 2013, 11:10:27 am
ok, bon avec la mesure de période en µs avec micros(), ça fonctionne très bien jusqu'a 1kHz, soit le double de la vitesse maxi du moteur, j'ai donc de la marge smiley

reste à modifier le câblage de mon entrée, et là par contre c'est merdique, car la tension batterie peut varier de 14,5V (en fonctionnement, alternateur en charge) à moins de 7V (démarreur en fonction par temps froid). Et la tension ne doit pas descendre en sortie de pont en dessous de 3,1V... ce qui n'est pas possible pour ne pas non plus dépasser 5,5V ! 
Donc j'hésite entre laisser le pont, calibré pour arriver à 3,5V avec 7V en entrée, et utiliser les diodes internes à l'atmega pour limiter le voltage lorsque la Ubat remonte, ou remplacer R37 par une zener à 5V.
La zener est-elle préférable ? j'ai lu un peu tout et son contraire dans les topics parlant de limiter une tension d'entrée par une zener...
17  International / Français / Re: millis() et interruptions on: July 04, 2013, 07:44:13 am

Pour autant que je sache, _delay_us() ne dépend d'aucun timer mais se contente d'entrer dans une boucle vide dont le nombre d'itérations est calculé en fonction de la vitesse d'horloge du CPU.

voila le code qui va avec :

Code:
void delay(unsigned long ms)
{
uint16_t start = (uint16_t)micros();

while (ms > 0) {
if (((uint16_t)micros() - start) >= 1000) {
ms--;
start += 1000;
}
}
}

/* Delay for the given number of microseconds.  Assumes a 8 or 16 MHz clock. */
void delayMicroseconds(unsigned int us)
{
// calling avrlib's delay_us() function with low values (e.g. 1 or
// 2 microseconds) gives delays longer than desired.
//delay_us(us);
#if F_CPU >= 20000000L
// for the 20 MHz clock on rare Arduino boards

// for a one-microsecond delay, simply wait 2 cycle and return. The overhead
// of the function call yields a delay of exactly a one microsecond.
__asm__ __volatile__ (
"nop" "\n\t"
"nop"); //just waiting 2 cycle
if (--us == 0)
return;

// the following loop takes a 1/5 of a microsecond (4 cycles)
// per iteration, so execute it five times for each microsecond of
// delay requested.
us = (us<<2) + us; // x5 us

// account for the time taken in the preceeding commands.
us -= 2;

#elif F_CPU >= 16000000L
// for the 16 MHz clock on most Arduino boards

// for a one-microsecond delay, simply return.  the overhead
// of the function call yields a delay of approximately 1 1/8 us.
if (--us == 0)
return;

// the following loop takes a quarter of a microsecond (4 cycles)
// per iteration, so execute it four times for each microsecond of
// delay requested.
us <<= 2;

// account for the time taken in the preceeding commands.
us -= 2;
#else
// for the 8 MHz internal clock on the ATmega168

// for a one- or two-microsecond delay, simply return.  the overhead of
// the function calls takes more than two microseconds.  can't just
// subtract two, since us is unsigned; we'd overflow.
if (--us == 0)
return;
if (--us == 0)
return;

// the following loop takes half of a microsecond (4 cycles)
// per iteration, so execute it twice for each microsecond of
// delay requested.
us <<= 1;
   
// partially compensate for the time taken by the preceeding commands.
// we can't subtract any more than this or we'd overflow w/ small delays.
us--;
#endif

// busy wait
__asm__ __volatile__ (
"1: sbiw %0,1" "\n\t" // 2 cycles
"brne 1b" : "=w" (us) : "0" (us) // 2 cycles
);
}
18  International / Français / Re: millis() et interruptions on: July 04, 2013, 07:39:52 am

tu a vraiment besoin d'avoir cette notion de vitesse circonférentielle quasi instantanée ?
pour un groupe c'est surtout la notion de verif de rotation et de maintien de rotation stable qui est important , pas vraiment de savoir si une dent est passé 1 µs plus vite que la precedente.
selon le module de l'engrenage je mettrais un compteur/diviseur  hard  (genre 74163 ou autre facteur) et je repiquerais simplement une des sorties du diviseur la plus adequate pour l'adapter aux possibilités "arduino"



besoin, non, mais en pratique, la carte est faite, je peux pas vraiment y rajouter un diviseur. Et concrètement sur le groupe, je ne peux compteur que les dents du ventilo, et il y en a 9... à 3000trs/min, ça me donne donc 50Hz x 9 = 450Hz, c'est pas monstrueux non plus, mais enfin...
19  International / Français / Re: millis() et interruptions on: July 04, 2013, 07:37:25 am
bon en fait je viens de trouver le code de millis() et micros() (dans /usr/share/arduino/cores/arduino/wiring.c ), et ben je vais pas lire direct les variables globales smiley-razz y'a pas mal de merdier autour de la lecture, il n'y est sans doute pas pour rien :

u
Code:
nsigned long millis()
{
unsigned long m;
uint8_t oldSREG = SREG;

// disable interrupts while we read timer0_millis or we might get an
// inconsistent value (e.g. in the middle of a write to timer0_millis)
cli();
m = timer0_millis;
SREG = oldSREG;

return m;
}

unsigned long micros() {
unsigned long m;
uint8_t oldSREG = SREG, t;

cli();
m = timer0_overflow_count;
#if defined(TCNT0)
t = TCNT0;
#elif defined(TCNT0L)
t = TCNT0L;
#else
#error TIMER 0 not defined
#endif

 
#ifdef TIFR0
if ((TIFR0 & _BV(TOV0)) && (t < 255))
m++;
#else
if ((TIFR & _BV(TOV0)) && (t < 255))
m++;
#endif

SREG = oldSREG;

return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
}
20  International / Français / Re: millis() et interruptions on: July 04, 2013, 07:28:25 am
1/ Les variables globales qui servent à stocker les valeurs utilisées par millis() et micros() sont incrémentées via une interruption générée par l'overflow du Timer0.


ça en fait ça m'interpelle ! variable globale ? donc il y a moyen de gagner du temps en interruption en copiant directement la variable plutôt que d'appeler micros() qui va la lire, puis la renvoyer, non ?
Comment on trouve le nom de ces variables ?
21  International / Français / Re: millis() et interruptions on: July 04, 2013, 07:24:17 am
Mais manifestement j'ai un peu surinterpréter, nous sommes tous d'accord, donc smiley

ce qui ne m'arrange pas, car en fait je me rends compte qu'avec des interruption à 500Hz ou pas loin, je risque de passer pas mal de temps dedans, et de rater pas mal de tops du timer :/
22  International / Français / Re: un petit quizz recup on: July 04, 2013, 07:23:07 am
ha si 1,5cm ça doit commencer à piquer ! tu dois être autour de 20-25kV au feeling...
23  International / Français / Re: un petit quizz recup on: July 04, 2013, 07:14:38 am
pas trop méchant quand même ! tu as mesuré le voltage dispo ? j'aurais cru qu'il serait possible de tire des arcs plus longs avec ces machins
24  International / Français / Re: millis() et interruptions on: July 04, 2013, 07:12:26 am
Artouste, en relisant le fil je me rends compte que nos deux réponses ne sont pas forcément compatibles, pourrais-tu me donner plus de détails sur ce test que tu as fait stp ?

bah moi ça me semble compatible : le timer est hard, et il compte, quoi qu'il arrive. par contre il reste possible de rater un overflow si on passe trop de temps en interruption, c'est ok avec ton explication, non ?
25  International / Français / Re: millis() et interruptions on: July 04, 2013, 07:09:58 am
artouste, ta traduction est bonne

haifger -> ok, il ne se passe pas grand chose en interruption (stockage de la valeur de micros() dans deux variables, et incrément d'un compteur) donc je suppose que je peux faire confiance au truc, mais si de temps en temps l'interruption se déclanche à quelques cycles de l'overflow, ça devrait pas me décaler énormément l'horloge.

A terme, il y aura un DS1307 pour l'horloge, de toutes manières smiley-razz
26  International / Réalisations et Projets Finis / Re: Commande automatique de groupe électrogène - machine à états et autres questions on: July 04, 2013, 05:24:36 am
bon là le soucis de voltage en entrée est flagrant :

Code:
tps : 0:2 0:2 ubat=12.00 rpm=1333
tps : 0:2 0:2 ubat=12.00 rpm=1666
tps : 0:2 0:2 ubat=12.00 rpm=1333
tps : 0:2 0:2 ubat=12.00 rpm=1333
tps : 0:2 0:2 ubat=11.81 rpm=1333
tps : 0:2 0:2 ubat=11.69 rpm=1333
tps : 0:2 0:2 ubat=11.60 rpm=1666
tps : 0:2 0:2 ubat=11.52 rpm=0
tps : 0:2 0:2 ubat=11.42 rpm=0
tps : 0:2 0:2 ubat=11.42 rpm=0
tps : 0:2 0:2 ubat=11.42 rpm=0
tps : 0:2 0:2 ubat=11.42 rpm=0
tps : 0:2 0:2 ubat=11.42 rpm=0
tps : 0:2 0:2 ubat=11.71 rpm=1333
tps : 0:2 0:2 ubat=12.20 rpm=1666
tps : 0:2 0:2 ubat=12.47 rpm=1333
tps : 0:2 0:2 ubat=12.57 rpm=1666
tps : 0:2 0:2 ubat=12.63 rpm=1333
tps : 0:2 0:2 ubat=12.90 rpm=1333
tps : 0:2 0:2 ubat=12.06 rpm=1333
tps : 0:2 0:2 ubat=11.28 rpm=0
tps : 0:2 0:2 ubat=11.28 rpm=0
tps : 0:2 0:2 ubat=10.64 rpm=0
tps : 0:2 0:2 ubat=10.93 rpm=0
tps : 0:2 0:2 ubat=11.91 rpm=1333
tps : 0:2 0:2 ubat=12.45 rpm=1333
tps : 0:2 0:2 ubat=12.73 rpm=1333
tps : 0:2 0:2 ubat=12.84 rpm=1333
tps : 0:2 0:2 ubat=12.84 rpm=1333
tps : 0:2 0:2 ubat=12.84 rpm=1333
tps : 0:2 0:2 ubat=12.84 rpm=1333
tps : 0:2 0:2 ubat=12.84 rpm=1666

pour ce qui est des erreurs de mesure, je viens de me rendre compte d'un truc : à la fréquence de mes impulsions, la période n'est que de quelques ms. Il faut déjà que je fasse la mesure avec des µs, ça sera sans doute bien plus précis...
27  International / Français / millis() et interruptions on: July 04, 2013, 04:40:57 am
bonjour à tous

selon la doc arduino, la valeur renvoyée par millis() lorsqu'elle est appelée en interruption ne s'incrémente pas. OK, ça c'est clair et à vrai dire assez pratique lorsque l'interruption doit servir à calculer des fréquences.

Mais par contre je me pose la question suivante : est-ce que pendant le temps passé en interruption le compteur continue lui à compter, de sorte que la valeur renvoyée par millis() lors de son appel suivant après le passage en interruption prenne en compte aussi le temps passé à executer l'interruption ? Ou est-ce que ce temps est perdu et n'est pas estimable ?
28  International / Le bar / Re: Presentez vous on: July 04, 2013, 04:18:02 am
salut xavier

très impressionnant, ton pong !

ton émulateur, tu prévois de le publier en GPL, ou CC ou autre ? je pense que ça pourrait intéresser pas mal de monde !
29  International / Réalisations et Projets Finis / Re: Commande automatique de groupe électrogène - machine à états et autres questions on: July 04, 2013, 03:38:37 am
merci b@tto pour ces liens. j'avais déja trouvé ce matin l'AN atmel, mais l'autre est très instructif aussi...

en gros, c'est la merde smiley-razz

Je crois que je vais tenter la version sale à la sauce atmel : juste une R en série avec l'entrée, et laisser les diodes internes faire leur boulot.
En fait, j'avais voulu faire un pont diviseur pour m'assurer d'avoir un courant minimum dans mon entrée pour éviter un certain nombre de parasites, dans la mesure ou l’environnement du montage (groupe électrogène : bobines, relais, alternateur, fort courants, etc) est quand même EMF-gène au possible...
30  International / Français / Re: un petit quizz recup on: July 03, 2013, 02:19:02 pm
les transfos, ça doit pouvoir servir à faire un électrificateur de cloture ?
peut etre , il faut determiner les caracteristiques
j'avais en tete de faire un petit "chatouilleur HT" , une cr2032 + un petit oscillateur , mais ça demande quand meme de bien reflechir pour ne pas construire
une "chaise electrique"  smiley-mr-green


bof, en partant d'une 2032, je pense que tu ne risques rien vu que même si tu obtiens un HV en sortie, le courant disponible sera ridicule.
Un électrificateur de cloture, c'est jusqu'a 10kV pour les plus costauds, je ne sais pas avec quel courant, mais le transfo à l'intérieur est sans commune mesure avec ceux-là, et quand on voit comment ça crame les ronces... Par contre quand on touche le fil, ça calme tout de suite smiley-razz
Pages: 1 [2] 3 4 ... 19