Разработка устройства управления дневными ходовыми огнями

Дневные ходовые огни (англ. Daytime running lights, DRL) — внешние световые приборы, предназначенные для улучшения видимости движущегося транспортного средства спереди в светлое время суток. Эта простая идея позволяет существенно сократить количество аварий в светлое время суток. Однако, чтобы все работало, DRL необходимо не забывать включать. У водителей с этим возникает много проблем. Поэтому, в своем индивидуальном разделе я бы хотел рассказать о разработке устройства, которое возьмет все управление DRL на себя. Водителю нужно будет лишь подключить его к бортовой сети автомобиля.

В процессе мозгового штурма к будущему устройству были поставлены следующие требования:

  1. В качестве DRL устройство должно использовать лампы головного света автомобиля, но при этом полностью сохранять первоначальные функции этих ламп. Это требование обусловлено тем, что далеко не у всех автомобилей есть дополнительные лампы для DRL, а так же для того, что бы никак не влиять на внешний вид автомобиля.
  2. Устройство должно позволять настраивать яркость свечения ламп. Это требование обусловлено тем, что в автомобилях применяются лампы различной мощности, соответственно различной яркости свечения. При 100% яркости мощные лампы могут ослеплять даже в дневное время суток.
  3. Устройство не должно работать постоянно. Это плохо и для ламп, и для аккумулятора, и для двигателя автомобиля. Долен быть реализован механизм который будет включать DRL только при следующих условиях:
    • Двигатель автомобиля заведен
    • Ручной тормоз поднят
    • Габаритные огни выключены
    • Головной свет выключен
    Если хотя бы одно из вышеперечисленных условий не выполняется - DRL должны быть отключены.
  4. Для увеличения срока службы ламп накаливания - устройство должно зажигать их постепенно в течении некоторого времени. Резкое включение приводит к скачку тока, что постепенно снижает срок службы ламп.
  5. Устройство должно иметь механизм оповещения водителя о том, что режим DRL включен. Это требование обусловлено тем, что в дневное время суток совершенно невидно горят ли лампы головного света.

Из этих требований вытекает и ограничение - все функции устройства будут доступны лишь для ламп накаливания либо светодиодных ламп. Использовать устройство с ксеноновыми лампами можно лишь при 100% яркости ламп и без плавного включения.

Очевидно, что реализовать все вышеописанные функции можно быстро и дешево лишь с использованием микроконтроллера. Самыми распространенными микроконтроллерами считаются 8 битные построенные на архитектуре AVR. Они дешевые, по ним можно найти огромное количество информации в сети, и у меня уже имеется некоторый опыт работы с ними.

Аппаратная часть

Для разработки принципиальной схемы и печатной платы был выбран пакет EagleCAD из за одной его очень приятной функции - он контролирует схему и печатную плату разрабатываемого устройства, что бы в них не было различий. Это позволяет исключить ошибки в разводке печатной платы и сэкономить много времени.

Принципиальная схема устройства приведена на рисунке 1

Рисунок 1 - Принципиальная схема устройства

Схема в высоком разрешении

Основа устройства - микроконтроллер Atmel ATtiny13. У него 5 портов ввода вывода, внутренний тактовый генератор, 1Кб флеш памяти для управляющей программы,32 регистра общего назначения, 64 байта оперативной памяти, один 8-ми битный таймер. Этих параметров более чем достаточно для реализации поставленной задачи.

Напряжение питания контроллера 2,7-5,5 В, а напряжение питания бортовой сети автомобиля 12 В, поэтому в схеме предусмотрен линейный стабилизатор со сглаживающими конденсаторами для питания контроллера и всей его периферии. Управление нагрузкой реализовано с помощью трех полевых транзисторов. Согласование входов с помощью делителя напряжения и диодов. Входы которые должны работать через логическое И заведены на один порт ввода-вывода контроллера, для экономии места и портов. Предусмотрена кнопка, с помощью которой осуществляется настройка устройства.

На основе этой принципиальной схемы, была построена печатная плата. Она показана на рисунке 2

Рисунок 2 - Печатная плата устройства

Размер платы - 43х35 мм. Он продиктован выбором корпуса Z35 в который планируется установить устройство. Плата двусторонняя, все отверстия с металлизацией. Все элементы - для поверхностного монтажа. Силовые полевые транзисторы убраны на заднюю часть платы для экономии места.

Полностью собранное устройство показано на рисунке 3.

Рисунок 3 - Собранное устройство

Программная часть

Прошивка для микроконтроллера написана на языке C в среде CodeVision AVR. Скомпилированная прошивка занимает 504 байта, что чуть больше половины общей флеш памяти. Так же используется 1 байт энергонезависимой памяти для хранения настройки.

Ниже приведен полный исходный код прошивки.


/*****************************************************
Project : PWM Headlamd 
Version : 1.2
Date    : 12.03.2014
Author  : Alexey                           
Company : NSS                             
Comments: 
Условие розжига: Масло = 1 Ручник = 1 Габариты = 0
Каждое нажатие кнопки увеличивает значение розжига на 10% 
По достижении 100% скидывает на минимум:  10%
Значение запоминается в EEPROM.
Время розжига ~ 1 сек.

Chip type           : ATtiny13
Clock frequency     : 4,800000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 16
*****************************************************/

#include 
#include 

#define starttime 30 // Время розжига

unsigned char GetData (void) {
	unsigned char i, j;
	for(i=0;i<30;i++) {                 
		delay_us(1000);
		j = (PINB & 0x1E);  // pb1 - pb4
		delay_us(1000);
		if(j != (PINB & 0x1E)) i=0;
	}
	return j;
}

eeprom unsigned char st_pwm_level = 100;
unsigned char pwm_level, pwm_current = 0, pwm_step = 1, laststate = 0;

void main(void) {
	unsigned char dt = 0;

	// Crystal Oscillator division factor: 1
	#pragma optsize-
	CLKPR=0x80;
	CLKPR=0x00;
	#ifdef _OPTIMIZE_SIZE_
	#pragma optsize+
	#endif

	// Input/Output Ports initialization
	// Port B initialization
	// Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out 
	// State5=P State4=P State3=P State2=T State1=0 State0=0 
	PORTB=0x38;
	DDRB=0x03;

	// Timer/Counter 0 initialization
	// Clock source: System Clock
	// Clock value: 18,750 kHz
	// Mode: Fast PWM top=FFh
	// OC0A output: Non-Inverted PWM
	// OC0B output: Disconnected
	TCCR0A=0x83;
	TCCR0B=0x03;
	TCNT0=0x00;
	OCR0A=0x00;
	OCR0B=0x00;

	// External Interrupt(s) initialization
	// INT0: Off
	// Interrupt on any change on pins PCINT0-5: Off
	GIMSK=0x00;
	MCUCR=0x00;

	// Timer/Counter 0 Interrupt(s) initialization
	TIMSK0=0x00;

	// Analog Comparator initialization
	// Analog Comparator: Off
	ACSR=0x80;
	ADCSRB=0x00;

	// Watchdog Timer initialization
	// Watchdog Timer Prescaler: OSC/1024k
	// Watchdog Timer interrupt: Off
	#pragma optsize-
	WDTCR=0x39;
	WDTCR=0x29;
	#ifdef _OPTIMIZE_SIZE_
	#pragma optsize+
	#endif

	pwm_step = pwm_level / starttime + 1; // шаг розжига.

	pwm_level = st_pwm_level;
	PORTB.1 = 0x00;

	while (1) {
		#asm("wdr")  // сброс WDT

		dt = GetData(); // считали и отфильтровали ввод со входов

		delay_ms(100); 

		if ((dt & 0x10) == 0x00) { 
			// режим настройки
			if (laststate == 0x00) {
				laststate = 0x01;

				if (pwm_level == 250) {
					pwm_level = 25; 
					pwm_current = 0;
				} else
					pwm_level += 25;
								
				st_pwm_level = pwm_level;
				pwm_step = pwm_level / starttime + 1; // шаг розжига.
			}
		} else {
			laststate = 0x00;
			if ((dt & 0x0C) == 0x08) {
				// разжигаем
				if (pwm_current < pwm_level) {
					pwm_current += pwm_step;
					if (pwm_current > pwm_level) 
						pwm_current = pwm_level;
				}
			} else {
				// гасим
				if (pwm_current)
					pwm_current = 0;
			}
		}

		if (pwm_current) {
			OCR0A  = pwm_current;
			TCCR0A = 0x83;
			PORTB.1 = 1;                
		} else {
			OCR0A  = 0x00; 
			TCCR0A = 0x00;
			PORTB.1 = 0; 
		}          
	}
}
			

Прошивка предельно проста и в некоторых местах приведены поясняющие комментарии. Для регулировки яркости ламп применен метод широтно - импульсной модуляции (ШИМ). Реализован он аппаратно, в контроллере, для генерации импульсов используется встроенный в контроллер таймер. Для борьбы с дребезгом контактов применен метод задержки. Для успешного считывания состояния входных сигналов, они должны зафиксироваться на 60 миллисекунд.

Микроконтроллер программируется до установки его на печатную плату. Т.к. для экономии места на плате не выведен разъем для программирования

Полностью собранное устройство в корпусе показано на рисунке 4.

Рисунок 4 - Собранное устройство в корпусе

Устройство имеет 9 выводов. Сверху вниз их назначение следующее:

  1. Постоянные 12В с аккумуляторной батареи автомобиля, через 30А предохранитель.
  2. Выход индикации работы устройства. Можно подключить светодиод либо реле для управления более мощной нагрузкой. Управление осуществляется по минусу.
  3. Вход одного из условий включения устройства. Активация по низкому уровню.
  4. Вход одного из условий включения устройства. Активация по низкому уровню.
  5. Выход для внешней кнопки настройки устройства. Управление осуществляется по минусу.
  6. Вход одного из условий включения устройства. Активация по высокому уровню.
  7. Вход одного из условий включения устройства. Активация по высокому уровню.
  8. Выход на лампы головного света автомобиля.
  9. Выход на корпус автомобиля.

Устройство успешно протестировано на стенде и, с начала марта 2014 года, успешно работает в автомобиле.

Обзор аналогичных разделов магистров прошлых лет

Созданием различных устройств, как оказалось, интересуется не так много магистров, нашлась одна ссылка.

  1. ФИО:Данилич Игорь Викторович
    Название работы: Создание программатора на основе Ponyprog своими руками
    Описание:В работе рассматривается создание PonyProg совместимого программатора.