Реле Tianbo - ресурс 10 млн переключений

Подключение индуктивного датчика к МК

Новичок
 
Регистрация: 17.09.2011
Сообщений: 11
Репутация: 10
0 2
0 0
 
11.01.2017 04:44 #1
Всем привет!Нужна ваша помощь.Индуктивный датчик будет считывать кол-во оборотов(не больше 2000 об/мин.).И если обороты упадут ниже 500 об. то отключение установки. МК будет Tiny 2313,как это можно реализовать,я имею ввиду с чего начать писать программу.Раньше делал небольшие проекты в CVAVR.Мизерный опыт есть.Помогите пожалуйста!!!
Оценка
Приглашаем 3 декабря 2024 на вебинар, посвященный силовым модулям ведущего китайского производителя SUNCO - одного из мировых лидеров по производству дискретных полупроводниковых компонентов. На вебинаре вы узнаете о новинках, включая модули 17 класса в корпусе E3, и контроле качества на всех этапах производства. Вы также узнаете о новейших продуктах – IGBT-, SiC-, диодных и тиристорных модулях, погрузитесь в современные топологии, сравните характеристики IGBT-чипов разных поколений.
Знаток
 
Регистрация: 06.12.2009
Сообщений: 824
Репутация: 114
105 143
4 0
 
11.01.2017 18:02 #2
Выставляешь прерывание таймера на 1 сек, считаешь обороты за 1 сек по импульсам от int0 прерывания. Выставляешь условие на срабатывание, если больше вкл, если меньше выкл
Оценка
Всплески перенапряжения являются серьезной угрозой надежности работы радиоэлектронных устройств. Причины их появления различны, это могут быть коммутационные переходные процессы в системе электропитания устройств, разряды молний, электростатические разряды. Для создания эффективной и современной системы защиты от ЭСР компания SUNCO разработала надежные и качественные супрессоры, представляющие собой TVS- и ESD-диоды, а также сборки на их основе. Компоненты SUNCO не только не уступают, но часто превосходят по характеристикам аналогичную продукцию других брендов.
Новичок
 
Регистрация: 17.09.2011
Сообщений: 11
Репутация: 10
0 2
0 0
 
09.02.2017 18:45 #3
а можно подробнее,как настроить прерывание?
Оценка
Специалист
 
Аватар для antonydublin
 
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 873
Репутация: 381
372 0
3 0
 
09.02.2017 21:13 #4
Подход, предложенный схемопаем, немного неверный.
Точнее всё зависит от установки: её инертности, точности поддержания оборотов, режимов работы, как следствие времени свободного выбега, схемы управления и как Вы в эту схему (релейную?) будете вводить свой интеллектуальный выключатель. А также требуемой точности вычисления числа оборотов в единицу времени, быстродействия устройства выключателя.

Тем не менее, вот простейшая программа, реализующая предложенный Вам подход. 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;
}
При таком подходе более точно посчитать обороты можно, но усреднив данные за несколько секунд. Тогда требуется завести буфер, куда раз в секунду нужно заносить число пришедших импульсов. Затем посчитать среднее, но уже за 5-10 секунд.

Поэтому вопросы о характере установки и требуемой точности вычисления "уставки" вполне уместны. Более быстро и точно посчитать обороты можно, измеряя длительность каждого импульса, затем уж посчитать среднее за секунду. Есть ещё варианты.

Да вот, использовал WinAVR + AVRStudio 4.18. Проект с моделью в Proteus в пристёжке.
Вложения
Тип файла: zip RPM.ZIP (1.51 Мб, 0 просмотров)
Оценка
Новичок
 
Регистрация: 17.09.2011
Сообщений: 11
Репутация: 10
0 2
0 0
 
10.02.2017 20:09 #5
Мне кажется слишком сложно,как предлагает antonydublin,я мало что понял.Объясню где зачем это мне нужно.Делаю компрессорную установку из двух компрессоров.Они будут стоять в яме,зашитые в короб(что-бы не мешались и их не слышно было)Понятно что визуального контроля за ними не будет.Было решено сделать электронный контроль-включение двигателей,клапанов сброса,помп охлаждения и вентиляторов,контроль температур.Дальше встал вопрос о безопасности двигателей. Т.к. Привод ременный,то,а если вдруг на одном ремень порвался,как я увижу,второй то будет работать,пока это я пойму что производительность упала.А если пусковой кондер выйдет из сторя,то двигатель будет стоять гудеть пока не сгорит.Достались мне два индуктивных датчика Festo.На вал компрессора будет установлена пластинка которая будет замыкать датчик,давать сигнал один раз за один оборот.Контролер компрессора после запуска через 1 сек. даст сигнал tiny2313 и она насчет считывать обороты,если меньше допустим 100-500 то дает обратно сигнал контроллеру,а он в свою очередь останавливает двигатель и подает сигнал об неисправности двигателя.Как видно что точность оборотов мне не важна.
Я не могу понять как сделать чтоб таймер запускался каждую сек. и считал импульсы,и потом их записывал в переменную.В теории я думаю так,таймер запустился посчитал импульсы,записал в переменную,потом опять запустился,обнулил переменную и снова посчитал,записал.Но как это на практике выглядеть будет я не знаю.
Оценка
Ответ
Похожие темы
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход
Электронные компоненты. Скидки, кэшбэк и бесплатная доставка от ТМ Электроникс
Часовой пояс GMT +3, время: 10:42.
Обратная связь РадиоЛоцман Вверх