LinTai: качественные китайские корпуса и каркасы

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

Новичок
 
Регистрация: 17.09.2011
Сообщений: 11
Репутация: 10
0 2
0 0
 
11.01.2017 04:44 #1
Всем привет!Нужна ваша помощь.Индуктивный датчик будет считывать кол-во оборотов(не больше 2000 об/мин.).И если обороты упадут ниже 500 об. то отключение установки. МК будет Tiny 2313,как это можно реализовать,я имею ввиду с чего начать писать программу.Раньше делал небольшие проекты в CVAVR.Мизерный опыт есть.Помогите пожалуйста!!!
Оценка
Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.
Знаток
 
Регистрация: 06.12.2009
Адрес: Днепропетровск
Сообщений: 811
Репутация: 114
105 141
4 0
 
11.01.2017 18:02 #2
Выставляешь прерывание таймера на 1 сек, считаешь обороты за 1 сек по импульсам от int0 прерывания. Выставляешь условие на срабатывание, если больше вкл, если меньше выкл
Оценка
Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW. Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного.
Новичок
 
Регистрация: 17.09.2011
Сообщений: 11
Репутация: 10
0 2
0 0
 
09.02.2017 18:45 #3
а можно подробнее,как настроить прерывание?
Оценка
Специалист
 
Аватар для antonydublin
 
Регистрация: 22.09.2010
Адрес: г. Донецк
Сообщений: 868
Репутация: 380
371 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, время: 22:49.
Обратная связь РадиоЛоцман Вверх