Rev 64 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 64 | Rev 92 | ||
---|---|---|---|
1 | /*############################################################################ |
1 | /*############################################################################ |
2 | + Regler für Brushless-Motoren |
2 | + Regler für Brushless-Motoren |
3 | + ATMEGA8 mit 8MHz |
3 | + ATMEGA8 mit 8MHz |
4 | + (c) 01.2007 Holger Buss |
4 | + (c) 01.2007 Holger Buss |
5 | + Nur für den privaten Gebrauch |
5 | + Nur für den privaten Gebrauch / NON-COMMERCIAL USE ONLY |
6 | + Keine Garantie auf Fehlerfreiheit |
6 | + Keine Garantie auf Fehlerfreiheit |
7 | + Kommerzielle Nutzung nur mit meiner Zustimmung |
7 | + Kommerzielle Nutzung nur mit meiner Zustimmung |
8 | + Der Code ist für die Hardware BL_Ctrl V1.0 entwickelt worden |
8 | + Der Code ist für die Hardware BL_Ctrl V1.0 entwickelt worden |
9 | + www.mikrocontroller.com |
9 | + www.mikrocontroller.com |
10 | ############################################################################*/ |
10 | ############################################################################*/ |
11 | #include "main.h" |
11 | #include "main.h" |
12 | volatile unsigned int PPM_Signal = 0; |
12 | volatile unsigned int PPM_Signal = 0; |
13 | volatile unsigned char Timer1Overflow = 0; |
13 | volatile unsigned char Timer1Overflow = 0; |
14 | volatile unsigned char PPM_Timeout = 0, anz_ppm_werte = 0; // Ungültig, wenn Null |
14 | volatile unsigned char PPM_Timeout = 0, anz_ppm_werte = 0; // Ungültig, wenn Null |
15 | 15 | ||
16 | //############################################################################ |
16 | //############################################################################ |
17 | // |
17 | // |
18 | void InitPPM(void) |
18 | void InitPPM(void) |
19 | //############################################################################ |
19 | //############################################################################ |
20 | { |
20 | { |
21 | TCCR1B |= (1<<ICES1)|(1<<ICNC1); |
21 | TCCR1B |= (1<<ICES1)|(1<<ICNC1); |
22 | ICP_POS_FLANKE; |
22 | ICP_POS_FLANKE; |
23 | ICP_INT_ENABLE; |
23 | ICP_INT_ENABLE; |
24 | TIMER1_INT_ENABLE; |
24 | TIMER1_INT_ENABLE; |
25 | } |
25 | } |
26 | 26 | ||
27 | //############################################################################ |
27 | //############################################################################ |
28 | // |
28 | // |
29 | SIGNAL(SIG_OVERFLOW1) |
29 | SIGNAL(SIG_OVERFLOW1) |
30 | //############################################################################ |
30 | //############################################################################ |
31 | { |
31 | { |
32 | Timer1Overflow++; |
32 | Timer1Overflow++; |
33 | } |
33 | } |
34 | 34 | ||
35 | //############################################################################ |
35 | //############################################################################ |
36 | // |
36 | // |
37 | SIGNAL(SIG_INPUT_CAPTURE1) |
37 | SIGNAL(SIG_INPUT_CAPTURE1) |
38 | //############################################################################ |
38 | //############################################################################ |
39 | { |
39 | { |
40 | static unsigned int tim_alt; |
40 | static unsigned int tim_alt; |
41 | static unsigned int ppm; |
41 | static unsigned int ppm; |
42 | if(TCCR1B & (1<<ICES1)) // Positive Flanke |
42 | if(TCCR1B & (1<<ICES1)) // Positive Flanke |
43 | { |
43 | { |
44 | Timer1Overflow = 0; |
44 | Timer1Overflow = 0; |
45 | tim_alt = ICR1; |
45 | tim_alt = ICR1; |
46 | ICP_NEG_FLANKE; |
46 | ICP_NEG_FLANKE; |
47 | PPM_Timeout = 100; |
47 | PPM_Timeout = 100; |
48 | } |
48 | } |
49 | else // Negative Flanke |
49 | else // Negative Flanke |
50 | { |
50 | { |
51 | ICP_POS_FLANKE; |
51 | ICP_POS_FLANKE; |
52 | #ifdef _32KHZ |
52 | #ifdef _32KHZ |
53 | ppm = (ICR1 - tim_alt + (int) Timer1Overflow * 256) / 32; |
53 | ppm = (ICR1 - tim_alt + (int) Timer1Overflow * 256) / 32; |
54 | #endif |
54 | #endif |
55 | #ifdef _16KHZ |
55 | #ifdef _16KHZ |
56 | ppm = (ICR1 - tim_alt + (int) Timer1Overflow * 512) / 32; |
56 | ppm = (ICR1 - tim_alt + (int) Timer1Overflow * 512) / 32; |
57 | #endif |
57 | #endif |
58 | if(ppm < 280) ppm = 280; |
58 | if(ppm < 280) ppm = 280; |
59 | ppm -= 280; |
59 | ppm -= 280; |
60 | if(PPM_Signal < ppm) PPM_Signal++; |
60 | if(PPM_Signal < ppm) PPM_Signal++; |
61 | else if(PPM_Signal > ppm) PPM_Signal--; |
61 | else if(PPM_Signal > ppm) PPM_Signal--; |
62 | if(FILTER_PPM) ppm = (PPM_Signal * FILTER_PPM + ppm) / (FILTER_PPM + 1); // Filtern |
62 | if(FILTER_PPM) ppm = (PPM_Signal * FILTER_PPM + ppm) / (FILTER_PPM + 1); // Filtern |
63 | PPM_Signal = ppm; |
63 | PPM_Signal = ppm; |
64 | if(anz_ppm_werte < 255) anz_ppm_werte++; |
64 | if(anz_ppm_werte < 255) anz_ppm_werte++; |
65 | ZeitZumAdWandeln = 1; |
65 | ZeitZumAdWandeln = 1; |
66 | } |
66 | } |
67 | } |
67 | } |
68 | 68 | ||
69 | //############################################################################ |
69 | //############################################################################ |
70 | // |
70 | // |
71 | SIGNAL(SIG_INTERRUPT0) |
71 | SIGNAL(SIG_INTERRUPT0) |
72 | //############################################################################ |
72 | //############################################################################ |
73 | { |
73 | { |
74 | CLR_INT0_FLAG; // IntFlag Loeschen |
74 | CLR_INT0_FLAG; // IntFlag Loeschen |
75 | } |
75 | } |
76 | 76 | ||
77 | 77 |