1 | /*
|
2 | Atmel Prozessor ATTiny45 @ 8 MHz
|
3 |
|
4 | Bremsshopper-Steuerung
|
5 |
|
6 | Copyrighr by Axel Jeromin
|
7 |
|
8 |
|
9 | Ein- und Ausgänge
|
10 | PORT B 0 (5) = DC Kreis OK + LED 2
|
11 | PORT B 1 (6) = LED 1
|
12 | PORT B 2 (7) = Relais Kondensatoren laden
|
13 | PORT B 3 (2) = Shopper IN
|
14 | PORT B 4 (3) = ADC2 Uzk
|
15 |
|
16 |
|
17 | 3,50V entspricht Uzk nenn = 100% Uzk = 716 Einheiten der Analogmessung = 325V
|
18 | 3,85V Start Shoppen = 110% Uzk = 787 Einheiten der Analogmessung = 357V
|
19 | 4,27V max Shoppen = 122% Uzk = 887 Einheiten der Analogmessung = 398V
|
20 | 4,40V entspricht Uzk max = 125% Uzk = 900 Einheiten der Analogmessung = 408V
|
21 | 2,63V entspricht Uzk min = 75% Uzk = 537 Einheiten der Analogmessung = 243V
|
22 |
|
23 |
|
24 |
|
25 |
|
26 | */
|
27 |
|
28 |
|
29 |
|
30 |
|
31 | #include <inttypes.h>
|
32 | #include <avr/io.h>
|
33 | #include <avr/interrupt.h>
|
34 |
|
35 | volatile unsigned char ausg=0;
|
36 | volatile unsigned char soll=00;
|
37 | volatile unsigned char shoppen=0;
|
38 |
|
39 | // *******************************************************************
|
40 | // PWM Zykluszeit = 6,656ms ==> Frequenz = 150Hz
|
41 | SIGNAL(SIG_OVERFLOW0)
|
42 | {
|
43 |
|
44 | if (soll>100) soll =100;
|
45 | if (ausg) ausg=0; else ausg=1;
|
46 | if (ausg && shoppen) PORTB |= _BV(3); else PORTB &=~_BV(3);
|
47 | if (ausg) (TCNT0=(255-soll)); else (TCNT0=(255-(100-soll)));
|
48 |
|
49 |
|
50 |
|
51 | }
|
52 |
|
53 |
|
54 | // *******************************************************************
|
55 | // Initialisierung
|
56 | // *******************************************************************
|
57 | void initial(void)
|
58 | {
|
59 |
|
60 | TCNT0 = 255; // TCNT0 Timer auf 126µs einstellen
|
61 | TCCR0B = 3; // count with cpu clock/64
|
62 | TIMSK = (1<<TOIE0); // enable TCNT0 overflow
|
63 |
|
64 | sei(); // enable interrupts
|
65 |
|
66 | ADMUX=0x02; // PortB4 = ADC2 = Analog Eingang
|
67 | ADCSRB=0x00;
|
68 | ADCSRA=0x84; // ADEN =1 / Prescaler = 16
|
69 |
|
70 | DDRB = 0x0f; // PortB Ausgang, PortB3 =Analog Eingang
|
71 |
|
72 |
|
73 |
|
74 | shoppen=0;
|
75 |
|
76 |
|
77 | }
|
78 |
|
79 |
|
80 |
|
81 | // *******************************************************************
|
82 | // Hauptprogramm
|
83 | // *******************************************************************
|
84 |
|
85 | void main(void)
|
86 | {
|
87 |
|
88 | // *******************************************************************
|
89 | // Variablen für das Hauptprogramm
|
90 | // *******************************************************************
|
91 | unsigned char i=0;
|
92 | unsigned int sample=0;
|
93 | unsigned int value=0;
|
94 |
|
95 |
|
96 |
|
97 | initial(); // Initialisierung Ports, Timer
|
98 |
|
99 | for (;;) {; /* loop forever */ // Bearbeitungszeit = µs
|
100 |
|
101 | sample=0; // setzt den Samplewert auf 0
|
102 | // Schleife zum Sammeln von 30 Meßwerten
|
103 | for(i=0;i<30;i++)
|
104 | {
|
105 | ADCSRA |= _BV(6); // single conversion mode ein
|
106 | while(ADCSRA & (1<<6)); // warten bis Konvertierung abgeschlosen
|
107 |
|
108 | sample+=ADCW; // Aufsummierung der Samplewerte
|
109 | }
|
110 | value=sample/30; // Aritmethisches Mittel der Samplewerte (alle 8025µsec @ 1Mhz)
|
111 |
|
112 | // Auswertung der Meßdaten
|
113 | if ((value>537) && (value<900)) PORTB |= _BV(0); else PORTB &=~_BV(0); // Uzk OK
|
114 | if (value>787) PORTB |= _BV(1); else PORTB &=~_BV(1); // shoppen ein
|
115 | if (value>537) PORTB |= _BV(2); else PORTB &=~_BV(2); // Relais Kondensatorladung brücken
|
116 |
|
117 |
|
118 | if (value>787) shoppen=1; else shoppen =0;
|
119 | if (value>787) soll=value-787; else soll = 0; // 787 = 110% Uzk
|
120 |
|
121 |
|
122 | } //Ende Loop for ever
|
123 | } //Ende Hauptprogramm
|