use controller board LED, adjust blink rate based on potentiometer
This commit is contained in:
parent
c408a06e63
commit
74fa427b5d
4 changed files with 40 additions and 43 deletions
26
Cargo.toml
26
Cargo.toml
|
@ -3,35 +3,19 @@ authors = ["Joe Ardent <code@ardent.nebcorp.com>"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
name = "tinfoc"
|
name = "tinfoc"
|
||||||
version = "0.1.0"
|
version = "0.0.1"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cortex-m = "0.7"
|
cortex-m = { version = "0.7", features = ["critical-section-single-core"] }
|
||||||
cortex-m-rt = "0.7"
|
cortex-m-rt = "0.7"
|
||||||
cortex-m-semihosting = "0.5"
|
defmt = "0.3"
|
||||||
# panic-halt = "0.2"
|
defmt-rtt = "0.4"
|
||||||
panic-semihosting = "0.6"
|
panic-halt = "0.2"
|
||||||
embedded-hal = "1"
|
|
||||||
nb = "1"
|
|
||||||
|
|
||||||
[dependencies.stm32f3xx-hal]
|
[dependencies.stm32f3xx-hal]
|
||||||
version = "0.10"
|
version = "0.10"
|
||||||
features = ["stm32f302x8", "ld", "rt", "can", "rtc"]
|
features = ["stm32f302x8", "ld", "rt", "can", "rtc"]
|
||||||
|
|
||||||
# Uncomment for the panic example.
|
|
||||||
# panic-itm = "0.4.1"
|
|
||||||
|
|
||||||
# Uncomment for the allocator example.
|
|
||||||
# alloc-cortex-m = "0.4.0"
|
|
||||||
|
|
||||||
# Uncomment for the device example.
|
|
||||||
# Update `memory.x`, set target to `thumbv7em-none-eabihf` in `.cargo/config`,
|
|
||||||
# and then use `cargo build --example device` to build it.
|
|
||||||
# [dependencies.stm32f3]
|
|
||||||
# features = ["stm32f303", "rt"]
|
|
||||||
# version = "0.7.1"
|
|
||||||
|
|
||||||
# this lets you use `cargo fix`!
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "tinfoc"
|
name = "tinfoc"
|
||||||
test = false
|
test = false
|
||||||
|
|
21
README.md
21
README.md
|
@ -4,6 +4,10 @@ A crate that provides an
|
||||||
[FOC](https://www.st.com/en/applications/industrial-motor-control/3-phase-field-oriented-control-foc.html)
|
[FOC](https://www.st.com/en/applications/industrial-motor-control/3-phase-field-oriented-control-foc.html)
|
||||||
motor controller using STM32 Cortex microcontrollers.
|
motor controller using STM32 Cortex microcontrollers.
|
||||||
|
|
||||||
|
Or rather, it *would* if it were done, but it is not. It's currently my embedded programming
|
||||||
|
playground project, but I do intend on making it useful and good. I'll let you know when that's the
|
||||||
|
case, but until then, it's going to be a work in progress.
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
The MCU I'm using is the
|
The MCU I'm using is the
|
||||||
|
@ -24,21 +28,16 @@ linux, you'll need to:
|
||||||
sudo apt install openocd gdb-multiarch
|
sudo apt install openocd gdb-multiarch
|
||||||
```
|
```
|
||||||
|
|
||||||
|
[probe-rs](https://probe.rs/) is a convenient tool for interacting with your dev board.
|
||||||
|
|
||||||
## Running on hardware
|
## Running on hardware
|
||||||
|
|
||||||
Assuming you've plugged your board into your computer via USB:
|
Assuming you've plugged your board into your computer via USB:
|
||||||
|
|
||||||
1. build TinFOC with `cargo build`
|
1. build TinFOC with `cargo build`
|
||||||
2. connect to the board with `openocd &`
|
2. load it onto the board and run it with:
|
||||||
3. start gdb: `gdb-multiarch -q target/thumbv7em-none-eabihf/debug/tinfoc`
|
- `probe-rs run --chip=STM32F302R8Tx target/thumbv7em-none-eabihf/debug/tinfoc`
|
||||||
4. inside gdb, attach to openocd: `target remote :3333`
|
|
||||||
5. inside gdb, load the program into the MCU's flash: `load`
|
|
||||||
|
|
||||||
Assuming that was successful, you can then enter `continue` in the gdb console, which will run the
|
If all went well, and your IHM07M1 motor controller board is attached to the Nucleo dev board, the
|
||||||
program on the hardware; you should see the `LD2` LED start blinking green, on and off, every 2
|
red LED on the IHM07M1 should start to blink, and you can turn the potentiometer to adjust the
|
||||||
seconds. If you disconnect the board from power and then reconnect, it will automatically run the
|
blinking rate.
|
||||||
program.
|
|
||||||
|
|
||||||
There are no doubt other ways to flash the board, and I'll update here when I adjust my flow; I'm a
|
|
||||||
newb when it comes to this stuff.
|
|
||||||
|
|
3
build.rs
3
build.rs
|
@ -40,4 +40,7 @@ fn main() {
|
||||||
|
|
||||||
// Set the linker script to the one provided by cortex-m-rt.
|
// Set the linker script to the one provided by cortex-m-rt.
|
||||||
println!("cargo:rustc-link-arg=-Tlink.x");
|
println!("cargo:rustc-link-arg=-Tlink.x");
|
||||||
|
|
||||||
|
// use defmt
|
||||||
|
println!("cargo:rustc-link-arg=-Tdefmt.x");
|
||||||
}
|
}
|
||||||
|
|
33
src/main.rs
33
src/main.rs
|
@ -1,33 +1,44 @@
|
||||||
#![no_std]
|
#![no_std]
|
||||||
#![no_main]
|
#![no_main]
|
||||||
|
|
||||||
// pick a panicking behavior
|
extern crate panic_halt; // you can put a breakpoint on `rust_begin_unwind` to catch panics
|
||||||
//extern crate panic_halt; // you can put a breakpoint on `rust_begin_unwind` to catch panics
|
|
||||||
// extern crate panic_abort; // requires nightly
|
|
||||||
// extern crate panic_itm; // logs messages over ITM; requires ITM support
|
|
||||||
extern crate panic_semihosting; // logs messages to the host stderr; requires a debugger
|
|
||||||
|
|
||||||
use cortex_m_rt::entry;
|
use stm32f3xx_hal::{self as hal, adc, pac, prelude::*};
|
||||||
|
|
||||||
//use embedded_hal::digital::OutputPin;
|
use defmt_rtt as _;
|
||||||
use stm32f3xx_hal::{self as hal, pac, prelude::*};
|
|
||||||
|
|
||||||
#[entry]
|
static POT_MAX: u16 = 4095;
|
||||||
|
|
||||||
|
#[cortex_m_rt::entry]
|
||||||
fn main() -> ! {
|
fn main() -> ! {
|
||||||
let sp = pac::Peripherals::take().unwrap();
|
let sp = pac::Peripherals::take().unwrap();
|
||||||
let mut rcc = sp.RCC.constrain();
|
let mut rcc = sp.RCC.constrain();
|
||||||
let mut gpiob = sp.GPIOB.split(&mut rcc.ahb);
|
let mut gpiob = sp.GPIOB.split(&mut rcc.ahb);
|
||||||
let mut led = gpiob
|
let mut led = gpiob
|
||||||
.pb13
|
.pb2
|
||||||
.into_push_pull_output(&mut gpiob.moder, &mut gpiob.otyper);
|
.into_push_pull_output(&mut gpiob.moder, &mut gpiob.otyper);
|
||||||
|
|
||||||
|
let mut pot = gpiob.pb1.into_analog(&mut gpiob.moder, &mut gpiob.pupdr);
|
||||||
|
|
||||||
let mut flash = sp.FLASH.constrain();
|
let mut flash = sp.FLASH.constrain();
|
||||||
let clocks = rcc.cfgr.freeze(&mut flash.acr);
|
let clocks = rcc.cfgr.freeze(&mut flash.acr);
|
||||||
let cp = cortex_m::Peripherals::take().unwrap();
|
let cp = cortex_m::Peripherals::take().unwrap();
|
||||||
let mut delay = hal::delay::Delay::new(cp.SYST, clocks);
|
let mut delay = hal::delay::Delay::new(cp.SYST, clocks);
|
||||||
|
|
||||||
|
let adc_common = adc::CommonAdc::new(sp.ADC1_2, &clocks, &mut rcc.ahb);
|
||||||
|
let mut padc = adc::Adc::new(
|
||||||
|
sp.ADC1,
|
||||||
|
adc::config::Config::default(),
|
||||||
|
&clocks,
|
||||||
|
&adc_common,
|
||||||
|
);
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
let pot_out: u16 = padc.read(&mut pot).unwrap_or(0);
|
||||||
|
let pot_out = (POT_MAX - pot_out) as f32 / POT_MAX as f32;
|
||||||
|
let pot_out = (4000.0 * pot_out) as u32;
|
||||||
|
|
||||||
led.toggle().unwrap();
|
led.toggle().unwrap();
|
||||||
delay.delay_ms(2000_u32);
|
delay.delay_ms(pot_out);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue