Показано с 1 по 9 из 9
  1. #1
    Продвинутый
    Регистрация
    19.02.2010
    Возраст
    46
    Сообщений
    244
    Вес репутации
    230

    По умолчанию Как измерить скважность ШИМ.

    Приветствую, уважаемые!

    Есть ШИМ сигнал 50 Гц. (12В) Нужно читать скважность.
    Покопавшись в гугляндексе, обнаружил, что нужно устанавливать прерывания по фронту импульса, потом по спаду, потом снова по фронту, засекая время при этом. Расчеты довольны элементарны, а вот "махинации" с прерываниями для меня темный лес.
    Что-то чувствую без вашей помощи не осилю задачу.
    Спасибо.
    Последний раз редактировалось BlkDem; 10.06.2011 в 20:22.

  2. #2
    Местный Аватар для zhserg
    Регистрация
    12.11.2010
    Сообщений
    135
    Вес репутации
    200

    По умолчанию Re: Как измерить скважность ШИМ.

    Посмотри тему про парктроник.

  3. #3
    Продвинутый
    Регистрация
    19.02.2010
    Возраст
    46
    Сообщений
    244
    Вес репутации
    230

    По умолчанию Re: Как измерить скважность ШИМ.

    Спасибо, стало чуть понятнее.

  4. #4
    Продвинутый
    Регистрация
    19.02.2010
    Возраст
    46
    Сообщений
    244
    Вес репутации
    230

    По умолчанию Re: Как измерить скважность ШИМ.

    Так будет работать?

    PHP код:
    #include <TimerOne.h>

    #define LEDPIN 13        // Вывод светодиода
    #define BTNPIN 2 

    volatile uint16_t duty=0;
    volatile uint16_t timeRising 0;
    volatile uint16_t timeFalling 0;

    void setup()
    {  
    /*
        LOW — вызов прерывания всякий раз, когда на порту низкий уровень напряжения;
        CHANGE – прерывание вызывается при изменении значения на входе;
        RISING – вызов прерывания при изменении уровня напряжения с низкого (LOW) на высокое(HIGH)
        FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкое (LOW)
      */
      
    pinMode(BTNPININPUT);    
      
    Serial.begin(115200);
      
      
    Timer1.initialize(20);
      
    Timer1.attachInterrupt(callback);  // attaches callback() as a timer overflow interrupt

      
    attachInterrupt(0fireUpRISING);
    }
    void callback() {  duty=20/(timeFalling-timeRising); } //делим период на ширину импульса

    void loop()
    {
      
    }

    // Функция обработки прерывания на подъем
    void fireUp()
    {
      
    detachInterrupt(0);
      
    timeRising millis();
      
    attachInterrupt(0fireDownFALLING);
    }

    // Функция обработки прерывания на спад
    void fireDown()
    {
      
    detachInterrupt(0);
      
    timeFalling millis();
      
    attachInterrupt(0fireUpRISING);

    Последний раз редактировалось BlkDem; 11.06.2011 в 16:22.

  5. #5
    Продвинутый
    Регистрация
    19.02.2010
    Возраст
    46
    Сообщений
    244
    Вес репутации
    230

    По умолчанию Re: Как измерить скважность ШИМ.

    Так не работает. Помогайте со скетчем, плиз.
    Мозг закипает

  6. #6
    Продвинутый
    Регистрация
    19.02.2010
    Возраст
    46
    Сообщений
    244
    Вес репутации
    230

    По умолчанию Re: Как измерить скважность ШИМ.

    Вот код, который заработал. Со второй ардуины сгенерил ШИМ (analogWrite(9, x)).

    PHP код:
    #include <TimerOne.h>

    #define LEDPIN 13        // Вывод светодиода
    #define BTNPIN 2 

    volatile uint16_t startImpuls;
    volatile uint16_t lengthImpuls;
    volatile uint16_t timerCount=0;

    void setup()
    {  
    /*
        LOW — вызов прерывания всякий раз, когда на порту низкий уровень напряжения;
        CHANGE – прерывание вызывается при изменении значения на входе;
        RISING – вызов прерывания при изменении уровня напряжения с низкого (LOW) на высокое(HIGH)
        FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкое (LOW)
      */
      
    startImpuls=0;
      
    lengthImpuls=0;
      
      
    pinMode(BTNPININPUT);  
      
     
      
    Serial.begin(115200);
      
      
    Timer1.initialize(8);
      
    Timer1.attachInterrupt(callback);  // attaches callback() as a timer overflow interrupt

      
    attachInterrupt(0fireUpRISING);
    }
    void callback() {  timerCount++; }

    void loop()
    {
      
    //delay(1000);
      
    Serial.println(lengthImpulsDEC);
    }
    // Функция обработки прерывания на подъем
    void fireUp()
    {

      
    detachInterrupt(0);
      
    startImpuls timerCount;
      
    attachInterrupt(0fireDownFALLING);
    }

    // Функция обработки прерывания на подъем
    void fireDown()
    {
      
    detachInterrupt(0);
      
    lengthImpuls timerCount startImpuls;
      
    startImpuls=0;
      
    timerCount=0;
      
    attachInterrupt(0fireUpRISING);

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

    зы: требую памятник!

    oops1, респект! Без твоего кода из парктроника копался бы до покоса.
    zhserg, спасибо за наводку на тему!
    Последний раз редактировалось BlkDem; 13.06.2011 в 00:38.

  7. #7
    Продвинутый
    Регистрация
    19.02.2010
    Возраст
    46
    Сообщений
    244
    Вес репутации
    230

    По умолчанию Re: Как измерить скважность ШИМ.

    Приветствую, уважаемые!

    Расскажите/покажите, как использовать ICP1 для данной задачи. Ведь явно специальный вход.

    The Timer/Counter incorporates an Input Capture unit that can capture external events
    and give them a time-stamp indicating time of occurrence. The external signal indicating
    an event, or multiple events, can be applied via the ICP1 pin or alternatively, via the
    Analog Comparator unit. The time-stamps can then be used to calculate frequency,
    duty-cycle, and other features of the signal applied.


    Видимо решение тут: http://www.embedds.com/programming-1...-on-atmega328/
    Последний раз редактировалось BlkDem; 21.06.2011 в 14:12.

  8. #8
    Модератор Аватар для XsanderS
    Регистрация
    05.05.2008
    Возраст
    41
    Сообщений
    829
    Вес репутации
    397

    По умолчанию Re: Как измерить скважность ШИМ.

    Цитата Сообщение от BlkDem Посмотреть сообщение
    Приветствую, уважаемые!

    Расскажите/покажите, как использовать ICP1 для данной задачи. Ведь явно специальный вход.

    The Timer/Counter incorporates an Input Capture unit that can capture external events
    and give them a time-stamp indicating time of occurrence. The external signal indicating
    an event, or multiple events, can be applied via the ICP1 pin or alternatively, via the
    Analog Comparator unit. The time-stamps can then be used to calculate frequency,
    duty-cycle, and other features of the signal applied.


    Видимо решение тут: http://www.embedds.com/programming-1...-on-atmega328/
    Почитай тут в самом начале.
    хороший модем должен качать пиво!
    Мой проект

  9. #9
    Продвинутый
    Регистрация
    19.02.2010
    Возраст
    46
    Сообщений
    244
    Вес репутации
    230

    По умолчанию Re: Как измерить скважность ШИМ.

    XsanderS, спасиб, канеш, но я же дал ссылку, где все расписано
    http://www.embedds.com/programming-1...-on-atmega328/
    полностью рабочий код.
    По твоей ссылке ничего нового и/или интересного
    Последний раз редактировалось BlkDem; 07.11.2011 в 07:50.

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

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

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

Ваши права

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