143. while(!
(ADCSRA&(BIT(ADIF))));
144. AD_data=ADCL;
145. AD_data+=ADCH*256;
146. AD_data-=512;
147. return (AD_data);
148.}
149.
150.
151.//*
152.//-------------------------------------------------------
153.//Kalman滤波,8MHz的处理时间约1.8ms;
154.//-------------------------------------------------------
155.static float angle, angle_dot; //外部需要引用的变量
156.//-------------------------------------------------------
157.static const float Q_angle=0.001, Q_gyro=0.003, R_angle=0.5, dt=0.01;
158. //注意:
dt的取值为kalman滤波器采样时间;
159.static float P[2][2] = {
160. { 1, 0 },
161. { 0, 1 }
162. };
163.
164.static float Pdot[4] ={0,0,0,0};
165.
166.static const char C_0 = 1;
167.
168.static float q_bias, angle_err, PCt_0, PCt_1, E, K_0, K_1, t_0, t_1;
169.//-------------------------------------------------------
170.void Kalman_Filter(float angle_m,float gyro_m) //gyro_m:
gyro_measure
171.{
172. angle+=(gyro_m-q_bias) * dt;
173.
174. Pdot[0]=Q_angle - P[0][1] - P[1][0];
175. Pdot[1]=- P[1][1];
176. Pdot[2]=- P[1][1];
177. Pdot[3]=Q_gyro;
178.
179. P[0][0] += Pdot[0] * dt;
180. P[0][1] += Pdot[1] * dt;
181. P[1][0] += Pdot[2] * dt;
182. P[1][1] += Pdot[3] * dt;
183.
184.
185. angle_err = angle_m - angle;
186.
187.
188. PCt_0 = C_0 * P[0][0];
189. PCt_1 = C_0 * P[1][0];
190.
191. E = R_angle + C_0 * PCt_0;
192.
193. K_0 = PCt_0 / E;
194. K_1 = PCt_1 / E;
195.
196. t_0 = PCt_0;
197. t_1 = C_0 * P[0][1];
198.
199. P[0][0] -= K_0 * t_0;
200. P[0][1] -= K_0 * t_1;
201. P[1][0] -= K_1 * t_0;
202. P[1][1] -= K_1 * t_1;
203.
204.
205. angle += K_0 * angle_err;
206. q_bias += K_1 * angle_err;
207. angle_dot = gyro_m-q_bias;
208.}
209.//*/
210.
211./*
212.//-------------------------------------------------------
213.//互补滤波
214.//-------------------------------------------------------
215.static float angle,angle_dot; //外部需要引用的变量
216.//-------------------------------------------------------
217.static float bias_cf;
218.static const float dt=0.01;
219.//-------------------------------------------------------
220.void complement_filter(float angle_m_cf,float gyro_m_cf)
221.{
222. bias_cf*=0.998; //陀螺仪零飘低通滤波;500次均值;
223. bias_cf+=gyro_m_cf*0.002;
224. angle_dot=gyro_m_cf-bias_cf;
225. angle=(angle+angle_dot*dt)*0.90+angle_m_cf*0.05;
226. //加速度低通滤波;20次均值;按100次每秒计算,低通5Hz;
227.}
228.*/
229.
230.
231.
232.
233.//-------------------------------------------------------
234.//AD采样;
235.//以角度表示;
236.//加速度计:
1.2V=1g=90°;满量程:
1.3V~3.7V;
237.//陀螺仪:
0.5V~4.5V=-80°~+80°;满量程5V=200°=256=200°;
238.//-------------------------------------------------------
239.static float gyro,acceler;
240.//-------------------------------------------------------
241.void AD_calculate(void)
242.{
243.
244. acceler=ADport
(2)+28; //角度校正
245. gyro=ADport(3);
246.
247. acceler*=0.004069; //系数换算:
2.5/(1.2*512);
248. acceler=asin(acceler);
249. gyro*=0.00341; //角速度系数:
(3.14/180)* 100/512=0.01364;
250.
251. Kalman_Filter(acceler,gyro);
252. //complement_filter(acceler,gyro);
253.}
254.
255.
256.
257.//-------------------------------------------------------
258.//PWM输出
259.//-------------------------------------------------------
260.void PWM_output (int PWM_LH,int PWM_RH)
261.{
262. if (PWM_LH<0)
263. {
264. PORTD|=BIT(6);
265. PWM_LH*=-1;
266. }
267. else
268. {
269. PORTD&=~BIT(6);
270. }
271.
272. if (PWM_LH>252)
273. {
274. PWM_LH=252;
275. }
276.
277.
278. if (PWM_RH<0)
279. {
280. PORTD|=BIT(7);
281. PWM_RH*=-1;
282. }
283. else
284. {
285. PORTD&=~BIT(7);
286. }
287.
288. if (PWM_RH>252)
289. {
290. PWM_RH=252;
291. }
292.
293.
294. OCR1AH=0;
295. OCR1AL=PWM_LH; //OC1A输出;
296.
297. OCR1BH=0;
298. OCR1BL=PWM_RH; //OC1B输出;
299.
300.}
301.
302.
303.
304.
305.//-------------------------------------------------------
306.//计算PWM输出值
307.//车辆直径:
76mm; 12*64pulse/rev; 1m=3216pulses;
308.//-------------------------------------------------------
309.//static int speed_diff,speed_diff_all,speed_diff_adjust;
310.//static float K_speed_P,K_speed_I;
311.static float K_voltage,K_angle,K_angle_dot,K_position,K_position_dot;
312.static float K_angle_AD,K_angle_dot_AD,K_position_AD,K_position_dot_AD;
313.static float position,position_dot;
314.static float position_dot_filter;
315.static float PWM;
316.static int speed_output_LH,speed_output_RH;
317.static int Turn_Need,Spe