1 | //============================================================================
|
2 | // ADC_read Achtung: Bei angeschlossener UBS funktioniert die ADC nicht,
|
3 | // weil FT245 an den Data-Ausgaengen 4,7V ausgiebt
|
4 | //----------------------------------------------------------------------------
|
5 | // Tiefpass-Filter:
|
6 | // adc_akt : akt. ADC-Messwert
|
7 | // adc_value : akt. Mittelwert
|
8 | // adc_tmp : Mittelwert des letzten Zyklus
|
9 | // k : Integer Wert mit k > 1
|
10 | //
|
11 | // adc_value = (k-1)/k * adc_tmp + 1/k * adc_akt
|
12 | //============================================================================
|
13 | void ADC_read(void)
|
14 | {
|
15 | DWORD tmp;
|
16 | WORD adc_akt;
|
17 | WORD adc_tmp;
|
18 |
|
19 | if ( USB_IS_CONNECTED )
|
20 | { adc_tmp = 0x3FF;
|
21 | adc_value = 0x3FF;
|
22 | return;
|
23 | }
|
24 |
|
25 | ADCSRA &= 0xF8;
|
26 | if (BIT_IS_CLEAR(CLKPR, CLKPS0)) // --> 16,667 MHZ
|
27 | ADCSRA |= (1<<ADEN) | ( 1 << ADPS2) | ( 1 << ADPS1) | ( 1 << ADPS0); // division factor 128 -> 130 kHz
|
28 | else
|
29 | ADCSRA |= (1<<ADEN) | ( 1 << ADPS2) | ( 1 << ADPS1) | ( 0 << ADPS0); // division factor 64 -> 130 kHz
|
30 |
|
31 |
|
32 | // Um die Kapazitaet der angeschlossenen IC's zu entladen:
|
33 | BIT_SET( ADC_DDR, ADC_PIN_INPUT); // Pin PA0 wird output
|
34 | BIT_CLEAR(ADC_PORT, ADC_PIN_INPUT); // Pin PA0 auf LO ziehen
|
35 | my_delay_us(10); // wichtig!!
|
36 | BIT_CLEAR(ADC_DDR, ADC_PIN_INPUT); // Pin PA0 wird wieder input
|
37 |
|
38 | BIT_SET(ADC_DDR, ADC_PIN_OUTPUT); // Pin PA1 wird output
|
39 | BIT_SET(ADC_PORT,ADC_PIN_OUTPUT); // Pin PA1: Vcc (damit Widerstaende Spannung erhaelt)
|
40 | DIDR0 |= ( 1 << ADC0D); // disable digital input
|
41 |
|
42 | my_delay_ms(1);
|
43 |
|
44 | ADCSRA |= ( 1 << ADSC ); // enable ADC and start conversation
|
45 |
|
46 | // warten bis conversation beendet
|
47 | while( BIT_IS_SET(ADCSRA, ADSC));
|
48 | adc_akt = ADCL;
|
49 | adc_akt |= ADCH << 8;
|
50 |
|
51 | BIT_CLEAR (ADC_PORT,ADC_PIN_OUTPUT); // Pin A1: LO
|
52 | BIT_CLEAR (ADC_DDR, ADC_PIN_OUTPUT); // Pin A1 wird wieder input
|
53 | BIT_CLEAR (ADCSRA, ADEN ); // disable ADC
|
54 | DIDR0 &= ~( 1 << ADC0D); // enable digital input
|
55 |
|
56 | if (adc_value == 0L)
|
57 | { adc_value = adc_akt;
|
58 | adc_tmp = adc_akt;
|
59 | }
|
60 | else
|
61 | {
|
62 | // tmp = (DWORD)adc_tmp * 75L + (DWORD)adc_akt * 25; // k =4
|
63 | // adc_value = tmp / 100L;
|
64 | tmp = (DWORD)adc_tmp * 875L + (DWORD)adc_akt * 125; // k =8
|
65 | adc_value = tmp / 1000L;
|
66 | adc_tmp = adc_value;
|
67 | }
|
68 |
|
69 | if (adc_value <= VOLT_3p0)
|
70 | cam_status.low_battery = true;
|
71 |
|
72 | if (cam_status.low_battery)
|
73 | { if (adc_value > VOLT_3p2)
|
74 | cam_status.low_battery = false;
|
75 | }
|
76 | }
|