1 | $regfile = "m128def.dat"
|
2 | $crystal = 10000000
|
3 | $hwstack = 40
|
4 | $swstack = 16
|
5 | $framesize = 32
|
6 | $baud = 9600
|
7 |
|
8 |
|
9 | Dim Kalman_dt As Single
|
10 | Dim Kalman_gyro_sensor As Single
|
11 | Dim Kalman_adxl_sensor As Single
|
12 | Dim Neigungswinkel As Single
|
13 | Dim Buf_ad_gyro As Integer
|
14 | Dim Buf_ad_adxl As Integer
|
15 | Dim Ad_gyro As Integer
|
16 | Dim Ad_adxl As Integer
|
17 | Dim Gyro_zero As Integer
|
18 | Dim Adxl_zero As Integer
|
19 |
|
20 | Dim Gyro1dkalman_x_angle As Single
|
21 | Dim Gyro1dkalman_x_bias As Single
|
22 | Dim Gyro1dkalman_p_00 As Single
|
23 | Dim Gyro1dkalman_p_01 As Single
|
24 | Dim Gyro1dkalman_p_10 As Single
|
25 | Dim Gyro1dkalman_p_11 As Single
|
26 | Dim Gyro1dkalman_q_angle As Single
|
27 | Dim Gyro1dkalman_q_gyro As Single
|
28 | Dim Gyro1dkalman_r_angle As Single
|
29 |
|
30 | Dim Wert As Single
|
31 |
|
32 | Dim Y As Single
|
33 | Dim S As Single
|
34 | Dim K_0 As Single
|
35 | Dim K_1 As Single
|
36 |
|
37 | Dim Temp As Single
|
38 | Dim Temp1 As Single
|
39 | Dim Ausgabe As String * 4
|
40 |
|
41 |
|
42 | Declare Sub Init_gyro1dkalman(byval Q_angle As Single , Byval Q_gyro As Single , Byval R_angle As Single)
|
43 | Declare Sub Ars_predict(byval Dotangle As Single , Byval Dt As Single)
|
44 | Declare Function Ars_update(byval Angle_m As Single) As Single
|
45 | Declare Function Kalman_filter_auswertung(gyro As Single , Adxl As Single , Dt As Single) As Single
|
46 |
|
47 |
|
48 | Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.1 , Rs = Portc.0
|
49 | Config Lcd = 16 * 2
|
50 | Cls
|
51 |
|
52 |
|
53 | Config Adc = Single , Prescaler = 128 , Reference = Off
|
54 | Start Adc
|
55 |
|
56 |
|
57 | 'Init
|
58 | Call Init_gyro1dkalman(0.0001 , 0.0003 , 0.3) 'Kalman Filter
|
59 | Kalman_dt = 0.0157 'time passed in s since last call
|
60 |
|
61 | Gyro_zero = Getadc(5)
|
62 | Adxl_zero = Getadc(2)
|
63 |
|
64 |
|
65 | Do 'Endlosschleife
|
66 |
|
67 | Ad_gyro = Getadc(5)
|
68 | Ad_adxl = Getadc(2)
|
69 |
|
70 | Buf_ad_gyro = Ad_gyro - Gyro_zero
|
71 | Buf_ad_adxl = Ad_adxl - Adxl_zero
|
72 |
|
73 | Kalman_gyro_sensor = Buf_ad_gyro * 1.4634135 ' /1025*3.0V/0.002
|
74 | Kalman_adxl_sensor = Buf_ad_adxl * 1.5139 ' /1025*3.0V/0.0019333 0,348V for 180° = 1,9333mV per °
|
75 |
|
76 | Neigungswinkel = Kalman_filter_auswertung(kalman_gyro_sensor , Kalman_adxl_sensor , Kalman_dt)
|
77 | Ausgabe = Fusing(neigungswinkel , "##.###")
|
78 |
|
79 | Cls
|
80 | Lcd Ausgabe
|
81 | Waitms 150
|
82 |
|
83 | Loop
|
84 |
|
85 | End
|
86 |
|
87 |
|
88 |
|
89 | '#############################################################################
|
90 |
|
91 | '######################## Kalman Filter - Datei ##############################
|
92 |
|
93 | 'struct Gyro1DKalman
|
94 |
|
95 | '* These variables represent our state matrix x
|
96 |
|
97 |
|
98 | 'End Structure
|
99 |
|
100 | '#######################################################################
|
101 |
|
102 | '***********************************************************************
|
103 | '* *
|
104 | '* This file contains the code for the kalman filter that uses the *
|
105 | '* sensor data as inputs. *
|
106 | '* *
|
107 | '***********************************************************************
|
108 | '* *
|
109 | '* Author: Tom Pycke *
|
110 | '* Filename: ars.c *
|
111 | '* Date: 17/10/2007 *
|
112 | '* File Version: 1.00 *
|
113 | '* *
|
114 | '***********************************************************************
|
115 | '* *
|
116 | '* Comments: *
|
117 | '* To help others to understand the kalman filter, I used one of *
|
118 | '* the most accessible sources with information on it: *
|
119 | '* http://en.wikipedia.org/wiki/Kalman_filter *
|
120 | '* The code is split into 2 parts: a Predict function and an *
|
121 | '* Update function, just as the wikipedia page does. *
|
122 | '* The model I used in the kalman filter is the following: *
|
123 | '* Our gyroscope measures the turnrate in degrees per second. This *
|
124 | '* is the derivative of the angle, called dotAngle. The bias is the *
|
125 | '* output of our gyro when the rotationrate is 0 degrees per second *
|
126 | '* (not rotating). Because of drift it changes over time. *
|
127 | '* So mathematically we just integrate the gyro (dt is timespan *
|
128 | '* since last integration): *
|
129 | '* angle = angle + (dotAngle - bias) * dt *
|
130 | '* When we include the bias in our model, the kalman filter will *
|
131 | '* try to estimate the bias, thanks to our last input: the measured *
|
132 | '* angle. This is just an estimate and comes from the accelerometer. *
|
133 | '* So the state used in our filter had 2 dimensions: [ angle, bias ] *
|
134 | '* Jump to the functions to read more about the actual *
|
135 | '* implementation. *
|
136 | '* *
|
137 | '***********************************************************************
|
138 |
|
139 | Sub Init_gyro1dkalman(byval Q_angle As Single , Byval Q_gyro As Single , Byval R_angle As Single)
|
140 | Gyro1dkalman_q_angle = Q_angle
|
141 | Gyro1dkalman_q_gyro = Q_gyro
|
142 | Gyro1dkalman_r_angle = R_angle
|
143 | End Sub
|
144 |
|
145 |
|
146 | Sub Ars_predict(byval Dotangle As Single , Byval Dt As Single)
|
147 |
|
148 | 'Gyro1dkalman_x_angle = Gyro1dkalman_x_angle +(dt *(dotangle - Gyro1dkalman_x_bias))
|
149 | Temp = Dotangle - Gyro1dkalman_x_bias
|
150 | Temp = Temp * Dt
|
151 | Gyro1dkalman_x_angle = Gyro1dkalman_x_angle + Temp
|
152 |
|
153 |
|
154 | 'Gyro1dkalman_p_00 = Gyro1dkalman_p_00 +( -dt *(gyro1dkalman_p_10 + Gyro1dkalman_p_01) + Gyro1dkalman_q_angle * Dt)
|
155 | Temp = -dt
|
156 | Temp1 = Gyro1dkalman_p_10 + Gyro1dkalman_p_01
|
157 | Temp = Temp * Temp1
|
158 | Temp1 = Gyro1dkalman_q_angle * Dt
|
159 | Temp = Temp + Temp1
|
160 | Gyro1dkalman_p_00 = Gyro1dkalman_p_00 + Temp
|
161 |
|
162 |
|
163 | 'Gyro1dkalman_p_01 = Gyro1dkalman_p_01 +( -dt * Gyro1dkalman_p_11)
|
164 | Temp = -dt
|
165 | Temp = Temp * Gyro1dkalman_p_11
|
166 | Gyro1dkalman_p_01 = Gyro1dkalman_p_01 + Temp
|
167 |
|
168 |
|
169 | 'Gyro1dkalman_p_10 = Gyro1dkalman_p_10 +( -dt * Gyro1dkalman_p_11)
|
170 | Temp = -dt
|
171 | Temp = Temp * Gyro1dkalman_p_11
|
172 | Gyro1dkalman_p_10 = Gyro1dkalman_p_10 + Temp
|
173 |
|
174 |
|
175 |
|
176 | 'Gyro1dkalman_p_11 = Gyro1dkalman_p_11 +( + Gyro1dkalman_q_gyro * Dt)
|
177 | Temp = Gyro1dkalman_q_gyro * Dt
|
178 | Gyro1dkalman_p_11 = Gyro1dkalman_p_11 + Temp
|
179 |
|
180 |
|
181 |
|
182 | End Sub
|
183 |
|
184 |
|
185 | Function Ars_update(byval Angle_m As Single) As Single
|
186 |
|
187 | Y = Angle_m - Gyro1dkalman_x_angle
|
188 | S = Gyro1dkalman_p_00 + Gyro1dkalman_r_angle
|
189 | K_0 = Gyro1dkalman_p_00 / S
|
190 | K_1 = Gyro1dkalman_p_10 / S
|
191 |
|
192 | 'Gyro1dkalman_x_angle = Gyro1dkalman_x_angle +(k_0 * Y)
|
193 | Temp = K_0 * Y
|
194 | Gyro1dkalman_x_angle = Gyro1dkalman_x_angle + Temp
|
195 |
|
196 | 'Gyro1dkalman_x_bias = Gyro1dkalman_x_bias +(k_1 * Y)
|
197 | Temp = K_1 * Y
|
198 | Gyro1dkalman_x_bias = Gyro1dkalman_x_bias + Temp
|
199 |
|
200 | 'Gyro1dkalman_p_00 = Gyro1dkalman_p_00 -(k_0 * Gyro1dkalman_p_00)
|
201 | Temp = K_0 * Gyro1dkalman_p_00
|
202 | Gyro1dkalman_p_00 = Gyro1dkalman_p_00 - Temp
|
203 |
|
204 |
|
205 | 'Gyro1dkalman_p_01 = Gyro1dkalman_p_01 -(k_0 * Gyro1dkalman_p_01)
|
206 | Temp = K_0 * Gyro1dkalman_p_01
|
207 | Gyro1dkalman_p_01 = Gyro1dkalman_p_01 - Temp
|
208 |
|
209 | 'Gyro1dkalman_p_10 = Gyro1dkalman_p_10 -(k_1 * Gyro1dkalman_p_00)
|
210 | Temp = K_1 * Gyro1dkalman_p_00
|
211 | Gyro1dkalman_p_10 = Gyro1dkalman_p_10 - Temp
|
212 |
|
213 | 'Gyro1dkalman_p_11 = Gyro1dkalman_p_11 -(k_1 * Gyro1dkalman_p_01)
|
214 | Temp = K_1 * Gyro1dkalman_p_01
|
215 | Gyro1dkalman_p_11 = Gyro1dkalman_p_11 - Temp
|
216 |
|
217 | Return Gyro1dkalman_x_angle 'was mache ich hiermit???
|
218 |
|
219 | End Function
|
220 |
|
221 | Function Kalman_filter_auswertung(gyro As Single , Adxl As Single , Dt As Single) As Single
|
222 | '----------------Kalman Filter----------------------------------
|
223 | 'ars_predict(Kalman_gyro_sensor, Kalman_dt) 'Kalman predict
|
224 | 'Neigungswinkel_Filter = ars_update(Kalman_adxl_sensor)
|
225 | '---------------------------------------------------------------
|
226 |
|
227 | Call Ars_predict(gyro , Dt) 'Kalman predict
|
228 | Wert = Ars_update(adxl)
|
229 |
|
230 | Return Wert 'und damit???
|
231 | End Function
|