Изучение МК STM32
Материалы по сайтостроению
Изготовление девайсов для быта и не только
Дом рационально-умный и душевный
"Удивительный вопрос, —
Почему я водовоз?
Потому что — без воды
И ни туды и ни сюды!"
слова В. Лебедева-Кумача, музыка И. Дунаевского
В предыдущей статье описывалась необходимость создания датчика уровня релейного типа. Так как с программированием МК и схемотехникой МЫ уже на ТЫ то и осуществлять задуманное будем на МК. В интернете много различных схем на эту темы, но использование МК в такой примитивной задаче обусловлено несколькими причинами:
Итак пробежимся по пунктам.
Будем применять на практике те знания, которые получили в процессе изучения МК.
Осваивать ЛУТ технологии и практиковаться в разведении печатных плат.
Придумаем своеобразный алгоритм работы.
Снабдим каким нибудь функционалом, не относящийся к основной задаче.
Ну чтож пора браться за дело: создадим датчик уровня своими руками!
Если используем пластиковую ёмкость, то для регистрации нижнего и верхнего уровня понадобиться 3 электрода. При использовании металической ёмкости электродов будет 2, но их изоляция от корпуса будет основным моментом правильной работы системы.
Мы остановимся на варианте пластиковая емкость + 3 электрода.
Электроды необходимо изготовить или из нержавеющей стали (например из электродов для сварки нержавейки), или из меди (латуни, бронзы). Так как корозия в воде быстро приведет в негодность другие материаллы. Материал подобрали. Разберемся с креплением электродов на стенке ёмкости.
Внешний вид электрода показан на рисунке 1.
Резьба нужна для крепления на стенке емкости. Накручиваем гайки, подкладываем шайбы, резиновые уплотнители и ВУАЛЯ электроды на месте. Места креплений электродов выбираем как НАМ удобно, один ниже всех - это общий, второй на уровне того нижнего уровня при котором должен включаться насос для заполнения ёмкости, третий на уровне отключения. С механикой разобрались. Приступаем к разработке электронной части устройства.
В интернете много различных схем релейного датчика уровня. В схемах используется постоянный ток, переменный ток, логические микросхемы, микроконтроллеры и т.д. Все они имеют право на жизнь. Но МЫ пойдем немного другим путем.
Раз уж МЫ используем микроконтролер, то и его ресурсы будем задействовать по-максимому.
Применем таймер для формирование времени опроса электродов. Ну к примеру в 5 секунд :) У кого то может стоять пожарный гидрант и 5 секунд слишком много для опроса, тогда можно поставить и 50 мс время опроса, дело сугубо личное. Итак, каждые пять секунд МК будет опрашивать электроды на предмет находятся они в воде или нет, и по результам опроса включать или выключать насос. Отлично, но ведь в эти 5 секунд нет смысла гонять ток между электродами, расщепляя воду на примитивные состоявляющие: водород и кислород. Поэтому будем обестачивать общий электрод, размыкая тем самым цепь. Электрическая схема такого алгоритма приведена на рисунке 2.
По прошествии 5 секунд, МК открывает транзистор, тем самым подавая на общий электрод потенциал земли, и через сопротивление воды на двух уровневых электродах устонавливается потенциал земли или питания, взависимости от наличия воды.
Далее от состояния электродов включаем или выключаем насос.
Программная реализация показана ниже и прокоментированна.
/* Датчик уровня */ #include#define _XTAL_FREQ 8000000 //тактовая частота МК //конфигурационные биты #pragma config FOSC = INTRC_NOCLKOUT // INTOSCIO oscillator #pragma config WDTE = ON //(WDT enabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled) #pragma config LVP = ON // Low-Voltage (Single-Supply) #pragma config CPD = OFF // (Data EEPROM code protection off) #pragma config CP = OFF // (Code protection off) //Препроцесорные определения #define Nas RB3 #define Com RB0 #define Up RB1 #define Down RB2 #define Clock 10 // число переполнений для получения нужной задержки //глобальные переменные unsigned char flag=0; //флаг для обработки истекшего времени unsigned char count; //счетчик времени //обработка прерывания void interrupt isr(void) { if (PIR1bits.TMR1IF) //флаг от переполнениятаймера 1 { if (count > Clock) { // при переполнении взводим //флаг о прошествии заданного времени count =0; flag=1; } else count++; PIR1bits.TMR1IF=0; } } //инициализация МК void pic_init(void) { ANSEL=0; ANSELH=0; //все входа как цифровые порты ввода/вывода TRISB=0xF6; //RB0,RB3 на выход, остальные на вход PORTB=0; // начальные уровние на PORTB T1CON=0b00110000; //настройка таймера 1 PIE1bits.TMR1IE=1; //разрешение прерывание от переполнения таймера } void main (void) { pic_init(); //инициализация МК INTCONbits.GIE=1; //разрешения глобальных прерываний INTCONbits.PEIE=1; T1CONbits.TMR1ON=1; //запуск таймера 1 while(1) { CLRWDT(); // сброс сторожевого таймера if (flag){ Com=1; // по флагу подаем напряжение на общий электрод __delay_ms(5); //небольшая зайдержка if (!Up) Nas=0; //если достигнут максимум, выключаем насос if (Down) Nas=1; //если ниже минимума выключаем насос __delay_ms(1); Com=0; //обестачиваем общий электрод flag=0; //сбрасываем флаг } } }
Разведение печатной платы оставляю на ВАШЕ усмотрения, исходя из электронных компонентов, имеющихся у ВАС в наличии. Разводим, ЛУТим, травим, паяем, заливаем прошивку (написанную в среде MPLAB X IDE) наслаждаемся работой.
Всем спасибо за интерес проявленный к данному материалу.
З.Ы. Вопросы, комментарии, предложения складываем тут.
Просмотров: 8880
Поговорим о диммере. Что это за "чудо" прибор?! Для чего он нужен в быту или в системе "умный" дом. Какие типы диммеров бывают.
На чём разрабатывать девайсы своими руками?
РУБРИКИ САЙТА:
Здравствуйте друзья!
Приветствую Вас на моем канале, посвященному разработке прикладного программного обеспечению для программируемых логических контроллеров и панелей оператора.
В прошлом обзоре мы создали проект в ТИА портал версии 15.1, а также рассмотрели документацию на основе которой будет вестись разработка прикладного программного обеспечения для контроллера.