-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathmain.rs
159 lines (139 loc) · 4.62 KB
/
main.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#![deny(warnings)]
#![no_std]
#![no_main]
#[allow(unused)]
use panic_abort;
use core::f32::{INFINITY, NEG_INFINITY};
use core::fmt::Write;
use cortex_m_rt::{entry, exception, ExceptionFrame};
use hal::delay;
use hal::prelude::*;
use hal::time::Bps;
use mpu9250::Mpu9250;
#[entry]
fn main() -> ! {
let device = hal::pac::Peripherals::take().unwrap();
let core = cortex_m::Peripherals::take().unwrap();
let mut rcc = device.RCC.constrain();
let mut flash = device.FLASH.constrain();
let clocks = rcc
.cfgr
.sysclk(64.mhz())
.pclk1(32.mhz())
.pclk2(36.mhz())
.freeze(&mut flash.acr);
let gpioa = device.GPIOA.split(&mut rcc.ahb);
let gpiob = device.GPIOB.split(&mut rcc.ahb);
let serial =
device
.USART1
.serial((gpioa.pa9, gpioa.pa10), Bps(115200), clocks);
let (mut tx, _rx) = serial.split();
// COBS frame
tx.write(0x00).unwrap();
let mut l = tx;
write!(l, "logger ok\r\n").unwrap();
let mut delay = delay::Delay::new(core.SYST, clocks);
// SPI1
let ncs = gpiob.pb9.output().push_pull();
let scl_sck = gpiob.pb3;
let sda_sdi_mosi = gpiob.pb5;
let ad0_sdo_miso = gpiob.pb4;
let spi = device.SPI1.spi(
(scl_sck, ad0_sdo_miso, sda_sdi_mosi),
mpu9250::MODE,
1.mhz(),
clocks,
);
let mut mpu = Mpu9250::marg_default(spi, ncs, &mut delay).unwrap();
let sample_count = 500;
let mut mag_max_x: f32 = NEG_INFINITY;
let mut mag_max_y: f32 = NEG_INFINITY;
let mut mag_max_z: f32 = NEG_INFINITY;
let mut mag_min_x: f32 = INFINITY;
let mut mag_min_y: f32 = INFINITY;
let mut mag_min_z: f32 = INFINITY;
let [mag_sensitivity_x, mag_sensitivity_y, mag_sensitivity_z] =
mpu.mag_sensitivity_adjustments::<[f32; 3]>();
write!(
l,
"factory sensitivity adjustments: {:?}, {:?}, {:?}\r\n",
mag_sensitivity_x, mag_sensitivity_y, mag_sensitivity_z
)
.unwrap();
write!(
l,
"Mag Calibration: Wave device in a figure eight until done!\r\n"
)
.unwrap();
delay.delay_ms(200u32);
for _ in 0..sample_count {
match mpu.mag::<[f32; 3]>() {
Ok([mx, my, mz]) => {
// x
if mx > mag_max_x {
mag_max_x = mx;
}
if mx < mag_min_x {
mag_min_x = mx;
}
// y
if my > mag_max_y {
mag_max_y = my;
}
if my < mag_min_y {
mag_min_y = my;
}
// z
if mz > mag_max_z {
mag_max_z = mz;
}
if mz < mag_min_z {
mag_min_z = mz;
}
}
Err(e) => {
write!(l, "err: {:?}\r\n", e).unwrap();
}
}
delay.delay_ms(5u32);
}
// Get hard iron correction
let mag_avg_bias_x = ((mag_max_x + mag_min_x) as f32) / 2.; // get average x mag bias in counts
let mag_avg_bias_y = ((mag_max_y + mag_min_y) as f32) / 2.; // get average y mag bias in counts
let mag_avg_bias_z = ((mag_max_z + mag_min_z) as f32) / 2.; // get average z mag bias in counts
let mag_res = mpu.mag_resolution();
// save mag biases in G for main program
let mag_bias_x = mag_avg_bias_x * mag_res * mag_sensitivity_x;
let mag_bias_y = mag_avg_bias_y * mag_res * mag_sensitivity_y;
let mag_bias_z = mag_avg_bias_z * mag_res * mag_sensitivity_z;
// Get soft iron correction estimate
let mag_scale_x = ((mag_max_x - mag_min_x) as f32) / 2.; // get average x axis max chord length in counts
let mag_scale_y = ((mag_max_y - mag_min_y) as f32) / 2.; // get average y axis max chord length in counts
let mag_scale_z = ((mag_max_z - mag_min_z) as f32) / 2.; // get average z axis max chord length in counts
let mut avg_rad = mag_scale_x + mag_scale_y + mag_scale_z;
avg_rad /= 3.0;
let final_mag_scale_x = avg_rad / (mag_scale_x);
let final_mag_scale_y = avg_rad / (mag_scale_y);
let final_mag_scale_z = avg_rad / (mag_scale_z);
write!(
l,
"loop done; bias: ({}, {}, {}); scale: ({}, {}, {})\r\n",
mag_bias_x,
mag_bias_y,
mag_bias_z,
final_mag_scale_x,
final_mag_scale_y,
final_mag_scale_z
)
.unwrap();
loop {}
}
#[exception]
unsafe fn HardFault(ef: &ExceptionFrame) -> ! {
panic!("HardFault at {:#?}", ef);
}
#[exception]
unsafe fn DefaultHandler(irqn: i16) {
panic!("Unhandled exception (IRQn = {})", irqn);
}