2 страниц V  < 1 2  
 
> Втек контроллер на популярном attiny, простенький
 Starick
сообщение 10.12.11 - 14:18
Сообщение #21


Хондавод
*

Группа: .Хондаводы.
Сообщений: 125
Имя: Игорь
Город: Украина, Николаев.
Машина: Civic, MA9, D15Z3.

Репутация: 10



Ну что ж.....я тоже вставлю свои 5 копеек. Усреднение тахометра лучше делать не средним арифметическим, а "скользящим окном", тогда не будет разрывов в усредненных значениях, да и помехоустойчивость увеличивается. Немного изменил бы схемотехнику, так как устройство будет работать в цепи автомобиля, где присутствует большое количество помех и импульсов, что может привести к ложным срабатываниям прерывания по ICP. В софте тоже не мешало бы при опросе состояния датчика давления предусмотреть помехоподавление, так как можно поймать не истинное состояние датчика, а помеху. И т.д.
З.Ы. На tiny13 рекомендую забить, так как довольно урезанный девайс и по оперативке и по флеше. Лучше взять Мегу, хотя бы 8. На ней уже вполне можно реализовать свои идеи.

Сообщение отредактировал Starick - 10.12.11 - 14:25



           
 Renemen
сообщение 11.12.11 - 06:50
Сообщение #22


Хондавод
*

Группа: .Хондаводы.
Сообщений: 658
Имя: Илья
Город: Екатеринбург
Машина: Accord CH7 2.0iES МТ '99

Репутация: 19



Цитата(Starick @ 10.12.11 - 17:18 ) *
З.Ы. На tiny13 рекомендую забить, так как довольно урезанный девайс и по оперативке и по флеше. Лучше взять Мегу, хотя бы 8. На ней уже вполне можно реализовать свои идеи.

Ну может и урезанный, но для 8 ног, вполне себе) для моей задачи, отключать и включать клапан IAB, самое то. 1к памяти должно хватить, я думаю. .).gif Хотя есть еще attiny25/45/85




           
 Mayhem
сообщение 11.12.11 - 08:31
Сообщение #23


Хондавод
*

Группа: .Хондаводы.
Сообщений: 625
Имя: Андрей
Город: Сороковка
Машина: EG8 VTEC JDM

Репутация: 21



Starick, я не силён в электронике, только начал её изучать.
опиши, как бы ты сделал, мне тоже это интересно.



           
 Renemen
сообщение 13.12.11 - 06:53
Сообщение #24


Хондавод
*

Группа: .Хондаводы.
Сообщений: 658
Имя: Илья
Город: Екатеринбург
Машина: Accord CH7 2.0iES МТ '99

Репутация: 19



Эхх, век живи-век учись)
Написал программку под Attiny13 на басике, в протеусе все пучком работает, собрал, поставил в мозги - одни глюки)) включается-отключается вообще хаотически) стабильно только на холостых))
Видать помех дофига.. видать надо на прерывании сделать, что-то вроде задержки, как от дребезга кнопки.



           
 Starick
сообщение 13.12.11 - 13:29
Сообщение #25


Хондавод
*

Группа: .Хондаводы.
Сообщений: 125
Имя: Игорь
Город: Украина, Николаев.
Машина: Civic, MA9, D15Z3.

Репутация: 10



Я же предупреждал.... biggrin.gif . Попробую набросать на днях схемотехнику, как бы я сделал.



           
 Renemen
сообщение 14.12.11 - 08:14
Сообщение #26


Хондавод
*

Группа: .Хондаводы.
Сообщений: 658
Имя: Илья
Город: Екатеринбург
Машина: Accord CH7 2.0iES МТ '99

Репутация: 19



Вот такая не замысловатая схемка у меня в итоге получилась:
Прикрепленное изображение


Это типа 2я версия, немного доработал программку:
Содержание:
Код
$regfile = "attiny13.dat"
$crystal = 1200000

Config Pinb.1 = Input
Config Pinb.3 = Output
Config Pinb.4 = Output
Config Int0 = Falling
Config Timer0 = Timer , Prescale = 64                       'конфигурируем таймер на счет тактовых импульсов с делителем на 64
Dim Timovfcont As Byte                                      'т.к. таймер 8 битный нужна переменная для счета переполнений(старшего разряда)
Dim Rpm As Word
Dim Impbit As Bit
Dim Temp1 As Word
Dim Temp2 As Byte
                                                             'Инициализация переменных и прерываний
On Int0 Int0_int
On Timer0 Tim0_ovf                                          'Конфигурация сторожевой собаки на срабатывание после 1024мс
Config Watchdog = 1024
Portb.3 = 1
Portb.4 = 1
Rpm = 0
Impbit = 0
Timovfcont = 0
Enable Int0                                                 'Запуск прерываний
Enable Timer0
Enable Interrupts
Start Watchdog

Do
  If Rpm > 4200 Then Portb.3 = 0                            'Сравниваем обороты, если больше 4200, то отключаем клапан IAB
  If Rpm < 3800 Then Portb.3 = 1                            'Если меньше 3800 то включаем обратно
  Reset Watchdog                                            'Не забываем обнулить таймер собачки
Loop


Int0_int:                                                   'Прерывание по приходу импульса

   Temp2 = Timer0                                            'Запоминаем время
   Timer0 = 0                                               'Обнуляем таймер
   Temp1 = Timovfcont * 256                                 'Вычисляем страший разряд таймера
   Temp1 = Temp1 + Temp2                                    'Прибавляем младший
   Timovfcont = 0
   If Temp1 > 47 Then                                       'Если импульс меньше 330 Гц, вычисляем обороты
      If Impbit = 1 Then                                    'Ждем 2го хорошего импульса
         Rpm = 18750 / Temp1                                'Вычисляем
         Rpm = Rpm * 30
         Portb.4 = 0                                        'Гасим лампочку
      End If
      Impbit = 1
   Else
      Impbit = 0                                            'Короткий импульс-помеха, зажигаем лампочку.
      Portb.4 = 1
   End If
Return

Tim0_ovf:                                                   'Таймер переполнился, прибавляем старший разряд

   If Timovfcont > 7 Then                                   'Если импульсов долго небыло, обнуляем счетчик, зажигаем лампочку
      Rpm = 270                                             'Думаем, что обороты слишком низкие
      Impbit = 0
      Timovfcont = 0
      Portb.4 = 1
   Else
      Timovfcont = Timovfcont + 1
   End If
Return


Сейчас уже работает вполне стабильно, добавил еще тестовую лампочку, режутся импульсы ниже 9 Гц и выше 330 Гц (270-10000 об.) когда такое происходит лампочку сигнализирует об этом, но при этом такие импульсы фильтруются и не влияют на переключение.
Но, печально что такие импульсы все же прилетают примерно где то на 2000 об. лампочка помаргивает, скорее всего прилетают какие то короткие импульсы, либо мк перезагружается.
Импульсы я беру с выхода на тахометр А19, выход слабенький какой то, возможно стоит попробовать выход на коммутатор, но не понятно, при торможении двигателем, не отрубается ли зажигание. Питание беру +5В от внутреннего стабилизатора мозгов для датчиков (MAP, TPS и т.п.), через дроссель и кондер на 47мкФ.
Пожалуй, тинька13 в данном применении - не самый лучший вариант.. все-же внешний кварц(нужно внешний генератор) не помешал бы, да и внутренний функционал довольно бедный, но блин зато в отличии от тиньки 2313, у 13 есть ацп. Вот ведь, почему в 2313 его нету..

Комплект файликов исходники на басике и схема для протеуса:
Прикрепленный файл  Honda_IAB_13_12_2011.zip ( 44,53 килобайт ) Кол-во скачиваний: 36



           
 Renemen
сообщение 14.12.11 - 13:59
Сообщение #27


Хондавод
*

Группа: .Хондаводы.
Сообщений: 658
Имя: Илья
Город: Екатеринбург
Машина: Accord CH7 2.0iES МТ '99

Репутация: 19



Блин, понял почему моргает на 2000.. это борьба прерываний внешнего и таймера в аккурат на 73 герцах, вот ведь sad.gif
Снятие фузы CKDIV8 и работа на 9,6Мгц, вместо 1,2Мгц, решает проблему, во всяком случае резко снижает вероятность возникновения конфликта.



           
 Mayhem
сообщение 14.12.11 - 14:01
Сообщение #28


Хондавод
*

Группа: .Хондаводы.
Сообщений: 625
Имя: Андрей
Город: Сороковка
Машина: EG8 VTEC JDM

Репутация: 21



экологи не допустят рубилово зажигания на ПХХ.
обороты вычисляются по одному импульсу, не мало? может складывать несколько интервалов и делить на их количество?

ещё не понял как у тебя настроено прерывание от импульса, по переднему фронту или по обоим? если по переднему, как ты определяешь длину импульса?

почему лампочка, а не СД? СД можно питать прям от МК без транзистора.

может всё таки добавить контроль давления масла? а то иабКонтроллер мало кому нужен, а втекКонтроллер периодически спрашивают.



           
 Renemen
сообщение 14.12.11 - 14:42
Сообщение #29


Хондавод
*

Группа: .Хондаводы.
Сообщений: 658
Имя: Илья
Город: Екатеринбург
Машина: Accord CH7 2.0iES МТ '99

Репутация: 19



Цитата(Mayhem @ 14.12.11 - 17:01 ) *
экологи не допустят рубилово зажигания на ПХХ.
обороты вычисляются по одному импульсу, не мало? может складывать несколько интервалов и делить на их количество?

ещё не понял как у тебя настроено прерывание от импульса, по переднему фронту или по обоим? если по переднему, как ты определяешь длину импульса?

почему лампочка, а не СД? СД можно питать прям от МК без транзистора.

может всё таки добавить контроль давления масла? а то иабКонтроллер мало кому нужен, а втекКонтроллер периодически спрашивают.

Как то не задумывался о пхх, но ведь и топливо не льется.. ну, в общем глюки как выяснилось из-за конфликта прерываний, а не от помех, так что идеологически правильно подключаться именно к тахометру. .).gif

На счет складывать, надо подумать, но если и закрадется помеха, на результат она все равно повлияет, а много складывать долго, частота импульсов низкая.
Прерывание по спаду настроено, получается измеряется период от спада до следующего спада.
На счет лампочки - у меня она на приборке от иммобилайзера, которого щас нету .).gif
На счет втека - ты же сделал уже) все чотка работать должно



           
 Renemen
сообщение 14.12.11 - 17:17
Сообщение #30


Хондавод
*

Группа: .Хондаводы.
Сообщений: 658
Имя: Илья
Город: Екатеринбург
Машина: Accord CH7 2.0iES МТ '99

Репутация: 19



Ну вот, немного переделал программку, обороты вычисляются по 3м импульсам
Содержание:
Код
$regfile = "attiny13.dat"
$crystal = 9600000

Config Pinb.1 = Input
Config Pinb.3 = Output
Config Pinb.4 = Output
Config Int0 = Falling
Config Timer0 = Timer , Prescale = 1024
Dim Timovfcont As Byte
Dim Rpm As Word
Dim Impbit As Bit
Dim Time1 As Byte
Dim Time2 As Byte
Dim Time3 As Word
Dim Time4 As Word
Dim Time5 As Word

On Int0 Int0_int
On Timer0 Tim0_ovf
Config Watchdog = 1024
Portb.3 = 1
Portb.4 = 1
Timovfcont = 0
Time4 = 0
Time5 = 0
Enable Int0
Enable Timer0
Enable Interrupts
Start Watchdog

Do
   If Impbit = 1 Then
      Disable Int0
      Time3 = Time2 * 256
      Time3 = Time3 + Time1
      Enable Int0
      If Time3 > 25 Then
         Rpm = Time3 + Time4
         Rpm = Rpm + Time5
         Rpm = 28125 / Rpm
         Rpm = Rpm * 30
         If Rpm > 4200 Then Portb.3 = 0
         If Rpm < 3800 Then Portb.3 = 1
         Time5 = Time4
         Time4 = Time3
      Else
         Waitms 50
         Portb.4 = 1
         Waitms 50
      End If
      Portb.4 = 0
      Impbit = 0
   End If
   Reset Watchdog
Loop


Int0_int:

   Stop Timer0
   Time1 = Timer0
   Time2 = Timovfcont
   Impbit = 1
   Timer0 = 0
   Timovfcont = 0
   Gifr = 64
   Start Timer0
Return

Tim0_ovf:

   Incr Timovfcont
   If Timovfcont > 5 Then
      Timovfcont = 3
      Portb.4 = 1
      Portb.3 = 1
   End If
Return



Прикрепленные файлы
Прикрепленный файл  attiny13.zip ( 1,15 килобайт ) Кол-во скачиваний: 20
 



           
 Mayhem
сообщение 14.12.11 - 19:14
Сообщение #31


Хондавод
*

Группа: .Хондаводы.
Сообщений: 625
Имя: Андрей
Город: Сороковка
Машина: EG8 VTEC JDM

Репутация: 21



теперь лучше.

Цитата
но ведь и топливо не льется..

горючка продолжает испаряться со стенок коллектора какое-то время после прекращения впрыска, если её не дожигать, она убьёт катализатор и ДК.



           
 Renemen
сообщение 14.12.11 - 20:14
Сообщение #32


Хондавод
*

Группа: .Хондаводы.
Сообщений: 658
Имя: Илья
Город: Екатеринбург
Машина: Accord CH7 2.0iES МТ '99

Репутация: 19



Я вот чего подумал, для полноценного контроллера втека, неплохо было бы сделать порог срабатывания не просто по оборотам, а по оборотам и датчику ДЗ например, если педаль нажата больше 40% втек можно включить пораньше типа на 2500, а принудительно включать уже скажем на 3000 и выше. Тока для этого нужен АЦП, у 2313 его нету. Есть аналоговый компаратор, можно его использовать, но уже не так удобно, нужно опорное напряжение.



           
 Starick
сообщение 14.12.11 - 20:26
Сообщение #33


Хондавод
*

Группа: .Хондаводы.
Сообщений: 125
Имя: Игорь
Город: Украина, Николаев.
Машина: Civic, MA9, D15Z3.

Репутация: 10



Цитата(Renemen @ 14.12.11 - 13:42 ) *
ну, в общем глюки как выяснилось из-за конфликта прерываний, а не от помех, так что идеологически правильно подключаться именно к тахометру. .).gif

Глюки не могут быть по прерыванию. Даже если и возникают прерывания одновременно, то сначала вызывается один обработчик прерывания, после того как с ним работа закончилась, вызывается второй обработчик. Одновременно два или несколько обработчиков вызываться не может. Здесь нет понятия потоков и параллельная обработка данных. Все операции делаются "в одном потоке".

Цитата(Renemen @ 14.12.11 - 13:42 ) *
На счет складывать, надо подумать, но если и закрадется помеха, на результат она все равно повлияет, а много складывать долго, частота импульсов низкая.

Я в таких случаях считаю не количество импульсов за время, а период импульса. При этом за одно измерение я имею уже сведения о частоте. Плюс к этому фильтр "скользящее окно". При этом возникает проблема операции деления, которая компилятором уже заменяется на умножение. Так как числа довольно большие оперируют (на фоне компа это мизер полный), то тут возникает проблема с нехваткой ОЗУ проца. Поэтому, еще раз подчеркну, возьмите проц помощнее.
Вот быстро отредактировал схему для ИАБ. Так как не было времени это все украшать, поэтому от руки.
На других схемах нарисованы формирователи импульса. Я пользуюсь третим способом во всех своих изделиях, так как довольно простой и надежный.




Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
 



           
 Renemen
сообщение 15.12.11 - 06:48
Сообщение #34


Хондавод
*

Группа: .Хондаводы.
Сообщений: 658
Имя: Илья
Город: Екатеринбург
Машина: Accord CH7 2.0iES МТ '99

Репутация: 19



Цитата(Starick @ 14.12.11 - 23:26 ) *
Глюки не могут быть по прерыванию.

В моем случае, еще как могут. Дело в том, частота процессора была низкой, а обработка прерываний достаточно сложной. Самая засада в том, что таймер 8 битный, мне пришлось использовать прерывание по таймеру, и ввести еще 1 переменную для 2го разряда. Вот и получаются глюки, когда частота импульсов совпадает с частотой переполнения таймера - 73 Гц, в протеусе - это видно. Я, для эксперимента даже вообще по 1-2 комане в обработчиках ставил, проблему это не решило, тока увеличение тактовой частоты проца спасло, даже если поставить 4,8 Мгц, и период переполнения таймера оставить таким же, глюки, как рукой снимает. .).gif

Цитата(Starick @ 14.12.11 - 23:26 ) *
Я в таких случаях считаю не количество импульсов за время, а период импульса. При этом за одно измерение я имею уже сведения о частоте.

Именно так я и сделал, таймер в режиме счетчика тактовых импульсов, когда приходит импульс, запоминается время и обнуляется счетчик.
На счет фильтра почитаю, что это за "оконо" такое, не слышал ни разу) Памяти конечно мало, самое смещное что тинька 13 стоит столько же сколько и 45я, там фишки те же и памяти 4к. Я купил обе, для пробы, возможно переключусь на 45ю ) просто 13ю тоже надо как-то использовать, раз купил ужо)) сейчас прога занимает 90% памяти, вроде вполне работает даже, сегодня испытаю в полевых условиях.
Зато на 45й можно добавить считывание напряжение с датчиков TPS и MAP, если мутить контроллер втека, очень полезно будет.. можно даже некое подобие карты сделать.

ЗЫ: фильтр 3, хорошо, но надо ваять плату под него, навесным монтажем(как у меня сейчас) - будет не айс) закажу пожалуй у китайцев макетки..




           
 Mayhem
сообщение 15.12.11 - 21:04
Сообщение #35


Хондавод
*

Группа: .Хондаводы.
Сообщений: 625
Имя: Андрей
Город: Сороковка
Машина: EG8 VTEC JDM

Репутация: 21



на сколько я понимаю скользящее окно - это, в простейшем случае, циклический буфер от которого берётся среднее.

переделал свою прогу под скользящее окно, привожу только изменённые строки:
Содержание:
Код
unsigned int buffer[8];    

ISR(TIMER1_CAPT_vect)                    //прерывание по захвату сигнала зажигания
{
    buffer[count] = ICR1;                // таймер делает тик за 8 тактов, заносим в  цикловый буфер
    if(++count == 8)  {count = 0;};            
};

int main(void)
{
unsigned char count;
unsigned int summ;
    for(;;){

        for(count=0;count<8;count++)
            summ += buffer[count];                     //суммируем все элементы буфера

        if(flags){                            //если двигатель запущен.
            if (summ)                    // сумм !=0, чтоб не зависнуть с делнием на 0
                rpm = 30000000/summ;    // 1MHz*30 - 2 импульса за 1 оборот, импульсы через 30 секунд при одном обороте в минуту.
        
        };
    };
};





           
 Renemen
сообщение 16.12.11 - 06:54
Сообщение #36


Хондавод
*

Группа: .Хондаводы.
Сообщений: 658
Имя: Илья
Город: Екатеринбург
Машина: Accord CH7 2.0iES МТ '99

Репутация: 19



Проверял, работает?
Что-то я не пойму, ну допусти ты суммировал 8 значений, а где ты среднее нашел?



           
 Mayhem
сообщение 16.12.11 - 13:44
Сообщение #37


Хондавод
*

Группа: .Хондаводы.
Сообщений: 625
Имя: Андрей
Город: Сороковка
Машина: EG8 VTEC JDM

Репутация: 21



просто у меня прескаляр таймера 8, по этому и получается сумма в 8 раз меньше.




           
2 страниц V  < 1 2
 
Теги
Нет тегов для показа


 



    
Текстовая версия · Удалить установленные форумом cookies · Отметить все сообщения прочитанными ·  Сейчас: 26.10.26 - 19:45