hello
@68tjs: je pense comme toi, mais je n'ai pas pris le temps de regarder.
Vileroi nous a passé un petit prg our calculer le nombre de cycles, je l'ai sauvegardé. dès que j'ai le temps je ferai un test.
Nota: Vileroi n'est pas diplomate, il a raison dans son raisonnement et utilisation du PWM.
(juste la façon de le dire...)
@Bauvaisis:
alors, pour m'en sortir j'ai d'abord créé un signal vilebrequin à 200 Hz et avec les deux dents manquantes
//vilebrequin: fréquence 200HZ
#define PULS 8//portB_0
#define top_Synchro 9//portB_1
int compteur = 0;
int compteur_dents = 0;
long tampon = 148;
bool isr = false;
void setup()
{
pinMode(PULS,OUTPUT); digitalWrite(PULS, HIGH);
pinMode(top_Synchro,OUTPUT); digitalWrite(top_Synchro, HIGH);
cli();
TCCR2A = 0b00000000; //
TCCR2B = 0b00000001; //
TIMSK2 = 0b00000001; //
sei();
isr = true;
}
void loop()
{
}
ISR (TIMER2_OVF_vect)
{
if (isr)
{
TCNT2 = 15;
if (compteur++ >= tampon )
{
compteur = 0;
asm("SBIC 0x05,0");
asm("jmp suite");
compteur_dents++;
if (compteur_dents == 62) {compteur_dents = 0;asm("SBI 0x05,1");asm("jmp fin");}
if (compteur_dents == 61) {asm("jmp fin");}
if (compteur_dents == 60) {asm("jmp fin");}
if (compteur_dents == 59) {asm("CBI 0x05,1");asm("jmp fin");}
//if (compteur_dents == 58) {asm("jmp fin");}
asm("SBI 0x05,0");
asm("jmp fin");
asm("suite:");
asm("CBI 0x05,0");
asm("fin:");
}
}
}
téléversé dans un uno ou nano, pas d'importance
en D8, il sort le signal du villebrequin
en D9, il sort un bit de synchro à chaque tour de volant ( pendant l'absence de dents)
cette platine est raccordée à une deuxième qui fabrique le signal des 3 périodes sur deux tours
donc le D8 entre sur D2 et le D9 entre sur D3
//signal AAC
#define maskAND 0b11111110
#define maskOR 0b00000001
const byte VILO = 2;
const byte AAC = 8;
int compteur_periode=0;
int compte_tour_vilo=0;
void setup()
{Serial.begin(1000000);
pinMode(AAC, OUTPUT);
pinMode (VILO, INPUT);
PORTB &= maskAND;
attachInterrupt(1,isr1, RISING);
attachInterrupt(0,isr0, CHANGE);sei();
}
void loop()
{
}
void isr1()
{Serial.println(compte_tour_vilo);
if((compte_tour_vilo++ %2)){compte_tour_vilo=0;
//compteur_periode=27;//de 0 à 53 pour retarder le signal 66/27 / synchro
compteur_periode=53;//laisser 53 pour avoir le départ signal synchronisé
PORTB &= maskAND;}
}
void isr0()
{
if (compteur_periode++ >=52)
{
asm("SBIC 0x05,0");//saut 1 ligne si bit 0 de port B est à 0
asm("jmp suite"); //sinon saut en etiquette suite
asm("SBI 0x05,0"); //bit 0 du port B passe à 1
compteur_periode=0;
asm("jmp fin"); //saut en fin
asm("suite:"); //étiquette suite
asm("CBI 0x05,0"); //bit 0 du port B passe à 0
compteur_periode=27;//
asm("fin:"); //étiquette fin
}
}
n'ayant pas la précision, j'ai prévu deux lignes dont l'une devra être commentée
//compteur_periode=27;//de 0 à 53 pour retarder le signal 66/27 / synchro
compteur_periode=53;//laisser 53 pour avoir le départ signal synchronisé
celle que je n'ai pas commentée fait une synchro sur le top synchro envoyé
par la platine vilebrequin (un tour sur deux ). il faut lui laisser une valeur de 53.
si tu utilises l'autre ligne, tu feras varier la valeur de 0 à 53.
ce qui retardera d'autant la synchro du signal AAC
sur la copie d'écran jointe:
la trace du haut est le top synchro tous les tours.
la trace du milieu est la trace du vilebrequin avec les deux dents manquantes.
la trace du bas est le signal AAC avec ses trois périodes de 66/33 sur 2 tours vilebrequin
ne pas oublier de relier les deux GND des platines.
en attente de ton retour