Перейти к содержанию
    

Тахометр, ШИМ, нулевая скорсть

Программирую вентиляторы. Контроль скорости производится по измерению скорости вращения с помощью прерываний Timer/Counter1 Capture Event (ATmega32A). Все хорошо работает. Но при низких температурах вентилятор надо выключить. А как тогда измерить скорость, если нет прерываний? Как решается эта проблема? В переменных запомнена последняя измеренная скорость она и выдается. Понятно, что что-то переодически надо обнулять.  Что и как лучше?  

 

ISR(TIMER1_CAPT_vect)
{
    switch(zamer_1)
    {
        case 0: // Impul
            rising_1 = ICR1; // Save counter
            OVF_counter = 0; // Zero the number of counter overflows
            zamer_1 = 1; // We proceed to the next calculation
            break;
        
        case 1: // Calculate the period of the pulse
            rising_2 = ICR1; // Remember the value of the counter
            // We bring all the variables to the same type and calculate the period of the pulse
            myT = (unsigned long)rising_2 - (unsigned long)rising_1 + ((unsigned long)OVF_counter * FAST_PWM_TOP); //1024  512
            zamer_1 = 0; // We proceed to the next calculation
            break;
        
    }
}

ISR( TIMER1_OVF_vect )
{//OVF_counter++;    

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По идее прерывание обновляет переменную хранящую скорость.
Если же мы выключили вентилятор сами то и сами же устанавливаем скорость =0.
Раз нет прерываний значит эту переменную никто не изменит.

Всё.

Переменная используется уже дальше для чего она там нужна.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да прерывание обновляет переменную myT и можно ее обнулить, когда выполняется команда ШИМ=0. Но вентилятор еще какое-то время крутиться. Это не проходит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, Anke сказал:

Да прерывание обновляет переменную myT и можно ее обнулить, когда выполняется команда ШИМ=0. Но вентилятор еще какое-то время крутиться. Это не проходит.

Не вопрос. Значит переменную скорости нужно обнулять после последнего использования. Если до следующего использования не было ни одного прерывания она останется в нуле.
Если переменная используется сильно чаще чем обновляется то придётся всё же анализировать сколько времени прошло от последнего прерывания и если времени прошло больше то обнулять переменную.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хорошая идея, но система один раз выдаст ошибку. Одно сообщение о скорости будет "старым". у меня еще есть проверка соответствии скорости нужной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, Anke сказал:

Хорошая идея, но система один раз выдаст ошибку. Одно сообщение о скорости будет "старым". у меня еще есть проверка соответствии скорости нужной.

Не очень понял про ошибки и старую скорость. В каком случае?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

36 minutes ago, MegaVolt said:

Не вопрос. Значит переменную скорости нужно обнулять после последнего использования. Если до следующего использования не было ни одного прерывания она останется в нуле.

 

Переменная используется при запросе о скорости и при запросе об анализе работы вентилятора. Могу ее обнулять только в этих двух случаях. Один раз будет фальшивая информация. При выдаче скорости не важно, при анализе работы вентилятора - не очень хорошо. Там дальше пойдет информация, что с вентилятором проблема. А он встроен в сложный прибор, а его программируют другие и т.д. Вобщем, ошибку подуцировать не хочется.

Подумаю, как сделать второй вариант.

36 minutes ago, MegaVolt said:


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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Бесят меня эти разработчики. Сначала хотят включать вентилятор на полную мощность, если нет коммуникации с внешней системой три минуты. А потом спрашивают, чего он крутиться, если у нас -40 в камере. И с нулем таже история. Сначала скорость не меньше какой-то, потом, нет выключай.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

29 минут назад, Anke сказал:

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

Тоже не проблема. Обнулять при первом запросе. Перед обнулением копировать в рабочую переменную. Соответственно в рабочей переменной всегда будет актуальная скорость. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 minutes ago, Сергей Борщ said:

Включите еще и прерывание по переполнению

Уже используется 

ISR( TIMER1_OVF_vect )
{//OVF_counter++;    
    if(++OVF_counter>100) {

    myT =0;  //?

 

здесь я могу  обнулять только при определенном значении.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 hours ago, Anke said:

Бесят меня эти разработчики

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

Извините.

 

Если импульсы не приходили дольше, чем N миллисекунд (договориться, что скорость меньше K имп/сек мы не меряем), выдавать, что скорость равна нулю. Всё.

Нет, начинаются странные костыли "тут спрашивали, тут не спрашивали, тут сами отключили"...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну ладно, чего сразу ругаться. Просто когда начинаешь старый код переделавать, делаешь ошибки.
Обнуляю все в
ISR( TIMER1_OVF_vect )
{//OVF_counter++;    
    /* Interrupt Aktion alle
  (8000000/8)/1023 Hz = ca.1000 Hz
  bzw.
  1/1000 s = 1,023 ms  
  */
    if(++OVF_counter>100) { //0,1 sek

 

Забыла пару новых переменных добавить.
Спасибо! Иногда требуются внешнии стимулы для думанья!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...