Показано с 1 по 10 из 26

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    61
    Сообщений
    241
    Вес репутации
    237

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

    Я на таком варианте пробовал
    PHP код:
    #define D13_High PORTB |=B10000000
    #define D13_LOW PORTB &= B01111111
    volatile unsigned int tcnt2 251//32 такта делителя * (256-251)=160 тактов. То есть каждые 10 мкс.
    volatile byte pwm_time;

    void setup()  
    pinMode(13OUTPUT);    
        
    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));
    }
    void loop()
    {
    }
    ISR(TIMER2_OVF_vect)  

        
    TCNT2 tcnt2;
        
    pwm_time++;         
        if(
    pwm_time 128D13_High; else D13_LOW

    и получилась примерная частота при tcnt2
    250 = 340 гц
    251 = 390 гц
    252 = 490 гц
    253 = 660 гц
    254 = 980 гц
    и не понятно почему при 255 тоже 980 гц.

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

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

    Цитата Сообщение от Mastar Посмотреть сообщение
    Я на таком варианте пробовал
    PHP код:
    #define D13_High PORTB |=B10000000
    #define D13_LOW PORTB &= B01111111
    volatile unsigned int tcnt2 251//32 такта делителя * (256-251)=160 тактов. То есть каждые 10 мкс.
    volatile byte pwm_time;

    void setup()  
    pinMode(13OUTPUT);    
        
    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));
    }
    void loop()
    {
    }
    ISR(TIMER2_OVF_vect)  

        
    TCNT2 tcnt2;
        
    pwm_time++;         
        if(
    pwm_time 128D13_High; else D13_LOW

    и получилась примерная частота при tcnt2
    250 = 340 гц
    251 = 390 гц
    252 = 490 гц
    253 = 660 гц
    254 = 980 гц
    и не понятно почему при 255 тоже 980 гц.
    Так все нормально!
    Смотри сам: сам таймер вызывается каждые 10мкс. То есть 100 000 раз в секунду.
    Ты на 256 вызовов таймера создаешь один период колебания ноги D13 (Vcc-Gnd).
    То есть делим 100 000 на 256, получаем 390гц. Как у тебя и написано.

    А вот TCNT2=255 не проходит потому, что таймер не успевает отработать до того момента, как процессор пытается его вызвать снова. При TCNT2=255 прерывание вызывается каждые 32 такта, а выполняется оно дольше, чем 32 такта.

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

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

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

Ваши права

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