stepper_motion/config/
motor.rs1use heapless::String;
4use serde::Deserialize;
5
6use super::limits::SoftLimits;
7use super::units::{Degrees, DegreesPerSec, DegreesPerSecSquared, Microsteps};
8
9#[derive(Debug, Clone, Deserialize)]
11pub struct MotorConfig {
12 pub name: String<32>,
14
15 pub steps_per_revolution: u16,
17
18 pub microsteps: Microsteps,
20
21 #[serde(default = "default_gear_ratio")]
23 pub gear_ratio: f32,
24
25 #[serde(rename = "max_velocity_deg_per_sec")]
27 pub max_velocity: DegreesPerSec,
28
29 #[serde(rename = "max_acceleration_deg_per_sec2")]
31 pub max_acceleration: DegreesPerSecSquared,
32
33 #[serde(default)]
35 pub invert_direction: bool,
36
37 #[serde(default)]
39 pub limits: Option<SoftLimits>,
40
41 #[serde(default, rename = "backlash_compensation_deg")]
43 pub backlash_compensation: Option<Degrees>,
44}
45
46fn default_gear_ratio() -> f32 {
47 1.0
48}
49
50impl MotorConfig {
51 pub fn total_steps_per_revolution(&self) -> u32 {
53 (self.steps_per_revolution as f32 * self.microsteps.value() as f32 * self.gear_ratio)
54 as u32
55 }
56
57 pub fn steps_per_degree(&self) -> f32 {
59 self.total_steps_per_revolution() as f32 / 360.0
60 }
61}
62
63#[cfg(test)]
64mod tests {
65 use super::*;
66
67 #[test]
68 fn test_total_steps() {
69 let config = MotorConfig {
70 name: String::try_from("test").unwrap(),
71 steps_per_revolution: 200,
72 microsteps: Microsteps::SIXTEENTH,
73 gear_ratio: 2.0,
74 max_velocity: DegreesPerSec(360.0),
75 max_acceleration: DegreesPerSecSquared(720.0),
76 invert_direction: false,
77 limits: None,
78 backlash_compensation: None,
79 };
80
81 assert_eq!(config.total_steps_per_revolution(), 6400);
83 }
84}