krinnerrussia.ru

Подарок - Кино в Новокузнецке - Афиша 4geo

Подарок - Кино в Новокузнецке - Афиша 4geo

Всем здравствуйте! Пытаюсь разработать сабж на Arduino Nano, вклинивающийся в бесконтактную систему зажигания.

Сигнал о совершившемся обороте берётся с датчика Холла (типа того, что в ВАЗах), соответственно если устройство включено, то оно "подменяет" сигнал датчика Холла похожим, но один из фронтов чуть-чуть отодвигается в зависимости от числа оборотов. На выводе 4-10 висят семисегментные, 12 переключает их (динамическая индикация, вывод 11 отказался подчиняться), на выводе 2 - прерывание от датчика (задний фронт), вывод 3 в теории должен выдавать сигнал, похожий на сигнал с датчика, однако увы. Система не работает ни в эмуляторе (например, протеусе), ни в макете (для генерации импульсов использовал вторую - Uno).

На диаграмме в эмуляторе замечал, что система пропускает прерывания, но у меня есть основания полагать что я исправил эту проблему. Суть была в том, что я неоднократно использовал micros() для уточнения времени, а в ней запрещается прерывание функцией cli().

В чём ещё может быть проблема?

 

unsigned char indicator,sel,digit[2]; //выбор индикатора и 2 отображаемые цифры unsigned int i,debug,debug2; //служебные unsigned long preInter,inter; //переменные для опроса unsigned int freq; //частота вращения коленвала/генератора unsigned long prevPeriod,period; //период вращения (+предыдущий) volatile char engine; //состояние двигателя unsigned long tCur,tSw; //время текущее, перекл индикатора unsigned long tHall,tHallPrev,eval; //время получения сигналов с датчика Холла unsigned long tSignalStart,tSignalEnd; //время сигнала подмены датчика Холла volatile char flag; // признак оборота ... ISR(INT0_vect){ cli(); engine=1; //двигатель работает flag=1; //произошел оборот sei(); } void setup() { delay(750); //DDRD=DDRD|0xF8; //вывод на 3..7 DDRD=DDRD|0xFB; //вывод на 0,1,3..7 (0 и 1 лишь использовались для теста на эмуляторе) DDRB=DDRB|0x1F; //вывод на 8..11 + управл DDRD=DDRD&0x04; //ВХОД на D2. Для "допрерывания" eval=0; tCur=micros(); tSw=tCur; freq=0; indicator=0; //начальный отсчет для динамической индикации sel=0; //attachInterrupt(0, detect, FALLING); //Прерывание на D2 по ЗАДНЕМУ ФРОНТУ EICRA |= (1<<ISC01); //хардкорный способ EIMSK |=(1<<INT0); flag=0; engine=0; inter=PIND&0x04; //прочесть ногу D2 preInter=inter; prevPeriod=0; //изначальные периоды оборотов - сброс period=0; tHall=0; tHallPrev=0; tSignalStart=0; tSignalEnd=0; } ... void ignitionCalc(){ //формирование угла опережения зажигания (???) tHallPrev=tHall; tHall=tCur; //micros(); //уточнить текущий момент времени //-- Попробовать прикинуть задержку if(tHallPrev){ //если частоту вращения уже можно вычислить if(!prevPeriod){ //но еще не разницу между периодами period=tHall-tHallPrev; //получим период prevPeriod=period; } else{ //если период n-1 - не "пустышка" prevPeriod=period; period=tHall-tHallPrev; //получим период } freq=(1000000/period)60; //оборотов в минуту для отображения на экране tSignalStart=(period/3)+tHall; tSignalEnd=(2period/3)-(1250+(prevPeriod-period))+tSignalStart; //вычисление длительности импульса (+опережение) 1250 поменять } } void loop(){ tCur=micros(); //текущее время if(tCur>=tSignalStart&&tCur<tSignalEnd) PORTD=PORTD|0x08; //установить на pin 3 сигнал (коммутатору) if(tCur>=tSignalEnd) PORTD=PORTD&0xF7; //снять с pin 3 сигнал //индикация if(tCur>tSw+10000){ //если время переключиться ... } if(!flag){ //отлов пропущенных прерываний cli(); inter=PIND&0x04; if(!inter&&preInter) { //задний фронт flag=1; engine=1; } preInter=inter; sei(); } if(flag&&engine){ //если на прерывание надо отреагировать и двигатель работает ignitionCalc(); flag=0; } //tCur=micros(); eval=tHall+1500000; if(tCur>eval&&engine){ //если 1.5 сек не было оборотов engine=0; //двигатель не работает freq=0; //сброс всего flag=0; prevPeriod=0; //либо наоборот сделать много? period=0; tHall=0; tHallPrev=0; tSignalStart=0; tSignalEnd=0; } }

 

 

Оформление сд диска своими руками фото
Оформление сд диска своими руками 9
Оформление сд диска своими руками 63
Оформление сд диска своими руками 38
Оформление сд диска своими руками 68
Оформление сд диска своими руками 4
Оформление сд диска своими руками 15
Оформление сд диска своими руками 9
Оформление сд диска своими руками 12
Оформление сд диска своими руками 20
Оформление сд диска своими руками 78
Оформление сд диска своими руками 22
Оформление сд диска своими руками 60
Оформление сд диска своими руками 25
Оформление сд диска своими руками 22
Оформление сд диска своими руками 62
Оформление сд диска своими руками 96
Оформление сд диска своими руками 9
Оформление сд диска своими руками 6
Оформление сд диска своими руками 76
Оформление сд диска своими руками 4
  • Поделки из крышек пластмассовых бутылок
  • Открытки для денег цена
  • Слова поздравления учителю с днем рождения
  • Топор кратоса своими руками
  • Шпатлевка для пластика своими руками
  • Газонокосилка из бензотриммера своими руками