Show Posts
Pages: 1 2 [3] 4 5 ... 19
31  International / Réalisations et Projets Finis / Re: Commande automatique de groupe électrogène - machine à états et autres questions on: July 03, 2013, 01:24:27 pm
ben justement, j'ai essayé d'en faire le moins possible en interruption, regarde la fonction void comptetour() elle est réduite à sa plus simple expression..

bon en fait, le calcul marche, c'est mon entrée qui merdait (tension de sortie du gbf intégré au DSO Quad trop basse ! j'ai bricolé un ampli et ça marche, j'ai bien mes 666 trs/min (avec de temps en temps un pic à 740, donc il reste un bug que je n'ai absolument aucune espèce d'idée de la manière de la trouver ! )

par contre je retrouve mon comportement du début : dès que l'état de la machine change, je mesure 0 !! donc c'est que ça ne passe plus en interruption...
32  International / Français / Re: un petit quizz recup on: July 03, 2013, 12:47:14 pm
les transfos, ça doit pouvoir servir à faire un électrificateur de cloture ?
33  International / Réalisations et Projets Finis / Re: Commande automatique de groupe électrogène - machine à états et autres questions on: July 03, 2013, 12:43:16 pm
alors en fait, c'est plus merdique que ça ! là j'attaque l'entrée avec un signal carré à 100Hz, ce qui devrait me donner une valeur de rpm à environ 667 trs/min, et en fait j'ai une valeur qui oscille entre zéro et 416 avec de temps en temps des pics à 7000, enfin bref c'est totalement n'importe-quoi.

donc en fait la fonction de calcul ou ma fonction de mesure ne marchent pas.

trop rapide, non, certainement pas, grand maximum mon entrée sera à 500Hz ça ne devrait pas poser trop de soucis...
34  International / Français / Re: MÉMORISER UN BIT MÊME SANS ALIMENTATION on: July 03, 2013, 12:10:11 pm
tout à fait ! reste que pour écrire dedans, il faudra fabriquer/modifier une lib maison, je ne crois pas que celles disponible le permettent
35  International / Français / interruption qui marche, puis ne marche plus !! on: July 03, 2013, 12:08:49 pm
si des pros de l'interruption à la sauce arduino ont des idées, tout est expliqué ici :
http://forum.arduino.cc/index.php?topic=125887.msg1302133#msg1302133

si c'est possible de répondre dans l'autre topic, ça sera plus simple, comme ça se rapporte à ce projet objet de l'autre topic...

merci

36  International / Réalisations et Projets Finis / Soucis avec les interruptions on: July 03, 2013, 12:04:37 pm
Bon alors voila, pour détecter la rotation du moteur, j'ai rajouté un capteur de proximité qui compte les dents du ventilateur du moteur.

le nouveau scema de la carte V3.0 est le suivant :
http://sourceforge.net/p/groupe/code/ci/capteur_rota/tree/kicad/groupe2/groupe2.pdf?format=raw

J'ai connecté ce capteur sur l'entrée INT1 (pin D03), ma fonction associée à l'interruption mesure la période entre plusieurs tops et compte ces tops. Ensuite j'ai une fonction qui est appelée dans la boucle principale, qui calcule la vitesse de rotation du moteur à partir de cette période et du nombre de tops comptés.

Code:
unsigned int rpm_moteur; //vitesse de rotation moteur.

//variables utilisees en interruption (volatile = stockees en RAM)
volatile unsigned int rpm_cpt;                     //compteur de passage en interruption. Pour savoir cb de périodes sont utilisées pour le calcul de F
volatile unsigned long rpm_periode;                //periode des implulsion du capteur de rotation
volatile unsigned long rpm_tprecedent,rpm_tcourant;//temps utilisés pour calculer la période

void setup()
{
(...)
attachInterrupt(1, comptetour, RISING); //entree rotation moteur sur INT1
(...)
}

void calcule_rpm() {
  //calcul de la vitesse de rotation du moteur.
 
  //on calcule la fréquence avec 1*60*1000/période car la période est en ms (*1000), et que l'on veut la fréquence en tr/min et non en Hz ou tr/s (*60)
  //on divise ensuite le total par le nombre de dents comptées par le capteur sur 1 tour moteur
  //la periode est une moyenne des rpm_cpt periodes mesurees en interruption avant passage par ici
 
  //Serial.print(rpm_cpt);
  //Serial.println(" "); 
  if (rpm_cpt) {
    rpm_moteur = (unsigned int)(60000/(rpm_periode/rpm_cpt))/nbr_dents_capteur_rota;
    rpm_cpt = 0; //remise à zero du compteur pour les prochaines mesures
    rpm_periode = 0; //idem pour la periode
  }
  else if (rpm_tcourant<(temps_courant-300))
rpm_moteur = 0; //si pas de nouvelle mesure pdt plus de 300ms, alors le moteur est à l'arret ou le capteur est HS
//300ms de période correspond à 22trs minutes si nbr_dents_capteur_rota=9
  //Serial.print(rpm_moteur);
  //Serial.print(" ");
 
}

void comptetour(void) {
  //passage ici en interruption à chaque top capteur de vitesse.
  //On stocke juste la somme des période des impulsions, et un compteur du nombre de périodes additionnées 
  rpm_tprecedent = rpm_tcourant;
  rpm_tcourant = millis();
  rpm_cpt++;
  rpm_periode += (rpm_tcourant-rpm_tprecedent); 
}

le code complet est ici : http://sourceforge.net/p/groupe/code/ci/31e71b1ae87b4828ae862ed18880018b4c217bed/tree/groupe.ino

Tout ça fonctionne très bien, du moins tant que le système est en veille (machine à état en état et_attente).

En revanche, dès que je demande un démarrage du moteur, on dirais que le passage en interruption ne se fait plus. Je passe bien dans la fonction de calcul de vitesse à chaque boucle, comme en attestent les serial.print que j'ai collé dedans, mais le nombre de tops comptés est toujours 0, quelle que soit la fréquence des impulsions en entrée, ce qui semble vouloir dire que je ne passe pas dans l'interruption.

Le pire, c'est que une fois la séquence de démarrage (ratée !) finie, quand la machine à état repasse en attente, ben ça remarche.... arghhhh !

Qu'est-ce qui peut me bloquer l'interruption ? J'avoue que je m'arrache les cheveux, je sent bien que ça doit être une connerie énorme, mais j'y suis depuis 3h et je trouve pas...
37  International / Français / Re: un petit quizz recup on: July 03, 2013, 11:13:04 am
des alims de tubes fluo pour backlight de grands panneaux LCD ?
38  International / Français / Re: forcer l'affichage des zéros non significatifs avec serial.Print(valeur,BIN) ? on: June 27, 2013, 01:31:22 pm
ouais, mais je me retrouve avec une utilisation RAM d'un int, non ?  quoique dans l'exemple de haifger ça doit pas stocker grand chose en ram, du moins pas longtemps, je vais tester

merci smiley
39  International / Français / Re: forcer l'affichage des zéros non significatifs avec serial.Print(valeur,BIN) ? on: June 27, 2013, 07:02:44 am
forcer un 1, j'y ai pensé, mais comme mes variables sont des bytes et que les 8 bits sont utilisés, je peux pas !
40  International / Français / Re: forcer l'affichage des zéros non significatifs avec serial.Print(valeur,BIN) ? on: June 26, 2013, 02:18:34 pm
oui en effet, je n'y avais pas pensé.  Mais du coup je dois utiliser une String, et stdio.h, tout ça ça va me rajouter encore du poids dans un sketch qui est déjà bien assez lourd...
41  International / Français / forcer l'affichage des zéros non significatifs avec serial.Print(valeur,BIN) ? on: June 26, 2013, 12:24:05 pm
bon ben voila, tout est dans le titre ... c'est possible, ou pas ?

car je dois afficher mes variables d'état, pour lesquelles chaque bit correspond à une sortie ou une entrée, et là comme par exemple
00000110 s'affiche seulement 110, c'est assez merdique pour comprendre au premier coup d'oeil la sortie...
42  International / Français / Re: Erreur : avrdude: stk500_getsync(): not in sync: resp=0x00 on: June 26, 2013, 05:31:13 am
si ce sont des cartes avec l'atmega en DIL sur support, tu peux aussi inverser les deux puces sur les cartes et voir si ça change... si c'est toujours la même carte qui fonctionne, alors c'est l'une des deux cartes qui merde (FTDI ?) si l'erreur change de carte, alors c'est un des atmega qui a un soucis par exemple le bootloader manquant.
43  International / Français / Re: projet inutile donc absolument necessaire on: June 25, 2013, 11:51:55 am
ou la tête du patron si c'est lui qui ne sait pas que la roue est pipée smiley-razz
44  International / Français / Re: Erreur : avrdude: stk500_getsync(): not in sync: resp=0x00 on: June 25, 2013, 11:50:59 am
de mon expérience perso, à chaque fois que j'ai eu cette erreur, j'avais un soucis de sélection de la carte dans l'IDE, et comme les différentes cartes n'utilisent pas la même fréquence et/ou le même bootloader, ça provoque ça.

Tu peux aussi essayer de faire manuellement un reset de la carte juste après l'affichage de la taille du programme compilé.
45  International / Français / Re: liaison carte SD par I2C ? on: June 25, 2013, 11:37:23 am
pas con l'openlog trafiqué.

l'eeprom i2c elle est déjà présente puisque intégrée à mon module RTC DS1307. Bon pour le moment, j'essaye déjà de faire marcher la nouvelle carte (détection de rotation moteur améliorée, mais du coup faut que j'utilise les interruptions... dur dur) et détection capacitive de niveau de gasoil (interruptions encore ! ) alors le log on verra plus tard...

c'était plus une question de veille technologique qu'un besoin urgent smiley-razz
Pages: 1 2 [3] 4 5 ... 19