-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexample-hal-adc-sensors.rs
135 lines (111 loc) · 4.52 KB
/
example-hal-adc-sensors.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
#![no_main]
#![no_std]
use cortex_m as cm;
use cortex_m_rt::entry;
use embedded_hal::digital::v2::OutputPin;
use panic_rtt_target as _;
use rtt_target::{rprintln, rtt_init_print};
use stm32f1xx_hal::{adc::Adc, prelude::*, stm32};
#[entry]
fn main() -> ! {
let p = stm32::Peripherals::take().unwrap();
rtt_init_print!();
let mut flash = p.FLASH.constrain();
let mut rcc = p.RCC.constrain();
let clocks = rcc.cfgr.adcclk(2.mhz()).freeze(&mut flash.acr);
rprintln!("SYSCLK: {} Hz ...", clocks.sysclk().0);
rprintln!("PCLK2: {} Hz ...", clocks.pclk2().0);
rprintln!("ADCCLK: {} Hz ...", clocks.adcclk().0);
let mut gpioa = p.GPIOA.split(&mut rcc.apb2);
let mut gpiob = p.GPIOB.split(&mut rcc.apb2);
let mut gpioc = p.GPIOC.split(&mut rcc.apb2);
let mut gpiod = p.GPIOD.split(&mut rcc.apb2);
// PA0-PA7 analog input: ADC_IN0 .. ADC_IN7
let _ch0 = gpioa.pa0.into_analog(&mut gpioa.crl);
let _ch1 = gpioa.pa1.into_analog(&mut gpioa.crl);
let _ch2 = gpioa.pa2.into_analog(&mut gpioa.crl);
let _ch3 = gpioa.pa3.into_analog(&mut gpioa.crl);
let ch4 = gpioa.pa4.into_analog(&mut gpioa.crl);
let _ch5 = gpioa.pa5.into_analog(&mut gpioa.crl);
let ch6 = gpioa.pa6.into_analog(&mut gpioa.crl);
let ch7 = gpioa.pa7.into_analog(&mut gpioa.crl);
// PB0-PB1 analog input: ADC_IN8 .. ADC_IN9
let ch8 = gpiob.pb0.into_analog(&mut gpiob.crl);
let ch9 = gpiob.pb1.into_analog(&mut gpiob.crl);
// PC0-PC5 analog input: ADC_IN10 .. ADC_IN15
let ch10 = gpioc.pc0.into_analog(&mut gpioc.crl);
let ch11 = gpioc.pc1.into_analog(&mut gpioc.crl);
let _ch12 = gpioc.pc2.into_analog(&mut gpioc.crl);
let _ch13 = gpioc.pc3.into_analog(&mut gpioc.crl);
let _ch14 = gpioc.pc4.into_analog(&mut gpioc.crl);
let ch15 = gpioc.pc5.into_analog(&mut gpioc.crl);
// PC7: GPIO push-pull output: enable IR LEDs of all the front sensors
let mut front_leds = gpioc.pc7.into_push_pull_output(&mut gpioc.crl);
// PD9: push-pull output: enable IR LEDs of all 3 floor sensors
let mut bottom_leds = gpiod.pd9.into_push_pull_output(&mut gpiod.crh);
// ADC setup
let mut adc = Adc::adc1(p.ADC1, &mut rcc.apb2, clocks);
let max_range: u16 = adc.max_sample();
let mut front_left_90 = ch10;
let mut front_left_45 = ch4;
let mut front_center = ch6;
let mut front_right_45 = ch15;
let mut front_right_90 = ch8;
let mut bottom_left = ch11;
let mut bottom_center = ch7;
let mut bottom_right = ch9;
rprintln!("Start ADC readings...");
loop {
//let data: u16 = adc.read(&mut ch8).unwrap();
front_leds.set_low().unwrap();
let sll: u16 = adc.read(&mut front_left_90).unwrap();
let slc: u16 = adc.read(&mut front_left_45).unwrap();
let scc: u16 = adc.read(&mut front_center).unwrap();
let src: u16 = adc.read(&mut front_right_45).unwrap();
let srr: u16 = adc.read(&mut front_right_90).unwrap();
bottom_leds.set_low().unwrap();
let sl: u16 = adc.read(&mut bottom_left).unwrap();
let sc: u16 = adc.read(&mut bottom_center).unwrap();
let sr: u16 = adc.read(&mut bottom_right).unwrap();
rprintln!(
"front: ({},{},{},{},{}) bottom: ({},{},{})",
max_range - sll,
max_range - slc,
max_range - scc,
max_range - src,
max_range - srr,
max_range - sl,
max_range - sc,
max_range - sr
);
front_leds.set_high().unwrap();
let sll: u16 = adc.read(&mut front_left_90).unwrap();
let slc: u16 = adc.read(&mut front_left_45).unwrap();
let scc: u16 = adc.read(&mut front_center).unwrap();
let src: u16 = adc.read(&mut front_right_45).unwrap();
let srr: u16 = adc.read(&mut front_right_90).unwrap();
front_leds.set_low().unwrap();
bottom_leds.set_high().unwrap();
let sl: u16 = adc.read(&mut bottom_left).unwrap();
let sc: u16 = adc.read(&mut bottom_center).unwrap();
let sr: u16 = adc.read(&mut bottom_right).unwrap();
bottom_leds.set_low().unwrap();
rprintln!(
"front: ({},{},{},{},{}) bottom: ({},{},{})\n",
max_range - sll,
max_range - slc,
max_range - scc,
max_range - src,
max_range - srr,
max_range - sl,
max_range - sc,
max_range - sr
);
delay(1000000);
}
}
fn delay(count: u32) {
for _ in 0..count {
cm::asm::nop();
}
}