Anke 0 28 февраля, 2019 Опубликовано 28 февраля, 2019 · Жалоба Программирую вентиляторы. Контроль скорости производится по измерению скорости вращения с помощью прерываний 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++; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 29 28 февраля, 2019 Опубликовано 28 февраля, 2019 · Жалоба По идее прерывание обновляет переменную хранящую скорость. Если же мы выключили вентилятор сами то и сами же устанавливаем скорость =0. Раз нет прерываний значит эту переменную никто не изменит. Всё. Переменная используется уже дальше для чего она там нужна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Anke 0 28 февраля, 2019 Опубликовано 28 февраля, 2019 · Жалоба Да прерывание обновляет переменную myT и можно ее обнулить, когда выполняется команда ШИМ=0. Но вентилятор еще какое-то время крутиться. Это не проходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 29 28 февраля, 2019 Опубликовано 28 февраля, 2019 · Жалоба Только что, Anke сказал: Да прерывание обновляет переменную myT и можно ее обнулить, когда выполняется команда ШИМ=0. Но вентилятор еще какое-то время крутиться. Это не проходит. Не вопрос. Значит переменную скорости нужно обнулять после последнего использования. Если до следующего использования не было ни одного прерывания она останется в нуле. Если переменная используется сильно чаще чем обновляется то придётся всё же анализировать сколько времени прошло от последнего прерывания и если времени прошло больше то обнулять переменную. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Anke 0 28 февраля, 2019 Опубликовано 28 февраля, 2019 · Жалоба Хорошая идея, но система один раз выдаст ошибку. Одно сообщение о скорости будет "старым". у меня еще есть проверка соответствии скорости нужной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 29 28 февраля, 2019 Опубликовано 28 февраля, 2019 · Жалоба Только что, Anke сказал: Хорошая идея, но система один раз выдаст ошибку. Одно сообщение о скорости будет "старым". у меня еще есть проверка соответствии скорости нужной. Не очень понял про ошибки и старую скорость. В каком случае? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Anke 0 28 февраля, 2019 Опубликовано 28 февраля, 2019 · Жалоба 36 minutes ago, MegaVolt said: Не вопрос. Значит переменную скорости нужно обнулять после последнего использования. Если до следующего использования не было ни одного прерывания она останется в нуле. Переменная используется при запросе о скорости и при запросе об анализе работы вентилятора. Могу ее обнулять только в этих двух случаях. Один раз будет фальшивая информация. При выдаче скорости не важно, при анализе работы вентилятора - не очень хорошо. Там дальше пойдет информация, что с вентилятором проблема. А он встроен в сложный прибор, а его программируют другие и т.д. Вобщем, ошибку подуцировать не хочется. Подумаю, как сделать второй вариант. 36 minutes ago, MegaVolt said: Если переменная используется сильно чаще чем обновляется то придётся всё же анализировать сколько времени прошло от последнего прерывания и если времени прошло больше то обнулять переменную. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Anke 0 28 февраля, 2019 Опубликовано 28 февраля, 2019 · Жалоба Бесят меня эти разработчики. Сначала хотят включать вентилятор на полную мощность, если нет коммуникации с внешней системой три минуты. А потом спрашивают, чего он крутиться, если у нас -40 в камере. И с нулем таже история. Сначала скорость не меньше какой-то, потом, нет выключай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MegaVolt 29 28 февраля, 2019 Опубликовано 28 февраля, 2019 · Жалоба 29 минут назад, Anke сказал: Переменная используется при запросе о скорости и при запросе об анализе работы вентилятора. Могу ее обнулять только в этих двух случаях. Тоже не проблема. Обнулять при первом запросе. Перед обнулением копировать в рабочую переменную. Соответственно в рабочей переменной всегда будет актуальная скорость. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 28 февраля, 2019 Опубликовано 28 февраля, 2019 · Жалоба Вы используете прерывание захвата. Включите еще и прерывание по переполнению, увеличивайте в нем счетчик. Как только счетчик досчитал до порога - обнуляйте скорость и отключайте прерывание переполнения. В прерывании захвата обнуляйте счетчик и разрешайте прерывание переполнения.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Anke 0 28 февраля, 2019 Опубликовано 28 февраля, 2019 · Жалоба 22 minutes ago, Сергей Борщ said: Включите еще и прерывание по переполнению Уже используется ISR( TIMER1_OVF_vect ) {//OVF_counter++; if(++OVF_counter>100) { myT =0; //? здесь я могу обнулять только при определенном значении. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 1 марта, 2019 Опубликовано 1 марта, 2019 · Жалоба 15 hours ago, Anke said: Бесят меня эти разработчики А меня бесят разработчики, у которых простейший измеритель скорости вращения, который всегда должен выдавать скорость, начинает вести себя неадекватно. Здесь играем, здесь не играем, здесь мы какую-то лажу показываем... Извините. Если импульсы не приходили дольше, чем N миллисекунд (договориться, что скорость меньше K имп/сек мы не меряем), выдавать, что скорость равна нулю. Всё. Нет, начинаются странные костыли "тут спрашивали, тут не спрашивали, тут сами отключили"... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Anke 0 1 марта, 2019 Опубликовано 1 марта, 2019 · Жалоба Ну ладно, чего сразу ругаться. Просто когда начинаешь старый код переделавать, делаешь ошибки. Обнуляю все в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 Забыла пару новых переменных добавить. Спасибо! Иногда требуются внешнии стимулы для думанья! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться