štvrtok, 15 november 2012 08:01 Written by 4561 times
Rate this item
(9 votes)

Automatické zapnutie svetiel pre VW group 97- 2004

V tomto článku nám autor popíše vývoj elektroniky, konkrétne zariadenie pre automatické rozvietenie svetiel automobilu VW group 97- 2004. Zapojenie je kompatibilné aj s inými autami, líši sa len spôsob montáže.

Technické údaje:

Napájanie: 12V (9-30V)

Kľudový odber <15mA

Odber v zopnutom stave <100mA

Popis:

Po naštartovaní auta sa zvýši napätie nad 13V a svetlá sa nám automaticky rozsvietia. Najskôr sa rozsvietia parkovacie svetlá a sekundu na to sa zapnú stretávacie svetla.
Pri poklese napätia pod 13V nastane akustická signalizácia. Svetla však ostanú svietiť. To môže nastať napríklad, ak nám motor nechtiac zhasne. Ak po zapnutí zapaľovania, do minúty napätie neprekročí hodnotu 13V, nastane akustická signalizácia.
Činnosť automatického zapnutia môžeme deaktivovať pomocou vypínača svetiel - treba zapnúť a následne vypnúť parkovacie svetla.

Srdcom celého zariadenia je MCU Atmega8, do ktorej je potrebné napáliť firmware, ktorý je priložený v prílohe. Na nápalenie použijeme programátor ISP. Schéma celého zapojenia je na obrázku nižšie.

Schéma :

image

Kód v c:

 

/*****************************************************
Project : AUDI AutoLight
Version : 5
Date    : 20/12/2012
Author  : miko
Company : MKelectronic
Comments: 
Chip type           : ATmega8
Program type        : Application
Clock frequency     : 1.000000 MHz (internal RC)
Memory model        : Small
External RAM size   : 0
Data Stack size     : 256
*****************************************************/
#include <mega8.h>
#include <delay.h>
#define FIRMWARE_VERSION 5
#define ADC_VREF_TYPE 0xC0
#define CHARGING_VOLTAGE 13000  //mV
#define MEAS_CYCLE 128          //voltage measure samples
#define INT0_CYCLE 255          //int0 samples
 
#define ALARM       PORTD.1     //buzzer
#define STATUS      PORTD.4     //led
#define SW_LIGHT1   PORTD.5     //main lights
#define SW_LIGHT2   PORTD.6     //parking lights
#define EXT1        PIND.2      //int0 - manual parking switch
void alarm(const unsigned char repeat);
void lights(const unsigned char enable);
// global variables
bit engine=0;
bit lights_on=0;
bit force_off=0;
unsigned int measured_voltage[MEAS_CYCLE];
unsigned char measure_cycle=0;
unsigned char pre_start=255;
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    unsigned char valid_int0=INT0_CYCLE;
    //1'st ext0 = switch on parking lights manually.
    //Change interrupt sense (falling edge -> rising edge)
    if(!(MCUCR&0x03))
        {
        while(--valid_int0)
            {
            delay_ms(3);
            if(EXT1)
                return;        
            }
        //parking lights already switched on => DON'T SWITCH ON LIGHTS 
        if(!lights_on)
            force_off=1;
            
        MCUCR|=0x03;
        return;
        }
    //2'nd ext0 = switch off parking lights manually.
    //disable lights
    if((MCUCR&0x03)==0x03)
        {
        while(--valid_int0)
            {
            delay_ms(3);
            if(!EXT1)
                return;        
            }
        force_off=1;
        GICR&=0xBF; //disable INT0
        return;
        }
    }
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    if(--pre_start==0)
        TCCR0=0;
    }
// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
    {
    TCCR1B=0;
    }
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
    {
    STATUS=~STATUS;
    #asm("cli")
    delay_ms(100);
    #asm("sei")
    }
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
    {
    unsigned int adc_data;
    unsigned char i;
    unsigned char voltage_ok=0;
    unsigned char voltage_ng=0;
    
    // Read the AD conversion result
    adc_data=ADCW;
    
    //store measured voltage [mV]        
    measured_voltage[measure_cycle]=(int)(adc_data*2.56*6.5); //5.681 - calculated voltage divider
    //check measured conditions
    for(i=0;i<MEAS_CYCLE;i++)
        {
        if(measured_voltage[i]>CHARGING_VOLTAGE)
            voltage_ok++;
        else
            voltage_ng++;                          
        }
    
    //reset array index
    if(++measure_cycle==MEAS_CYCLE)
        measure_cycle=0;
    
    // check charging voltage condition (all samples must be valid)
    if(voltage_ok==MEAS_CYCLE)
        {
        engine=1;        
        STATUS=0;   //Status LED
        }
    if(voltage_ng==MEAS_CYCLE)
        {
        engine=0;
        STATUS=1;
        }
    }
void alarm(const unsigned char repeat)
    {
    unsigned char i;
    
    //ignore alarms less than 1min after start 
    if(pre_start)
        return;
    
    for(i=0;i<repeat;i++)
        {
        // Beeper
        #asm("cli")
        ALARM=1;
        delay_ms(150);
        ALARM=0;
        delay_ms(80);
        #asm("sei")
        }
    
    TCCR1B=0x03;    
    while(TCCR1B);     
    }
void lights(const unsigned char enable)
    {
    switch(enable)
        {
        //turn off
        case 0:
        SW_LIGHT1=0;    //disable xenon lights
        SW_LIGHT2=0;    //disable parking lights
        TCCR2=0x07;     //blink status led
        lights_on=0;
        break;
        
        //turn on
        case 1:
        #asm("cli")
        SW_LIGHT2=1;    //switch on parking lights
        delay_ms(1000); //delay for sure :)
        SW_LIGHT1=1;    //switch on xenon lights
        ALARM=1;
        delay_ms(700);
        ALARM=0;
        lights_on=1;
        #asm("sei")
        break;
        }
    }
void main(void)
{
unsigned char j;
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=Out Func0=In 
// State7=T State6=0 State5=0 State4=1 State3=T State2=T State1=0 State0=T 
PORTD=0x10;
DDRD=0x72;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 0.977 kHz
TCCR0=0x05;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 15.625 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 0.977 kHz
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Low level
// INT1: Off
GICR|=0x40;
MCUCR=0x00;
GIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x45;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 7.813 kHz
// ADC Voltage Reference: Int., cap. on AREF
ADMUX=ADC_VREF_TYPE | 0x04;
ADCSRA=0xEF;
//signalize FW version
for(j=0;j<FIRMWARE_VERSION;j++)
    {
    STATUS=0;
    delay_ms(80);
    STATUS=1;
    delay_ms(150);
    }
// Global enable interrupts
#asm("sei")
while (1)
    {
    //MANUAL MODE
    if(force_off)
        {
        //manual switch on then off parking lights -> TURN OFF LIGHTS!
        lights(0);
        }
    
    //AUTO MODE
    else
        {      
        //engine is running, ligths aren't lighting yet -> TURN ON LIGHTS!
        if(engine && !lights_on)
            lights(1);
        
        //low voltage during engine run -> ALARM!
        if(lights_on && !engine) 
            alarm(3);
        //low voltage after 1min of engine run -> ALARM!      
        if(!lights_on && !engine)
            alarm(5);
        }        
    };
}

 

Model  a hotový výrobok :

image

image

image

image

image

Zapojenie do auta :

Pred samotnou montážou odpojíme akumulátor (autobateriu) . Kombinovaný spínač svetiel vyberieme zatlačením otočného prepínača a ľahkým pootočením do prava.

Zapojenie konektora :

58R ( Parking_R) 1
30 (+BAT) 2
58L (Parking_L) 3
31 (GND) 4
56 (LIGHT) 5
58 (osvetlenie EČV) 6
Xz 7

image

image

image

image

image

image

image

Záver :

Toto zariadene inštalujeme do svojho auta na vlastne riziko. Autor tohto článku nenesie žiadnu zodpovednosť za spôsobené škody.

Last modified on štvrtok, 29 august 2013 16:45