Страница 3 из 3 ПерваяПервая 123
Показано с 21 по 26 из 26
  1. #21
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    59
    Сообщений
    241
    Вес репутации
    214

    По умолчанию Re: Генератор работы форсунок инжекторного двигателя

    SBorovkov, спасибо. Реально подумал про avr studio, может тогда меньше будет тупых вопросов, но я тогда точно уйду от ардуины и процесинга .
    Сегодня наткнулся на пример с таймерами и там, прикольнула меня работа с avr studio. Сегодня - перезагрузка, avr studio начну пробовать.

  2. #22
    Модератор
    Регистрация
    06.07.2008
    Возраст
    46
    Сообщений
    414
    Вес репутации
    436

    По умолчанию Re: Генератор работы форсунок инжекторного двигателя

    ардуину (саму плату) можно с удобством использовать как отладочную плату, особенно в сочетании с макетной платой с пружинными контактами.

    Как запустить проект arduino среды в avr studio, я писал тут:
    http://www.compcar.ru/forum/showthread.php?t=5910

    Как зашить полученную прогу в arduino:
    У меня среда arduino шьет следующей строкой:

    E:\arduino-0021\hardware\tools\avr\bin\avrdude -CE:\arduino-0021\hardware/tools/avr/etc/avrdude.conf -q -q -patmega168 -cstk500v1 -P\\.\COM8 -b19200 -D -Uflash:w:c:\Temp\build4629811770678680876.tmp\sket ch_dec17a.cpp.hex:i

    Поменяться в этой строке кроме путей могут:
    -patmega168 это тип контроллера. В моем случае atmega168
    -P\\.\COM8 - номер ком порта

    Сам проверить не могу, поскольку сразу по получении заменил родной бутлоадер на другой, а перешивать туда-сюда его лень.

    В avr studio тебе ничто не мешает по началу писать используя библиотеки arduino. Потом, я бы порекомендовал обратить внимание на библиотеку доступа к ногам контроллера. Супер библиотека. И ею можно пользоваться даже не понимая как она устроена.
    тут описание http://easyelectronics.ru/rabota-s-p....html#more-339 . Можешь особо не разбираясь и не читая (если сложно) сразу в конце статьи скачать библиотеку. Там есть пара примеров к ней, сразу поймешь как пользоваться.

    Единственное, в этой библиотеке оперируют не номерами контактов arduino платы, а стандартными портами avr контроллеров.

    Соответствие можно посмотреть в файле
    E:\arduino-0017\hardware\cores\arduino\pins_arduino.c

    Если у тебя 1280 или 2560

    // 0-7 PE0-PE7 works
    // 8-13 PB0-PB5 works
    // 14-21 PA0-PA7 works
    // 22-29 PH0-PH7 works
    // 30-35 PG5-PG0 works
    // 36-43 PC7-PC0 works
    // 44-51 PJ7-PJ0 works
    // 52-59 PL7-PL0 works
    // 60-67 PD7-PD0 works
    // A0-A7 PF0-PF7
    // A8-A15 PK0-PK7

  3. #23
    Модератор
    Регистрация
    06.07.2008
    Возраст
    46
    Сообщений
    414
    Вес репутации
    436

    По умолчанию Re: Генератор работы форсунок инжекторного двигателя

    Вот код, который я тестировал в avr studio на предмет работы таймера
    Код:
    #include <avr/version.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    uint8_t tcnt2;
    
    int main(void)
    {
        TIMSK2 &= ~(1<<TOIE2); //разрешения прерывания по переполнению таймера/счетчика Т2  
        TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика 
        TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика 
        ASSR &= ~(1<<AS2);  //Выбор источника синхронизации таймера если AS2=0 от системного генератора 
        TIMSK2 |= (1<<TOIE2);//Разрешение прерывания по переполнению Т2. 
    	TCCR2B &= ~(1<<CS22); // эта и  следующая строка задает таймер увеличение TCNT2 каждые 32 такта.
    	TCCR2B |= (1<<CS21) | (1<<CS20);
        tcnt2 = 251; //  32 такта* (256-251)=160 тактов. То есть каждые 10 мкс.
    
        TCNT2 = tcnt2;
    	sei();
    
    
    	for (;;);
    
    }
    
    ISR(TIMER2_OVF_vect)  
    { 
        TCNT2 = tcnt2;
    }

  4. #24
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    59
    Сообщений
    241
    Вес репутации
    214

    По умолчанию Re: Генератор работы форсунок инжекторного двигателя

    Спасибо за советы.
    В понедельник утром остановился на варианте ниже
    PHP код:
    #define D22_High PORTA |=B00000001 
    #define D22_Low PORTA &= B11111110

    volatile byte set[7] ; 
    volatile unsigned int tcnt2 206//32 такта делителя * (256-206)=1600 тактов. То есть каждые 0,1 мс.
    volatile unsigned int var = ;
    volatile byte pwm_time ;

    void setup()   

      
    pinMode(22OUTPUT); 
      
    pinMode(2OUTPUT); // Давление топлива
      
    pinMode(3OUTPUT); // Давление в коллекторе
      
    pinMode(4OUTPUT); // Температура топлива
      
    pinMode(5OUTPUT); // Температура двигателя
      
        
    TIMSK2 &= ~(1<<TOIE2); 
        
    TCCR2A &= ~((1<<WGM21) | (1<<WGM20));
        
    TCCR2B &= ~((1<<WGM22) | (1<<CS22));
        
    TCCR2B |= ((1<<CS21) | (1<<CS20));  
          
    ASSR &= ~(1<<AS2);
        
    TIMSK2 |= (1<<TOIE2);
        
        
    Serial.begin(9600); 

    void loop() 
    {
    if(
    Serial.available() > 7)   
       {   
        if(
    Serial.read() == 255)
          {  
            for(
    int i 07i++)   
             {                  
               
    set[i] = Serial.read(); // set[0] - Длительность импульса впрыска, Длительность паузы = set[1] + set[2] * 250
             
    }
          }
       }
      
    analogWrite(2set[3]); // Давление топлива
      
    analogWrite(3set[4]);
      
    analogWrite(4set[5]); // Температура топлива
      
    analogWrite(5set[6]); // Температура двигателя
    }
    //************* прерывание *************
    ISR(TIMER2_OVF_vect)   
    {  
      
    TCNT2 tcnt2;   
        switch (var) 
        {
          case 
    1:
             
    pwm_time++;
             if(
    pwm_time set[0]) D22_High;
             else 
             {
               
    pwm_time=0;
               var = 
    ;
             }
          break;
          case 
    2:
             
    pwm_time++;
             if(
    pwm_time set[1]) D22_Low;
             else 
             {
               if (
    set[2] > 0) var = 3; else var = 1;
               
    pwm_time=0;
             }
          break;
          case 
    3:                    
               
    pwm_time++;
             if(
    pwm_time 250D22_Low;
             else 
             {
               if (
    set[2] > 1) var = 4; else var = 1;
               
    pwm_time=0;
             }
          break;
          case 
    4:                    
               
    pwm_time++;
             if(
    pwm_time 250D22_Low;
             else 
             {
               if (
    set[2] > 2) var = 5; else var = 1;
               
    pwm_time=0;
             }
          break;
          case 
    5:                    
               
    pwm_time++;
             if(
    pwm_time 250D22_Low;
             else 
             {
               if (
    set[2] > 3) var = 6; else var = 1;
               
    pwm_time=0;
             }
          break;
          case 
    6:                    
               
    pwm_time++;
             if(
    pwm_time 250D22_Low;
             else 
             {
               if (
    set[2] > 4) var = 7; else var = 1;
               
    pwm_time=0;
             }
          break;
          case 
    7:                    
               
    pwm_time++;
             if(
    pwm_time 250D22_Low;
             else 
             {
               if (
    set[2] > 5) var = 8; else var = 1;
               
    pwm_time=0;
             }
          break;
          case 
    8:                    
               
    pwm_time++;
             if(
    pwm_time 250D22_Low;
             else 
             {
               if (
    set[2] > 6) var = 9; else var = 1;
               
    pwm_time=0;
             }
          break;
          case 
    9:                    
               
    pwm_time++;
             if(
    pwm_time 250D22_Low;
             else 
             {
               if (
    set[2] > 7) var = 10; else var = 1;
               
    pwm_time=0;
             }
          break;
          case 
    10:                    
               
    pwm_time++;
             if(
    pwm_time 250D22_Low;
             else 
             {
               if (
    set[2] > 8) var = 11; else var = 1;
               
    pwm_time=0;
             }
          break;
          case 
    11:                    
               
    pwm_time++;
             if(
    pwm_time 250D22_Low;
             else 
             {
               if (
    set[2] > 9) var = 12; else var = 1;
               
    pwm_time=0;
             }
          break;
          case 
    12:                    
               
    pwm_time++;
             if(
    pwm_time 250D22_Low;
             else 
             {
               if (
    set[2] > 10) var = 13; else var = 1;
               
    pwm_time=0;
             }
          break;
          case 
    13:                    
               
    pwm_time++;
             if(
    pwm_time 250D22_Low;
             else 
             {
               
    pwm_time=0;
               var = 
    1;
             }
          break;
        }     

    Увеличил делитель и с точностью до 0.1 мс запустил. Провозился с командой For в таймере, но так и не понял где ошибаюсь, сделал тупо на Case и собрал в корпус.

    Подскажите как лучше работать с двух-байтовыми значениями?

    p.s. И еще при измерении реального импульса есть ошибка в 10 мкс, т.е. вместо 10,0 мс получается 9,99 мс, при 10,1 получается 10,09 мс и т.д.
    Есть ли вариант добавить 0,01 мс ?
    Последний раз редактировалось Mastar; 21.12.2010 в 13:13.

  5. #25
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,379
    Вес репутации
    10

    По умолчанию Re: Генератор работы форсунок инжекторного двигателя

    А почему бы тебе не сократить время обмена с компьютером , всего то изменить скорость обмена на 115200

  6. #26
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    59
    Сообщений
    241
    Вес репутации
    214

    По умолчанию Re: Генератор работы форсунок инжекторного двигателя

    Ставил и так и так Разницы не заметил в работе, но более высокая скорость чревата перебоями от помех, а их у меня на СТО - просто кошмар.

Страница 3 из 3 ПерваяПервая 123

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •