Subversion Repositories FlightCtrl

Rev

Rev 689 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 689 Rev 690
1
/*#######################################################################################
1
/*#######################################################################################
2
Decodieren eines RC Summen Signals
2
Decodieren eines RC Summen Signals
3
#######################################################################################*/
3
#######################################################################################*/
4
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5
// + Copyright (c) 04.2007 Holger Buss
5
// + Copyright (c) 04.2007 Holger Buss
6
// + only for non-profit use
6
// + only for non-profit use
7
// + www.MikroKopter.com
7
// + www.MikroKopter.com
8
// + see the File "License.txt" for further Informations
8
// + see the File "License.txt" for further Informations
9
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
9
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
10
 
10
 
11
#include <stdlib.h>
11
#include <stdlib.h>
12
#include <avr/io.h>
12
#include <avr/io.h>
13
#include <avr/interrupt.h>
13
#include <avr/interrupt.h>
14
 
14
 
15
#include "rc.h"
15
#include "rc.h"
16
#include "fc.h"
-
 
17
 
16
 
18
volatile int16_t PPM_in[11];
17
volatile int16_t PPM_in[11];
19
volatile int16_t PPM_diff[11];
18
volatile int16_t PPM_diff[11];
20
volatile uint8_t NewPpmData = 1;
19
volatile uint8_t NewPpmData = 1;
21
volatile uint8_t SenderOkay = 0;
20
volatile uint8_t SenderOkay = 0;
22
 
21
 
23
/***************************************************************/
22
/***************************************************************/
24
/*  16bit timer 1 is used to decode the PPM-Signal            */
23
/*  16bit timer 1 is used to decode the PPM-Signal            */
25
/***************************************************************/
24
/***************************************************************/
26
void rc_sum_init (void)
25
void rc_sum_init (void)
27
{
26
{
28
        uint8_t sreg = SREG;
27
        uint8_t sreg = SREG;
29
 
28
 
30
        // disable all interrupts before reconfiguration
29
        // disable all interrupts before reconfiguration
31
        cli();
30
        cli();
32
 
31
 
33
        // PPM-signal is connected to the Input Capture Pin (PD6) of timer 1
32
        // PPM-signal is connected to the Input Capture Pin (PD6) of timer 1
34
        DDRD &= ~(1<<DDD6);
33
        DDRD &= ~(1<<DDD6);
35
        PORTD |= (1<<PORTD6);
34
        PORTD |= (1<<PORTD6);
36
 
35
 
37
        // Channel 5,6,7 is decoded to servo signals at pin PD5 (J3), PD4(J4), PD3(J5)
36
        // Channel 5,6,7 is decoded to servo signals at pin PD5 (J3), PD4(J4), PD3(J5)
38
        // set as output
37
        // set as output
39
        DDRD |= (1<<DDD5)|(1<<DDD4)|(1<<DDD3);
38
        DDRD |= (1<<DDD5)|(1<<DDD4)|(1<<DDD3);
40
        // low level
39
        // low level
41
        PORTD &= ~((1<<PORTD5)|(1<<PORTD4)|(1<<PORTD3));
40
        PORTD &= ~((1<<PORTD5)|(1<<PORTD4)|(1<<PORTD3));
42
 
41
 
43
        // Timer/Counter1 Control Register A, B, C
42
        // Timer/Counter1 Control Register A, B, C
44
 
43
 
45
        // Normal Mode (bits: WGM13=0, WGM12=0, WGM11=0, WGM10=0)
44
        // Normal Mode (bits: WGM13=0, WGM12=0, WGM11=0, WGM10=0)
46
        // Compare output pin A & B is disabled (bits: COM1A1=0, COM1A0=0, COM1B1=0, COM1B0=0)
45
        // Compare output pin A & B is disabled (bits: COM1A1=0, COM1A0=0, COM1B1=0, COM1B0=0)
47
        // Set clock source to SYSCLK/64 (bit: CS12=0, CS11=1, CS10=1)
46
        // Set clock source to SYSCLK/64 (bit: CS12=0, CS11=1, CS10=1)
48
        // Enable input capture noise cancler (bit: ICNC1=1)
47
        // Enable input capture noise cancler (bit: ICNC1=1)
49
        // Trigger on positive edge of the input capture pin (bit: ICES1=1),
48
        // Trigger on positive edge of the input capture pin (bit: ICES1=1),
50
        // Therefore the counter incremets at a clock of 20 MHz/64 = 312.5 kHz or 3.2µs
49
        // Therefore the counter incremets at a clock of 20 MHz/64 = 312.5 kHz or 3.2µs
51
    // The longest period is 0xFFFF / 312.5 kHz = 0.209712 s.
50
    // The longest period is 0xFFFF / 312.5 kHz = 0.209712 s.
52
        TCCR1A &= ~((1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM11)|(1<<WGM10));
51
        TCCR1A &= ~((1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM11)|(1<<WGM10));
53
        TCCR1B &= ~((1<<WGM13)|(1<<WGM12)|(1<<CS12));
52
        TCCR1B &= ~((1<<WGM13)|(1<<WGM12)|(1<<CS12));
54
        TCCR1B |= (1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);
53
        TCCR1B |= (1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);
55
        TCCR1C &= ~((1<<FOC1A)|(1<<FOC1B));
54
        TCCR1C &= ~((1<<FOC1A)|(1<<FOC1B));
56
 
55
 
57
        // Timer/Counter1 Interrupt Mask Register
56
        // Timer/Counter1 Interrupt Mask Register
58
 
57
 
59
        // Enable Input Capture Interrupt (bit: ICIE1=1)
58
        // Enable Input Capture Interrupt (bit: ICIE1=1)
60
        // Disable Output Compare A & B Match Interrupts (bit: OCIE1B=0, OICIE1A=0)
59
        // Disable Output Compare A & B Match Interrupts (bit: OCIE1B=0, OICIE1A=0)
61
        // Disable Overflow Interrupt (bit: TOIE1=0)
60
        // Disable Overflow Interrupt (bit: TOIE1=0)
62
        TIMSK1 &= ~((1<<OCIE1B)|(1<<OCIE1A)|(1<<TOIE1));
61
        TIMSK1 &= ~((1<<OCIE1B)|(1<<OCIE1A)|(1<<TOIE1));
63
    TIMSK1 |= (1<<ICIE1);
62
    TIMSK1 |= (1<<ICIE1);
64
 
-
 
65
    AdNeutralGier = 0;
-
 
66
    AdNeutralRoll = 0;
-
 
67
    AdNeutralNick = 0;
-
 
68
 
63
 
69
    SREG = sreg;
64
    SREG = sreg;
70
}
65
}
71
 
66
 
72
 
67
 
73
/********************************************************************/
68
/********************************************************************/
74
/*         Every time a positive edge is detected at PD6            */
69
/*         Every time a positive edge is detected at PD6            */
75
/********************************************************************/
70
/********************************************************************/
76
/*
71
/*
77
The PPM-Frame length is 22.5 ms.
72
The PPM-Frame length is 22.5 ms.
78
Channel high pulse width range is 0.7 ms to 1.7 ms completed by an 0.3 ms low pulse.
73
Channel high pulse width range is 0.7 ms to 1.7 ms completed by an 0.3 ms low pulse.
79
The mininimum time delay of two events coding a channel is ( 0.7 + 0.3) ms = 1 ms.
74
The mininimum time delay of two events coding a channel is ( 0.7 + 0.3) ms = 1 ms.
80
The maximum time delay of two events coding a chanel is ( 1.7 + 0.3) ms = 2 ms.
75
The maximum time delay of two events coding a chanel is ( 1.7 + 0.3) ms = 2 ms.
81
The minimum duration of all channels at minimum value is  8 * 1 ms = 8 ms.
76
The minimum duration of all channels at minimum value is  8 * 1 ms = 8 ms.
82
The maximum duration of all channels at maximum value is  8 * 2 ms = 16 ms.
77
The maximum duration of all channels at maximum value is  8 * 2 ms = 16 ms.
83
The remaining time of (22.5 - 8 ms) ms = 14.5 ms  to (22.5 - 16 ms) ms = 6.5 ms is
78
The remaining time of (22.5 - 8 ms) ms = 14.5 ms  to (22.5 - 16 ms) ms = 6.5 ms is
84
the syncronization gap.
79
the syncronization gap.
85
*/
80
*/
86
ISR(TIMER1_CAPT_vect) // typical rate of 1 ms to 2 ms
81
ISR(TIMER1_CAPT_vect) // typical rate of 1 ms to 2 ms
87
{
82
{
88
        static uint16_t oldICR1 = 0;
83
        static uint16_t oldICR1 = 0;
89
    int16_t signal = 0, tmp;
84
    int16_t signal = 0, tmp;
90
        static int16_t index;
85
        static int16_t index;
91
 
86
 
92
        // 16bit Input Capture Register ICR1 contains the timer value TCNT1
87
        // 16bit Input Capture Register ICR1 contains the timer value TCNT1
93
        // at the time the edge was detected
88
        // at the time the edge was detected
94
 
89
 
95
        // calculate the time delay to the previous event time which is stored in oldICR1
90
        // calculate the time delay to the previous event time which is stored in oldICR1
96
        signal = (uint16_t) ICR1 - oldICR1;
91
        signal = (uint16_t) ICR1 - oldICR1;
97
        oldICR1 = ICR1;
92
        oldICR1 = ICR1;
98
 
93
 
99
 
94
 
100
    //sync gap? (3.52 ms < signal < 25.6 ms)
95
    //sync gap? (3.52 ms < signal < 25.6 ms)
101
        if((signal > 1100) && (signal < 8000))
96
        if((signal > 1100) && (signal < 8000))
102
        {
97
        {
103
                // if a sync gap happens and there where at least 4 channels decoded before
98
                // if a sync gap happens and there where at least 4 channels decoded before
104
                // then the NewPpmData flag is reset indicating valid data in the PPM_in[] array.
99
                // then the NewPpmData flag is reset indicating valid data in the PPM_in[] array.
105
                if(index >= 4)  NewPpmData = 0;  // Null means NewData
100
                if(index >= 4)  NewPpmData = 0;  // Null means NewData
106
                // synchronize channel index
101
                // synchronize channel index
107
                index = 1;
102
                index = 1;
108
        }
103
        }
109
        else // within the PPM frame
104
        else // within the PPM frame
110
        {
105
        {
111
        if(index < 10) // channel limit is 9 because of the frame length of 22.5 ms
106
        if(index < 10) // channel limit is 9 because of the frame length of 22.5 ms
112
        {
107
        {
113
                        // check for valid signal length (0.8 ms < signal < 2.1984 ms)
108
                        // check for valid signal length (0.8 ms < signal < 2.1984 ms)
114
            if((signal > 250) && (signal < 687))
109
            if((signal > 250) && (signal < 687))
115
            {
110
            {
116
                signal -= 466; // offset of 1.4912 ms ??? (469 * 3.2µs = 1.5008 ms)
111
                signal -= 466; // offset of 1.4912 ms ??? (469 * 3.2µs = 1.5008 ms)
117
                // check for stable signal
112
                // check for stable signal
118
                // the deviation of the current signal level from the average must be less than 6 (aprox. 1%)
113
                // the deviation of the current signal level from the average must be less than 6 (aprox. 1%)
119
                if(abs(signal - PPM_in[index]) < 6)
114
                if(abs(signal - PPM_in[index]) < 6)
120
                {
115
                {
121
                                        // a good signal condition increases SenderOkay by 10
116
                                        // a good signal condition increases SenderOkay by 10
122
                                        // SignalOkay is decremented every 2 ms in timer0.c
117
                                        // SignalOkay is decremented every 2 ms in timer0.c
123
                                        // this variable is a level for the average rate of noiseless signal
118
                                        // this variable is a level for the average rate of noiseless signal
124
                                        if(SenderOkay < 200) SenderOkay += 10;
119
                                        if(SenderOkay < 200) SenderOkay += 10;
125
                                }
120
                                }
126
                                // calculate exponential history for signal
121
                                // calculate exponential history for signal
127
                tmp = (3 * (PPM_in[index]) + signal) / 4;
122
                tmp = (3 * (PPM_in[index]) + signal) / 4;
128
                if(tmp > signal+1) tmp--; else
123
                if(tmp > signal+1) tmp--; else
129
                if(tmp < signal-1) tmp++;
124
                if(tmp < signal-1) tmp++;
130
                // calculate signal difference on good signal level
125
                // calculate signal difference on good signal level
131
                if(SenderOkay >= 195)  PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; // cut off lower 3 bit for nois reduction
126
                if(SenderOkay >= 195)  PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; // cut off lower 3 bit for nois reduction
132
                else PPM_diff[index] = 0;
127
                else PPM_diff[index] = 0;
133
                PPM_in[index] = tmp; // update channel value
128
                PPM_in[index] = tmp; // update channel value
134
            }
129
            }
135
            index++; // next channel
130
            index++; // next channel
136
            // demux sum signal for channels 5 to 7 to J3, J4, J5
131
            // demux sum signal for channels 5 to 7 to J3, J4, J5
137
                if(index == 5) PORTD |= (1<<PORTD5); else PORTD &= ~(1<<PORTD5);
132
                if(index == 5) PORTD |= (1<<PORTD5); else PORTD &= ~(1<<PORTD5);
138
                if(index == 6) PORTD |= (1<<PORTD4); else PORTD &= ~(1<<PORTD4);
133
                if(index == 6) PORTD |= (1<<PORTD4); else PORTD &= ~(1<<PORTD4);
139
                if(index == 7) PORTD |= (1<<PORTD3); else PORTD &= ~(1<<PORTD3);
134
                if(index == 7) PORTD |= (1<<PORTD3); else PORTD &= ~(1<<PORTD3);
140
        }
135
        }
141
        }
136
        }
142
}
137
}
143
 
138
 
144
 
139
 
145
 
140
 
146
 
141
 
147
 
142
 
148
 
143