Rev 40 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 40 | Rev 42 | ||
---|---|---|---|
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 |
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; // Ungültig, wenn Null |
14 | volatile unsigned char PPM_Timeout = 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 | - | ||
53 | #ifdef _32KHZ |
52 | #ifdef _32KHZ |
54 | ppm = (ICR1 - tim_alt + (int) Timer1Overflow * 256) / 16; |
53 | ppm = (ICR1 - tim_alt + (int) Timer1Overflow * 256) / 16; |
55 | #endif |
54 | #endif |
56 | #ifdef _16KHZ |
55 | #ifdef _16KHZ |
57 | ppm = (ICR1 - tim_alt + (int) Timer1Overflow * 512) / 16; |
56 | ppm = (ICR1 - tim_alt + (int) Timer1Overflow * 512) / 16; |
58 | #endif |
57 | #endif |
59 | - | ||
60 | if(ppm < 280) ppm = 280; |
58 | if(ppm < 280) ppm = 280; |
61 | ppm -= 280; |
59 | ppm -= 280; |
62 | - | ||
63 | if(FILTER_PPM) // Filtern |
- | |
64 | { |
- | |
65 | if(PPM_Signal < ppm) PPM_Signal++; |
60 | if(PPM_Signal < ppm) PPM_Signal++; |
66 | else if(PPM_Signal > ppm) PPM_Signal--; |
61 | else if(PPM_Signal > ppm) PPM_Signal--; |
67 | ppm = (PPM_Signal * FILTER_PPM + ppm) / (FILTER_PPM + 1); |
62 | if(FILTER_PPM) ppm = (PPM_Signal * FILTER_PPM + ppm) / (FILTER_PPM + 1); // Filtern |
68 | } |
- | |
69 | - | ||
70 | PPM_Signal = ppm; |
63 | PPM_Signal = ppm; |
71 | 64 | ||
72 | ZeitZumAdWandeln = 1; |
65 | ZeitZumAdWandeln = 1; |
73 | } |
66 | } |
74 | } |
67 | } |
75 | 68 | ||
76 | //############################################################################ |
69 | //############################################################################ |
77 | // |
70 | // |
78 | SIGNAL(SIG_INTERRUPT0) |
71 | SIGNAL(SIG_INTERRUPT0) |
79 | //############################################################################ |
72 | //############################################################################ |
80 | { |
73 | { |
81 | CLR_INT0_FLAG; // IntFlag Loeschen |
74 | CLR_INT0_FLAG; // IntFlag Loeschen |
82 | } |
75 | } |
83 | 76 | ||
84 | 77 |