Хорошо.
Само устройство. И для чего это нужно.
Это своеобразный доводчик двери. То есть электро двигатель установлен на двери и он должен её дотягивать до щелчка когда это по каким либо причинам не произошло при закрытии. Например хлопнули слабо и дверь прикрыта но замок не закрыт. В атомобилях такое часто бывает. Дверь закрыта только на половину и чтобы её дозакрыть нужно снова открыть дверь и хлопнуть по сильнее чтобы двери закрылись доконца.
Сам исполнительный механиз я слизал с одного готового устройства. Если очень грубо то когда дверь не закрылась датчик это видит, включает двигатель тот в свою очередь "крючком" подцепляет дверь и тянет её до полного закрытия. Когда происходит полное закрытие нужно убрать "крючок" для этого дигатель вращается в обратную сторону.
Теперь как связана моя схема и то что я описал.
К выводу RA0 ( настроен на вход) подключен тот самый датчик который фиксирует неполное закрытие двери (геркон) Он фиксирует именно положение двери когда она закрыта не до конца. Когда дверь полностью открыта или закрыта до конца он разомкнут . Когда на нём появляется + (единица) МК должен перейти в цикл закрывания двери.
Сам цикл закрывания двери в моём представлении выглядит следующим образом:
-Повторно проверить состояние датчика положения двери если единица от начать закрывать дверь, если ноль то ничего не делать и вернутся в основную программу ожидания срабатывания датчика.
Перед повторной проверкой состояния датчика должна идти пауза. Это нужно чтобы когда дверь просто открывают из закрытого положения она неизбежно будет проходить через датчик положения двери и будет вызывать его срабатывание. То есть если без паузы будет происходит следующее: дверь начинают открывать, срабатывает датчик неплотно закрытой двери и МК даёт команду двигателю закрыть её. И вот я начинаю бороться собственным устройством что-бы открыть дверь )
Что-бы этого не было перед повторной проверкой состояния датчика положения двери должна быть пауза. То есть в моём понимании это должно работать так: начинаешь открывать дверь срабатывает датчик не плотно закрытой двери, МК ждёт секунду и повторно спрашивает датчик. Если он говорит что дверь неплотно закрыта то закрыть её. Если датчик не сработал (это случается в двух случаях -дверь открыта совсем и дверь закрыта полностью) то ни чего не делать. Если датчик сработал - дверь закрыта не полностью - закрыть её.
Немного о механизме и двигателе:
Пусть двигатель это обычный соленоид который стоит в автомобильной двери и закрывает её когда вы ставите свой автомобиль на сигнализацию.
Добавим на него крючок который зацепляет дверь для того чтобы её закрыть полностью. И ещё добавим на него два концевых выключателя. С помощью этих выключателей мы будем контролировать положение крючка. Это нужно для того чтобы он гарантированно доходил до нужных положений. И совершенно случайно не завис где нибудь по середине. Если это случится то дверь попросту будет невозможно открыть.
Теперь по схеме:
К выводу RA0 подключен датчик положения двери (геркон).
К выводам RA1 и RA2 подключены концевые выключатель двигателя
К выводам RB0 и RB1 подключены реле. Сейчас на схем их место занимают два светодиода. Так проще контролировать в каком состоянии находится программа МК.
Программа МК с комментариями
Код: Выделить всё
#include <pic.h>
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#pragma config FOSC = INTOSCCLK // включаем внутренний генеротар
#pragma config WDTE = OFF // выключаем собачий (сторожевой) таймер, пока что он не нужен
#pragma config PWRTE = ON // включаем задержку при включении мк, нужна для его стабилизации
#pragma config MCLRE = OFF // выключаем сигнал сброса МК
#pragma config BOREN = OFF // выключаем функцию сброса при пониженном напряжении
#pragma config LVP = OFF // запрещаем низковольтное программирование
#pragma config CPD = OFF // выключаем защиту программы
#pragma config CP = OFF // выключаем защиту EEPROM тут могу напутать.
#define _XTAL_FREQ 4000000 // говорим кварцевому генератору на какой частоте работать - эту строчку я просто скопировал из примера где-то и предполагаю что она работает так как я её описал
void podgot (void);// объявляем функции
void cikl (void); // объявляем функции
void main (void) // старт основной программы
{
podgot(); // переход к настройке МК - в какомто примере это сделано отдельном блоке и я по аналогии сделал также
while(1) // организация бесконечного цикла так как условие в скобочках рядом с while ни когда не выполнится
{
if (RA0 == 1) // проверка датчика положения двери: -замкнут (единица на вводе RA) отработать блок под название "cikl" -разомкнут ни чего не делать дальше крутится в цикле и ожидать срабатывания датчика
{
cikl(); // переход в блок под название "cikl"
}
}
}
void podgot (void)//podgotovka MK // блок подготовки МК
{ TRISA = 0b11111111; // весь порт RA на вход
PORTA = 0; // очистка порта RA
TRISB = 0b00000000; // весь порт RB на выход
PORTB = 0; // очистка порта RB
CMCON = 0b00000111; // отключение компараторов
}
void cikl (void) // цикл отработки сигнала от датчика положения двери
{
__delay_ms(250); // пауза перед повторным опросом датчика положения двери
if (RA0 == 1) // если на вводе RA0 единица (датчик сработал) начать закрывать дверь, если ноль ничего не делать вернутся в основную программу
{
while (RA1 == 0) // пока на вводе RA1 ноль (концевой датчик не сработал) тянуть дверь на себя
{
RB0 = 1; // первое реле. Тянуть на себя, включит двигатель
}
RB0 = 0; // выключить двигатель
__delay_ms(50); //так как двигатель подключен через реле на всякий случай дать реле время для отключения чтобы небыло сквозных токов и замыкания
while (RA2 == 0) // пока на вводе RA2 ноль (концевой датчик не сработал) отпускать дверь
{
RB1 = 1; // реверс, двигатель через второе реле - отпуска
}
RB1 = 0; // выключит двигатель
} // конец цикла отрывания/закрывания возврат в основную программу и ожидание срабатывания датчика положения двери
}
Уф... вроде всё подробно описал.