РАДИОСХЕМЫ



СТАРЫЙ ФОРУМ

ФОРУМ НА ЭЛВО

РАДИОФОРУМЫ


СХЕМЫ И СТАТЬИ
  • БЛОГИ
  • НОВОЕ
  • СХЕМЫ
  • РАЗНОЕ
  • ТЕОРИЯ
  • ТЕЛЕВИДЕО
  • СВЕТОДИОД
  • МЕДТЕХНИКА
  • БЫТТЕХНИКА
  • ИЗМЕРИТЕЛИ
  • СПРАВОЧНИК
  • ТЕХНОЛОГИИ
  • РЕМОНТ СХЕМ
  • МОБИЛЬНИКИ
  • КОМПЬЮТЕРЫ
  • НАЧИНАЮЩИМ
  • ЗАРЯДКИ И АКБ
  • СИГНАЛИЗАЦИИ
  • АУДИОТЕХНИКА
  • АВТОВЕЛОМОТО
  • БЛОКИ ПИТАНИЯ
  • РАДИОПРИЁМНИКИ
  • МЕТАЛЛОИСКАТЕЛИ
  • МИКРОКОНТРОЛЛЕР
  • РАДИОПЕРЕДАТЧИКИ


    • Страница 1 из 1
    • 1
    Архив - только для чтения
    Микропроцессорная система зажигания
    Чт, 16.03.2017, 18:08 | Сообщение # 1        
    _Crazy_Uncle
    аватар
      Постов: 2   ОК 
    Всем Доброго времени суток. Занимаюсь постройкой кастом мотоцикла на базе Днепр 10-36. И т. к. на силовом агрегате стоит устарелый опередитель зажигания механического типа времен эры динозавров, не способный корректировать УОЗ (угол опережения зажигания) на оборотах коленвала выше средних, вследствии чего двигатель не может развить желаемые обороты. Было задумано сделать МПСЗ (микропроцессорная система зажигания) с корректировкой УОЗа для более полного сгорания рабочей смеси и повышения КПД двигателя. Написав программу:

    #include <mega8.h>
    #include <delay.h>
    int x,z,c,port; // таймера значения; t оборота в тиках; t до искры;

    // External Interrupt 0 service routine
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    x = TCNT1; //присваеваем x значение таймера
    TCNT1=0x00;

    }

    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    if (z > 0)
    {z--;}
    }

    // Declare your global variables here

    void main(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=Out
    // State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=0
    PORTB=0x00;
    DDRB=0x09;

    // Port C initialization
    // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
    // State6=T State5=T State4=T State3=T State2=T State1=T State0=0
    PORTC=0x00;
    DDRC=0x01;

    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x00;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 1000,000 kHz
    TCCR0=0x02;
    TCNT0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 31,250 kHz
    // Mode: Normal top=0xFFFF
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x04;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // External Interrupt(s) initialization
    // INT0: On
    // INT0 Mode: Rising Edge
    // INT1: Off
    GICR|=0x40;
    MCUCR=0x03;
    GIFR=0x40;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x01;

    // Global enable interrupts
    #asm("sei")

    while (1)
    {

    x - время 1-го оборота в тиках таймера(t/31250=32мкс)
    if (x<375) //если более 5000 то опережение постоянное
    { c = 310; }

    if ((x>=375)&&(x<391)) от 4800 до 5000
    { c = 341; } опережение выставленно по 4800 об/мин

    if ((x>=391)&&(x<407))// от 4600 до 4800
    { c = 357; } // опережение выставленно по 4600 об/мин

    if ((x>=407)&&(x<426))// от 4400 до 4600
    { c = 373; } // опережение выставленно по 4400 об/мин

    if ((x>=426)&&(x<446)) от 4200 до 4400
    { c = 391; } опережение выставленно по 4200 об/мин

    if ((x>=446)&&(x<469))// от 4000 до 4200
    { c = 411; } // опережение выставленно по 4000 об/мин

    if ((x>=469)&&(x<493))// от 3800 до 4000
    { c = 435; } // опережение выставленно по 3800 об/мин

    if ((x>=493)&&(x<521))// от 3600 до 3800
    { c = 460; } // опережение выставленно по 3600 об/мин

    if ((x>=521)&&(x<551))// от 3400 до 3600
    { c = 488; } // опережение выставленно по 3400 об/мин

    if ((x>=551)&&(x<586))// от 3200 до 3400
    { c = 520; } // опережение выставленно по 3200 об/мин

    if ((x>=586)&&(x<625))// от 3000 до 3200
    { c = 557; } // опережение выставленно по 3000 об/мин

    if ((x>=625)&&(x<669))// от 2800 до 3000
    { c = 600; } // опережение выставленно по 2800 об/мин

    if ((x>=669)&&(x<721))// от 2600 до 2800
    { c = 651; } // опережение выставленно по 2600 об/мин

    if ((x>=721)&&(x<781))// от 2400 до 2600
    { c = 710; } // опережение выставленно по 2400 об/мин

    if ((x>=781)&&(x<852))// от 2200 до 2400
    { c = 780; } // опережение выставленно по 2200 об/мин

    if ((x>=852)&&(x<938))// от 2000 до 2200
    { c = 864; } // опережение выставленно по 2000 об/мин

    if ((x>=938)&&(x<1041))// от 1800 до 2000
    { c = 972; } // опережение выставленно по 1800 об/мин

    if ((x>=1041)&&(x<1171))// от 1600 до 1800
    { c = 1108; } // опережение выставленно по 1600 об/мин

    if ((x>=1171)&&(x<1339))// от 1400 до 1600
    { c = 1282; } // опережение выставленно по 1400 об/мин

    if ((x>=1339)&&(x<1562))// от 1200 до 1400
    { c = 1515; } // опережение выставленно по 1200 об/мин

    if ((x>=1562)&&(x<1875))// от 1000 до 1200
    { c = 1841; } // опережение выставленно по 1000 об/мин

    if ((x>=1875)&&(x<1973))// от 950 до 1000
    { c = 1946; } // опережение выставленно по 950 об/мин

    if ((x>=1973)&&(x<2083))// от 900 до 950
    { c = 2064; } // опережение выставленно по 900 об/мин

    if ((x>=2083)&&(x<2206))// от 850 до 900
    { c = 2195; } // опережение выставленно по 850 об/мин

    if ((x>=2206)&&(x<2343))// от 800 до 850
    { c = 2343; } // опережение выставленно по 800 об/мин


    if (TCNT1 == c)// если таймера значение совпадает с переменной "с"
    {
    PORTC.0 = 0;
    z = 12;
    }

    if (z == 0) // если таймера знаение совпадает с переменной "с"
    {
    PORTC.0 = 1;
    }

    }
    }
    PORTC.0 - катушка
    INT0 — вход с прерывателя
    и залив в Proteus получаю полный абсурд... Дяденьки помогите (я в этом деле чайник) что здесь не так?
    Пт, 17.03.2017, 21:56 | Сообщение # 2        
    _Crazy_Uncle
    аватар
      Постов: 2   ОК 
    Собственно весь абсурд заключается в том, что PORTC.0 (вывод на бобину) при подключении осоцилографа (в протеусе) выдаёт хаотично скачущий меандр.

    Файлы: 5087054.png (206.1 Kb) · 1700906.png (207.2 Kb)
    Чт, 06.04.2017, 20:03 | Сообщение # 3        
    absolut0999
    аватар
      Постов: 1   ОК 
    что бы понять, где косяк не плохо б файл протеуса и кодевижена.
    • Страница 1 из 1
    • 1
    Поиск:

    Внимание! Форум переехал на Tehnodium.ru



    © 2010-2022 "Форум Радиосхемы". All Rights Reserved  Почта  PDA