Оформи код соответствующим тэгом
Есть код (прикреплен ниже), работает, но в 6/8 случаев.
Может быть код не правильно написан, мб в реализации недечеты.
Пока прошу помочь с кодом, если есть ошибки написания.
В кратце о проге: ардуино получая сигнал с датчика холла определяет обороты коленвала ДВС, и на основании измерения времени между сигналами с датчика холла подает сигнал на коммутатор (pinSpark) для образования искры, т.е., например, имеем время между сигналами с датчика t=0,005с, что соответствует 6000 об/мин, вычисляем время до подачи сигнала на коммутатор: Tign=t-(время прохождения одного градуса * количество градусов (Угол опережения зажигания)).
Т.о. между сигналами с датчика холла подается сигнал на коммутатор и т.д.
int uozbyrpm [6][10]={
{ 5, 5, 5, 5, 5,5 ,5 ,5 ,5 ,5 }, // rpm: [0;999]
{6 ,6 ,7 ,8 ,8 ,9 ,10,10,11,11}, // rpm: [1000;1999]
{12,12,13,14,14,15,16,16,17,17}, // rpm: [2000;2999]
{18,18,19,19,20,20,21,21,22,22}, // rpm: [3000;3999] обороты коленчатого вала
{23,23,24,24,25,25,26,26,27,27}, // rpm: [4000;4999]
{27,27,27,27,27,27,27,27,27,27} // rpm: [5000;5980]
};
unsigned int rpm;
byte x,y,pinSpark=10; //pinSpark - пин для открытия оптрона
volatile unsigned long lastflash,p,i; //Tign - время до подачи сигнала на катушку
volatile unsigned long t,tz,Tign;
boolean f=1;
void setup(){
Serial.begin(9600);
attachInterrupt(0,sens,FALLING);
pinMode(pinSpark,OUTPUT); //устанавливает режим выхода на пин для катушки
pinMode(12,OUTPUT); //устанавливает режим выхода на 12 пин
digitalWrite(12,HIGH); //подает 5 вольт на 12 пин (для оптопары)
Serial.print("RPM ");
Serial.print("t ");
Serial.print("Угол зажи ");
Serial.println("Tign");
}
void sens(){
t=(micros()-lastflash); //время между данными с датчика Холла
rpm=30/((float)(t)/1000000); //расчет оборотов
f=1;
lastflash=micros(); //запоминает время
}
void loop (){
if(rpm<5980){ //если обороты двигателя больше 5980, то искра не подается (отсечка)
if (f==1){
x=rpm/1000; //вычисление строки массива с углами зажигания
y=(rpm%1000)/100; //вычисление столбца массива с углами зажигания
Tign=t-((float)uozbyrpm[x][y]0.5((float)(t)/90)); //расчет задержки до подачи сигнала на катушку
tz=(t/90)*10; //длительность подачи сигнала на катушку
delayMicroseconds(Tign); //задержка до подачи сигнала на катушку
digitalWrite(pinSpark,HIGH); //подача сигнала на катушку
delayMicroseconds(1000); //длительность подачи сигнала на катушку
digitalWrite(pinSpark,LOW);
f=0;
Serial.print(rpm);
Serial.print(" ");
Serial.print(t);
Serial.print(" ");
Serial.print(uozbyrpm[x][y]);
Serial.print(" ");
Serial.println(Tign);
}
}
}
Может быть код не правильно написан, мб в реализации недечеты.
Пока прошу помочь с кодом, если есть ошибки написания.
В кратце о проге: ардуино получая сигнал с датчика холла определяет обороты коленвала ДВС, и на основании измерения времени между сигналами с датчика холла подает сигнал на коммутатор (pinSpark) для образования искры, т.е., например, имеем время между сигналами с датчика t=0,005с, что соответствует 6000 об/мин, вычисляем время до подачи сигнала на коммутатор: Tign=t-(время прохождения одного градуса * количество градусов (Угол опережения зажигания)).
Т.о. между сигналами с датчика холла подается сигнал на коммутатор и т.д.
int uozbyrpm [6][10]={
{ 5, 5, 5, 5, 5,5 ,5 ,5 ,5 ,5 }, // rpm: [0;999]
{6 ,6 ,7 ,8 ,8 ,9 ,10,10,11,11}, // rpm: [1000;1999]
{12,12,13,14,14,15,16,16,17,17}, // rpm: [2000;2999]
{18,18,19,19,20,20,21,21,22,22}, // rpm: [3000;3999] обороты коленчатого вала
{23,23,24,24,25,25,26,26,27,27}, // rpm: [4000;4999]
{27,27,27,27,27,27,27,27,27,27} // rpm: [5000;5980]
};
unsigned int rpm;
byte x,y,pinSpark=10; //pinSpark - пин для открытия оптрона
volatile unsigned long lastflash,p,i; //Tign - время до подачи сигнала на катушку
volatile unsigned long t,tz,Tign;
boolean f=1;
void setup(){
Serial.begin(9600);
attachInterrupt(0,sens,FALLING);
pinMode(pinSpark,OUTPUT); //устанавливает режим выхода на пин для катушки
pinMode(12,OUTPUT); //устанавливает режим выхода на 12 пин
digitalWrite(12,HIGH); //подает 5 вольт на 12 пин (для оптопары)
Serial.print("RPM ");
Serial.print("t ");
Serial.print("Угол зажи ");
Serial.println("Tign");
}
void sens(){
t=(micros()-lastflash); //время между данными с датчика Холла
rpm=30/((float)(t)/1000000); //расчет оборотов
f=1;
lastflash=micros(); //запоминает время
}
void loop (){
if(rpm<5980){ //если обороты двигателя больше 5980, то искра не подается (отсечка)
if (f==1){
x=rpm/1000; //вычисление строки массива с углами зажигания
y=(rpm%1000)/100; //вычисление столбца массива с углами зажигания
Tign=t-((float)uozbyrpm[x][y]0.5((float)(t)/90)); //расчет задержки до подачи сигнала на катушку
tz=(t/90)*10; //длительность подачи сигнала на катушку
delayMicroseconds(Tign); //задержка до подачи сигнала на катушку
digitalWrite(pinSpark,HIGH); //подача сигнала на катушку
delayMicroseconds(1000); //длительность подачи сигнала на катушку
digitalWrite(pinSpark,LOW);
f=0;
Serial.print(rpm);
Serial.print(" ");
Serial.print(t);
Serial.print(" ");
Serial.print(uozbyrpm[x][y]);
Serial.print(" ");
Serial.println(Tign);
}
}
}
Вложения
-
2.9 KB Просмотры: 3
Изменено: