Subversion Repositories FlightCtrl

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2220 - 1
/*****************************************************************************************************************************
2
* File:                 analog.c
3
*
4
* Purpose:              collecting ADC analog inputs
5
*
6
* Functions:    void ADC_Init(void)
7
*                               ISR(ADC_vect)
8
*
9
* Created:              Feb 2013
10
*
11
* Version:              1.00    experimental version
12
*
13
* Copyright:    (c)2013 dk9nw -at- darc.de
14
*                               All rights reserved. This software is available only for non-commercial amateur radio or educational applications.  
15
*                               Other uses are prohibited. This software may be modified only if
16
*                               the resulting code be made available publicly and the original author(s) given credit.
17
*
18
*****************************************************************************************************************************/
19
#include "analog.h"
20
 
21
#include <stdlib.h>
22
#include <avr/interrupt.h>
23
 
24
volatile int AdWertNick=0, AdWertAccNick, Aktuell_ax;
25
int NeutralAccX = 511;
26
volatile unsigned char AdReady = 1;
27
 
28
 
29
 
30
// **************************************************************************************************************************
31
// Purpose:     set up ADC
32
//
33
// INPUT:       None
34
// OUTPUT:      None
35
// RETURN:      None
36
// --------------------------------------------------------------------------------------------------------------------------
37
void init_ADC(void)
38
{
39
        static unsigned char sreg;                                      // temporary variable to store SREG
40
 
41
        sreg = SREG;                                                            // save backup status register , to be reseted later
42
        cli();                                                                          // switch off Global Interrupt
43
 
44
        // ADMUX = ADC Multiplexer Selection Register –> REFS1 REFS0 ADLAR MUX4 MUX3 MUX2 MUX1 MUX0 
45
        // -----------------------------------------------------------------------------------------
46
        // REFS1:0 = Reference Selection Bits
47
        // ADLAR = ADC Left Adjust Result
48
        // MUX4:0 = Analog Channel and Gain Selection Bits
49
        //
50
        ADMUX &= ~((1 << REFS1)|(1<<REFS0));                                                            // AREF is the reference and Internal Vref is turned off
51
        ADMUX &= ~(1 << ADLAR);                                                                                 // the result is right side edge
52
        ADMUX &= ~((1<<MUX4)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0));  // the analog input is connected to ADC0  = PORTA0 = port S21
53
 
54
        // SFIOR = Special Function IO Register –> ADTS2 ADTS1 ADTS0 – ACME PUD PSR2 PSR10
55
        //---------------------------------------------------------------------------------
56
        SFIOR &= ~((1<<ADTS2)|(1<<ADTS2)|(1<<ADTS0));   // ADTS2:0 = ADC Auto Trigger Source = 000 = Free Running mode
57
 
58
        // ADCSRA = Analog Digital Conversion Status Register A -> ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
59
        // ----------------------------------------------------------------------------------------------------
60
        // ADEN  = AD Wandler enable
61
        // ADSC  = start conversion
62
        // ADATE = auto trigger ein
63
        // ADIF  = interrupt flag -> This bit is set when an ADC conversion completes and the Data Registers are updated
64
        // ADIE  = Analog to Dig Conversion Interrupt Enable
65
        // ADPS  = Prescaler = 111 = Division Factor 128
66
        //
67
        ADCSRA |= (1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
68
        ADCSRA &= ~((1<<ADATE));
69
 
70
        SREG = sreg;                                                                    // write back to old state, 
71
        sei();                                                                                  // switch on Global Interrupt   
72
}
73
// *** EOF: init_ADC() **************************************************************************************************************
74
 
75
 
76
 
77
 
78
// *********************************************************************************************************************************
79
// read analog inputs from ADC with the following sequence:
80
// ------------------------------------------------------------------------------------------------
81
// cases:
82
// 0 nick-gyro
83
// 1 x acc nick
84
// 2 nick-gyro
85
// 3 nick-gyro
86
// 4 x acc nick
87
// 5 nick-gyro
88
// ------------------------------------------------------------------------------------------------
89
// Chanels:
90
// PA0                  Gyro Gier
91
// PA1                  Gyro Roll
92
// PA2                  Gyro Nick
93
// PA3                  Air Pressure
94
// PA4                  Voltage
95
// PA5                  ACC H
96
// PA6                  ACC Roll
97
// PA7                  ACC Nick
98
// ------------------------------------------------------------------------------------------------
99
ISR(ADC_vect)
100
{
101
        static unsigned char kanal=AD_NICK, state = 0;
102
        static signed int nick1, accx;
103
 
104
        switch(state++)
105
        {
106
                case 0:                                                                                
107
                        nick1 = ADC;                                                                    // 1st measure of Nick Gyro Sensor
108
                        kanal = AD_ACC_X;                                                      
109
                break;         
110
 
111
                case 1:
112
                        Aktuell_ax = ADC - NeutralAccX;                                 // 1st measure of ACC Nick Sensor
113
                        accx =  Aktuell_ax;
114
                        kanal = AD_NICK;                                                               
115
                break;
116
 
117
                case 2:
118
            nick1 += ADC;                                                                       // 2nd measure of Nick Gyro Sensor
119
            kanal = AD_NICK;                                                                           
120
                break;
121
 
122
                case 3:
123
                        nick1 += ADC;                                                                   // 3rd measure of Nick Gyro Sensor
124
                        kanal = AD_ACC_X;                                                      
125
                break;
126
 
127
        case 4:
128
            Aktuell_ax = ADC - NeutralAccX;
129
            AdWertAccNick =  (Aktuell_ax + accx);                       // 2nd measure of ACC Nick Sensor 0...512
130
            kanal = AD_NICK;                                                           
131
        break;
132
 
133
       case 5:
134
            nick1 += ADC;                                                                       // 4th measure of Nick Gyro
135
            AdWertNick = nick1 / 8;                                                     // AdWertNick = 0...511
136
            kanal = AD_NICK;                                                                           
137
                break;
138
 
139
                case 6:
140
                        AdReady = 1;                                                                    // all cases have been passed -> analog conversion ready
141
            state = 0;
142
            kanal = AD_NICK;                                                                           
143
                break;
144
 
145
                default:
146
                        kanal = 0; state = 0; kanal = AD_NICK;                                 
147
                break;
148
        }
149
        ADMUX = kanal;                                                                                  // ADMUX = ADC Multiplexer Selection Register
150
 
151
        // ADCSRA = Analog Digital Conversion Status Register A -> ADEN ADSC ADATE ADIF ADIE ADPS2 ADPS1 ADPS0
152
        // ADSC  = start conversion
153
        if(state != 0) ADCSRA |= (1<<ADSC);
154
 
155
}
156
// *** EOF : ISR(ADC_vect) **********************************************************************************************************
157