Контроллер центрального замка авто
- Войдите на сайт для отправки комментариев
Втр, 28/04/2020 - 15:01
Делал для друга простенький контроллер ЦЗ, вот решил поделиться)
Основан на МК Attiny13A, прошивается через ArduinoIDE(ядро есть в архиве) при помощи программатора USBASP.
Из функционала, открытие/закрытие ЦЗ по сигналу концевика главного ЦЗ, открытие/закрытие по нажатию на кнопку, защита от случайного закрытия ЦЗ при открытой двери(концевик двери "-")
Все необходимое по ссылке в архиве https://yadi.sk/d/ZNYRyx6u7EuifA
001 | //ядро attiny13 <a href="https://github.com/MCUdude/MicroCore" title="https://github.com/MCUdude/MicroCore" rel="nofollow">https://github.com/MCUdude/MicroCore</a> |
002 | //Контроллер центрального замка |
003 | //1.открытие и закрыти по нажатию на кнопку |
004 | //2.открытие и закрытие по изменению положения активатора |
005 | //3.защита от закрывания активаторов при открытой двери |
006 |
007 | #include <avr/io.h> |
008 | #include <avr/wdt.h> // здесь организована работа с ватчдогом |
009 | #include <avr/sleep.h> // здесь описаны режимы сна |
010 | #include <avr/interrupt.h> // работа с прерываниями |
011 |
012 | //пин положения цз 4 |
013 | #define PC_BIT 4 // 4 |
014 | #define PC_PORT PORTB |
015 |
016 | #define PC_CLR (bitClear(PC_PORT, PC_BIT)) |
017 | #define PC_OUT DDRB |= (1 << PB4); |
018 |
019 | #define PC_INIT PC_CLR; PC_OUT |
020 |
021 | #define PC_CONT (bitRead(PINB, PC_BIT)) |
022 |
023 | //пин положения концевиков 3 |
024 | #define DOOR_BIT 3 // 3 |
025 | #define DOOR_PORT PORTB |
026 |
027 | #define DOOR_CLR (bitClear(DOOR_PORT, DOOR_BIT)) |
028 | #define DOOR_OUT DDRB |= (1 << PB3); |
029 |
030 | #define DOOR_INIT DOOR_CLR; DOOR_OUT |
031 |
032 | #define DOOR_CONT (bitRead(PINB, DOOR_BIT)) |
033 |
034 | //пин кнопки открытия/закрытия 0 |
035 | #define BTN_BIT 0 // 0 |
036 | #define BTN_PORT PORTB |
037 |
038 | #define BTN_CLR (bitClear(BTN_PORT, BTN_BIT)) |
039 | #define BTN_OUT DDRB |= (1 << PB0); |
040 |
041 | #define BTN_INIT BTN_CLR; BTN_OUT |
042 |
043 | #define BTN_CONT (bitRead(PINB, BTN_BIT)) |
044 |
045 | //пин сигнала открытия 1 |
046 | #define OPEN_BIT 1 // 1 |
047 | #define OPEN_PORT PORTB |
048 |
049 | #define OPEN_CLR (bitClear(OPEN_PORT, OPEN_BIT)) |
050 | #define OPEN_SET (bitSet(OPEN_PORT, OPEN_BIT)) |
051 | #define OPEN_OUT DDRB &= ~(1 << PB1); |
052 |
053 | #define OPEN_INIT OPEN_CLR; OPEN_OUT |
054 |
055 | //пин сигнала открытия 2 |
056 | #define CLOSE_BIT 2 // 2 |
057 | #define CLOSE_PORT PORTB |
058 |
059 | #define CLOSE_CLR (bitClear(CLOSE_PORT, CLOSE_BIT)) |
060 | #define CLOSE_SET (bitSet(CLOSE_PORT, CLOSE_BIT)) |
061 | #define CLOSE_OUT DDRB &= ~(1 << PB2); |
062 |
063 | #define CLOSE_INIT CLOSE_CLR; CLOSE_OUT |
064 |
065 | volatile boolean control; //флаг положения цз |
066 |
067 | //-------------------------------------------------------------- |
068 | ISR(PCINT0_vect) //Прерывание на PCINT |
069 | { |
070 | if (PC_CONT==control) //проверяем положение цз 0 = закрыто 1 = открыто |
071 | { |
072 | switch (PC_CONT){ //меняем положение активаторов цз |
073 | case 0: |
074 | CLOSE_SET; |
075 | delay(500); |
076 | CLOSE_CLR; |
077 | control=1; |
078 | |
079 | if (!DOOR_CONT) |
080 | { |
081 | OPEN_SET; |
082 | delay(500); |
083 | OPEN_CLR; |
084 | control=0; |
085 | } |
086 | break ; |
087 | |
088 | case 1: |
089 | OPEN_SET; |
090 | delay(500); |
091 | OPEN_CLR; |
092 | control=0; |
093 | break ; |
094 | } |
095 | } |
096 | if (!BTN_CONT) //если нажата кнопка цз |
097 | { |
098 | switch (PC_CONT){ |
099 | case 1: |
100 | CLOSE_SET; |
101 | delay(500); |
102 | CLOSE_CLR; |
103 | control=1; |
104 | |
105 | if (!DOOR_CONT) |
106 | { |
107 | OPEN_SET; |
108 | delay(500); |
109 | OPEN_CLR; |
110 | control=0; |
111 | } |
112 | break ; |
113 | |
114 | case 0: |
115 | OPEN_SET; |
116 | delay(500); |
117 | OPEN_CLR; |
118 | control=0; |
119 | break ; |
120 | } |
121 | while (!BTN_CONT); //ждем пока отпустят кнопку |
122 | } |
123 | } |
124 | //-------------------------------------------------------------- |
125 | void sleep_pwr_down( void ) |
126 | { |
127 | MCUCR |= (1<<SM1); // power-down mode |
128 | MCUCR &= ~(1<<SM0); // power-down mode |
129 | MCUCR |= (1<<SE); |
130 | asm( "sleep" ); |
131 | } |
132 | //-------------------------------------------------------------- |
133 | int main( void ) |
134 | { |
135 | PRR = (1<<PRADC); // shut down ADC |
136 |
137 | pinMode(BTN_BIT, INPUT_PULLUP); |
138 | pinMode(DOOR_BIT, INPUT_PULLUP); |
139 | pinMode(PC_BIT, INPUT_PULLUP); |
140 | CLOSE_INIT; |
141 | OPEN_INIT; |
142 |
143 | GIMSK |= (1<<PCIE); //разрешил прерывание PCINT0 |
144 | PCMSK |= (1<<PB4); //Разрешил вызов прерывания при изменении положения активатора цз |
145 | PCMSK |= (1<<PB0); //Разрешил вызов прерывания при на клавишу цз |
146 | SREG |= (1<<SREG_I); // Разрешаем прерывания глобально |
147 | //-------------------------------------------------------------- |
148 | while (1) |
149 | { |
150 | sleep_pwr_down(); |
151 | } |
152 | } |
78L05 линейный стабилизатор, думаю что с 12 до 5 будет адски нагреваться. Я бы строил что то на основе шим
будет адски нагреваться. Я бы строил что то на основе шим
Рана тибе есчо саветы такие делать.
Уотт када ты к ним цифеерки с расчётом прикрепишь да обоснуешь - уотт тагда уже буит можна.
ilya_s85 - Потребление устройства не более 2мА, так что нагрева там в принципе не может быть)
Интересный контроллер ЦЗ. Подскажите, а что будет если постоянно на вход 1 подать питание?
И не совсем понятно какой сигнал принимает вход 3?
что будет если постоянно на вход 1 подать питание?
Ничего не будет. Там для таких случаев диод стоит.