Новичок
Регистрация: 17.09.2011
Сообщений: 11
Репутация: 10
|
Всем привет!Нужна ваша помощь.Индуктивный датчик будет считывать кол-во оборотов(не больше 2000 об/мин.).И если обороты упадут ниже 500 об. то отключение установки. МК будет Tiny 2313,как это можно реализовать,я имею ввиду с чего начать писать программу.Раньше делал небольшие проекты в CVAVR.Мизерный опыт есть.Помогите пожалуйста!!!
|
||
Оценка
|
Знаток
Регистрация: 06.12.2009
Сообщений: 824
Репутация: 114
|
Выставляешь прерывание таймера на 1 сек, считаешь обороты за 1 сек по импульсам от int0 прерывания. Выставляешь условие на срабатывание, если больше вкл, если меньше выкл
|
||
Оценка
|
Специалист
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 873
Репутация: 381
|
Подход, предложенный схемопаем, немного неверный.
Точнее всё зависит от установки: её инертности, точности поддержания оборотов, режимов работы, как следствие времени свободного выбега, схемы управления и как Вы в эту схему (релейную?) будете вводить свой интеллектуальный выключатель. А также требуемой точности вычисления числа оборотов в единицу времени, быстродействия устройства выключателя. Тем не менее, вот простейшая программа, реализующая предложенный Вам подход. 2000 об/минуту - это частота на выходе датчика ~ 33Гц (если датчик выдаёт импульс на оборот). 500 об/минуту - это около 8Гц. Внешнее прерывание на INT0 настраивается по возрастающему фронту. Т.е. 33Гц - это 33 импульса, посчитанных микроконтроллером в секунду. Если число импульсов (тут - целое) меньше 8 (480 оборотов), то на выводе PB0 микроконтроллера лог. 0, если больше 8 - на PB0 лог. 1. Всё остальное в комментариях. Код:
#include <avr/io.h> #include <avr/interrupt.h> #include <inttypes.h> // Внешний кварц 8МГц, CLKDIV8 = ON #ifndef F_CPU #define F_CPU 1000000 #endif #define LED_OFF PORTB &= ~_BV(PB0) #define LED_ON PORTB |= _BV(PB0) enum {ON, OFF}; // Счётчик импульсов volatile uint8_t v_pulse_count = 0; // Флаг на включение/отключение внешнего устройства volatile uint8_t v_flag = OFF; // Логика работы: // при снижении числа оборотов ниже 500 (8Гц) // зажиагется светодиод на выводе PB0 int main(void) { // PB0 на управление внешним устройством DDRB |= _BV(PB0); LED_OFF; // Настраивеем внешнее прерывание на PD2 (INT0) // По возрастающему фронту MCUCR |= _BV(ISC00)|_BV(ISC01); GIMSK |= _BV(INT0); // Настраиваем 16-битный Timer1 // Предделитель частоты на 64: 1000000/64= 15625 Гц // Таймер переполняется ~ раз в 4 секунды TCCR1B |= _BV(CS10)|_BV(CS11); // Режим таймера CTC, верх в OCR1A TCCR1B |= _BV(WGM12); // Разрешаем прерывание при совпадении TIMSK |= _BV(OCIE1A); // Прерывание 1 раз в секунду OCR1A = 15625; // Разрешение прерываний sei(); // Бесконечный цикл while(1) { // Проверяем состояние v_flag, изменённое в ISR таймера // Это можно было сделать сразу в прерывании if(v_flag == ON) { LED_ON; } else { LED_OFF; // Тут нужно вставить задержку или // реализовать контроль "гистерезиса" количества импульсов } } } // Прерывание от INT0 ISR(INT0_vect) { // Наращиваем счётчик импульсов v_pulse_count++; } ISR(TIMER1_COMPA_vect) { if(v_pulse_count < 8) // Было меньше 8ми импульсов v_flag = OFF; else v_flag = ON; // Обнуляем счётчик импульсов v_pulse_count = 0; } Поэтому вопросы о характере установки и требуемой точности вычисления "уставки" вполне уместны. Более быстро и точно посчитать обороты можно, измеряя длительность каждого импульса, затем уж посчитать среднее за секунду. Есть ещё варианты. Да вот, использовал WinAVR + AVRStudio 4.18. Проект с моделью в Proteus в пристёжке. |
||
Оценка
|
Новичок
Регистрация: 17.09.2011
Сообщений: 11
Репутация: 10
|
Мне кажется слишком сложно,как предлагает antonydublin,я мало что понял.Объясню где зачем это мне нужно.Делаю компрессорную установку из двух компрессоров.Они будут стоять в яме,зашитые в короб(что-бы не мешались и их не слышно было)Понятно что визуального контроля за ними не будет.Было решено сделать электронный контроль-включение двигателей,клапанов сброса,помп охлаждения и вентиляторов,контроль температур.Дальше встал вопрос о безопасности двигателей. Т.к. Привод ременный,то,а если вдруг на одном ремень порвался,как я увижу,второй то будет работать,пока это я пойму что производительность упала.А если пусковой кондер выйдет из сторя,то двигатель будет стоять гудеть пока не сгорит.Достались мне два индуктивных датчика Festo.На вал компрессора будет установлена пластинка которая будет замыкать датчик,давать сигнал один раз за один оборот.Контролер компрессора после запуска через 1 сек. даст сигнал tiny2313 и она насчет считывать обороты,если меньше допустим 100-500 то дает обратно сигнал контроллеру,а он в свою очередь останавливает двигатель и подает сигнал об неисправности двигателя.Как видно что точность оборотов мне не важна.
Я не могу понять как сделать чтоб таймер запускался каждую сек. и считал импульсы,и потом их записывал в переменную.В теории я думаю так,таймер запустился посчитал импульсы,записал в переменную,потом опять запустился,обнулил переменную и снова посчитал,записал.Но как это на практике выглядеть будет я не знаю. |
||
Оценка
|
Обратная связь РадиоЛоцман Вверх |