This commit is contained in:
grouch 2017-04-14 10:57:12 +02:00
parent c7bc68bee2
commit d0562b438d
1 changed files with 70 additions and 35 deletions

View File

@ -4,6 +4,9 @@ char Ver[] = "CG140417";
//Ceci autorise un éventuel retard à l'allumage
//Nota: tracer un repère à 180° sur la poulie pour un 2 temps
#include "TimerOne.h"
#include <Encoder.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd( 9, 17, 15, 16, 14, 10);
//lcd(RS, E, D4, D5, D6, D7)
@ -16,32 +19,40 @@ const int temps = 2; // 4 pour 4temps ou 2 pour 2temps
const int D_Flash = 10; //Durée du flash en µs, autour de 10µs
const int deg_Initial = 10; //Affiché au demarrage
const bool ON = 1; // 1 pour décl par front montant 0 pour front descendant
const int Ncyl = 2;
const int Refresh = 100;
#define Etin 2
#define Inter 5 //Inter du codeur
#define Flash 11 //Flash
#define Codeur_A 3 //D2 pour entrée codeur A sous interruption
#define Codeur_B 4 //D3 pour entrée codeur B
#define LED13 13
const int tcor1 = 10; //Correctif attente avant flash en µs, N>6000t/mn 4 temps
const int tcor2 = 70; //Correctif attente avant flash en µs, N<6000t/mn 4 temps
//const int tcor1 = 10; //Correctif attente avant flash en µs, N>6000t/mn 4 temps
//const int tcor2 = 70; //Correctif attente avant flash en µs, N<6000t/mn 4 temps
const int degT = 720 / Ncyl; // Degrés entre 2 étincelles
//------------------------------------------------------------
// VARIABLES
//------------------------------------------------------------
int cycle = temps; // 4 pour 4temps ou 2 pour 2temps
Encoder Enco(Codeur_A, Codeur_B);
//int cycle = temps; // 4 pour 4temps ou 2 pour 2temps
int signed long T = 0; //Periode en cours(signée pour le calcul de D_deg)
int signed long Ts2 = 0; //Periode en cours/2
//int signed long Ts2 = 0; //Periode en cours/2
int unsigned long prec_H = 0; //Heure du front precedent en µs
int unsigned long D_deg = 0; //Délai pour deg_dem degrès en µs,environ T/2, donc tj > 0
int unsigned long N = 0; //N en tours/mn, peut monter à plus de 44 000, 4 temps
int unsigned long Nc = 0; //Pour le calcul de N
int signed deg_dem = 0; //Compteur des degrés demandés,affiché au LCD, <=0 possible
int signed deg_Inc = 0; //Increment en degrès 0,-1ou +1
int T_min = 20000; //En µs,lié à limite de la fonction delayMicroseconds() <16383
int milli_delay = 0; //Delai en ms, T > T_min
int micro_delay = 0; //Delai en µs, T > T_min
volatile int signed deg_dem = deg_Initial; //Compteur des degrés demandés,affiché au LCD, <=0 possible
//int signed deg_Inc = 0; //Increment en degrès 0,-1ou +1
//int T_min = 20000; //En µs,lié à limite de la fonction delayMicroseconds() <16383
//int milli_delay = 0; //Delai en ms, T > T_min
//int micro_delay = 0; //Delai en µs, T > T_min
unsigned long pm = 0;
int debug = 0; //Variable pour debug, optionelle
@ -49,15 +60,37 @@ int debug = 0; //Variable pour debug, optionelle
// FONCTIONS
//-------------------------------------------------------------
void isrEtincelle() {
T = micros() - prec_H; // Calculer T
prec_H = micros(); // Heure de début prochaine periode
Timer1.initialize(D_deg); // Flash après delai D_deg µs
}
void isrFlash(){
Timer1.stop();
//Flash et flash sur LED13
digitalWrite (Flash, 1); delayMicroseconds(D_Flash); digitalWrite (Flash, 0);
digitalWrite (LED13, 1); delayMicroseconds(10 * D_Flash); digitalWrite (LED13, 0);
//Délai en µs pour les degrés demandés, periode suivante
D_deg = float(T * deg_dem) / float(degT);
}
/*void isrRotation_Codeur ()
{ if (digitalRead(Codeur_A) == digitalRead(Codeur_B))
deg_dem++; //On tourne dans le sens horaire
else deg_dem--; //On tourne dans le sens anti-horaire
}*/
void Affic_N_et_deg_dem() //Fond d'ecran inchangé,durée environ 7.5ms
{ N = Nc / T ; //Calculer N en t/mn, 2 ou 4temps
lcd.setCursor(0, 0); lcd.print(" "); //Nettoyer
lcd.setCursor(0, 0); lcd.print(N);
lcd.setCursor(0, 1); lcd.print(" "); //Nettoyer
lcd.setCursor(0, 1); lcd.print(deg_dem);
deg_dem = deg_dem + deg_Inc; //Si le codeur a été tourneé, deg_Inc = +1 ou -1
//deg_dem = deg_dem + deg_Inc; //Si le codeur a été tourneé, deg_Inc = +1 ou -1
}
/*
void Delai_et_Flash() //Delai puis flash
{
if (T < T_min) //Verifier si la fonction dalayMicroseconds() est suffisante
@ -74,9 +107,14 @@ void Delai_et_Flash() //Delai puis flash
digitalWrite (Flash, 1); delayMicroseconds(D_Flash); digitalWrite (Flash, 0);
}
}
*/
void IniT() {
attachInterrupt(digitalPinToInterrupt(Codeur_A), isr_Rotation_Codeur, FALLING);
//attachInterrupt(digitalPinToInterrupt(Codeur_A), isrRotation_Codeur, FALLING);
attachInterrupt(digitalPinToInterrupt(Etin), isrEtincelle, RISING);
Timer1.attachInterrupt(isrFlash); //Emet un flash, Ddeg après Etin
Timer1.stop();
lcd.clear();
lcd.print("Strobo");
lcd.setCursor(3, 1);
@ -93,52 +131,49 @@ void IniT() {
lcd.print("tpm");
lcd.setCursor(5, 1);
lcd.print("deg");
Nc = 30000000 * cycle; //Pour calcul de N à partir de T
cycle = cycle * 180; // 360 pour 2 temps, 720 pour 4 temps, dans calcul de D_deg
deg_dem = deg_Initial;
Enco.write(deg_Initial);
Nc = 120000000 / Ncyl;
//Nc = 30000000 * cycle; //Pour calcul de N à partir de T
//cycle = cycle * 180; // 360 pour 2 temps, 720 pour 4 temps, dans calcul de D_deg
//deg_dem = deg_Initial;
T = 150000;
D_deg = T / 2; //Pour le premier affichage de N
Affic_N_et_deg_dem();
}
void isr_Rotation_Codeur ()
{ if (digitalRead(Codeur_A) == digitalRead(Codeur_B))
deg_Inc = 0; //On tourne dans le sens horaire
else deg_Inc = 0;//-1; //On tourne dans le sens anti-horaire
}
void setup() {
Serial.begin(9600); //Pour debug
lcd.begin(8, 2);
//pinMode(Etin, INPUT_PULLUP); // Entrée du front mise à la masse par le thyristor
pinMode(Etin, INPUT);
pinMode(Inter, INPUT_PULLUP); // Le codeur met son inter à la masse quand poussé
pinMode(Flash, OUTPUT); // Sortie vers la led
pinMode(Codeur_A, INPUT_PULLUP);
pinMode(Codeur_B, INPUT_PULLUP);
pinMode(Inter, INPUT_PULLUP); // Le codeur met son inter à la masse quand poussé
IniT();
}
void loop()
{
while (digitalRead(Etin) == !ON); //Attendre étincelle
prec_H = micros(); //heure de début de cette periode
Delai_et_Flash(); //Emettre le flash après attente D_deg
// pc(T);pc(D_deg);
while (digitalRead(Etin) == ON);
while (digitalRead(Etin) == !ON); //Attendre étincelle
T = micros() - prec_H; //Calculer T
Delai_et_Flash(); //Emettre le flash après attente D_deg
Ts2 = T / 2; //On emettra le flash environ 360° après l'étincelle (4temps) ou 180°(2 temps)
D_deg = float(T * deg_dem) / float(cycle) + Ts2; //Délai en µs pour les degrés demandés,2 ou 4 temps
Affic_N_et_deg_dem(); //Cette fonction dure 7.5ms environ, donc à partir de 8000t/mn(4temps)
//l'étincelle immédiatement suivante n'est pas detectée donc le flash manque 1 fois sur 3.
deg_Inc = 0; //RAZ de l'increment des degrés
//Ts2 = T / 2; //On emettra le flash environ 360° après l'étincelle (4temps) ou 180°(2 temps)
//D_deg = float(T * deg_dem) / float(cycle) + Ts2; //Délai en µs pour les degrés demandés,2 ou 4 temps
if (millis() - pm > Refresh) {
Affic_N_et_deg_dem();
pm = millis();
deg_dem = Enco.read();
}
if (digitalRead(Inter) == 0) //Si l'inter du codeur est poussé, geler l'affichage
{ delay(1000); while (digitalRead(Inter) == 0); //Encore poussé, attendre
delay(500); //Continuer
delay(100); //Continuer
}
while (digitalRead(Etin) == ON); //Attendre remontée du signal d'etincelle
}
//**********************************************************