ЭФО предлагает со своего склада новую серию преобразователей интерфейсов USB UART компании FTDI FT232RNL-REEL

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

Новичок
 
Регистрация: 17.09.2011
Сообщений: 11
Репутация: 10
0 2
0 0
 
11.01.2017 04:44 #1
Всем привет!Нужна ваша помощь.Индуктивный датчик будет считывать кол-во оборотов(не больше 2000 об/мин.).И если обороты упадут ниже 500 об. то отключение установки. МК будет Tiny 2313,как это можно реализовать,я имею ввиду с чего начать писать программу.Раньше делал небольшие проекты в CVAVR.Мизерный опыт есть.Помогите пожалуйста!!!
Оценка
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Знаток
 
Регистрация: 06.12.2009
Адрес: Днепропетровск
Сообщений: 813
Репутация: 114
105 141
4 0
 
11.01.2017 18:02 #2
Выставляешь прерывание таймера на 1 сек, считаешь обороты за 1 сек по импульсам от int0 прерывания. Выставляешь условие на срабатывание, если больше вкл, если меньше выкл
Оценка
Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.
Новичок
 
Регистрация: 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, время: 03:05.
Обратная связь РадиоЛоцман Вверх