#![allow(dead_code)] use crate::hardware::mct8316a::motor_startup::FullCurrentThreshold; #[derive(Debug, Clone)] pub struct ClosedLoop1 { pub commutation_mode: CommutationMode, pub closed_loop_acceleration_rate: ClosedLoopRate, pub closed_loop_deceleration_mode: ClosedLoopDecelerationMode, pub closed_loop_deceleration_rate: ClosedLoopRate, pub pwm_frequency: PwmFrequency, pub pwm_modulation: PwmModulation, pub pwm_mode: PwmMode, pub lead_angle_polarity: LeadAnglePolarity, pub lead_angle: f32, } impl Default for ClosedLoop1 { fn default() -> Self { Self { commutation_mode: CommutationMode::Degrees120, closed_loop_acceleration_rate: ClosedLoopRate::VoltsPerSecond0_005, closed_loop_deceleration_mode: ClosedLoopDecelerationMode::DecelerationRate, closed_loop_deceleration_rate: ClosedLoopRate::VoltsPerSecond0_005, pwm_frequency: PwmFrequency::Kilohertz5, pwm_modulation: PwmModulation::HighSide, pwm_mode: PwmMode::SingleEnded, lead_angle_polarity: LeadAnglePolarity::Negative, lead_angle: 0.0, } } } #[derive(Debug, Copy, Clone)] pub enum CommutationMode { Degrees120 = 0x0, Variable120to150 = 0x1, } #[derive(Debug, Copy, Clone)] pub enum ClosedLoopRate { VoltsPerSecond0_005 = 0x00, VoltsPerSecond0_01 = 0x01, VoltsPerSecond0_025 = 0x02, VoltsPerSecond0_05 = 0x03, VoltsPerSecond0_1 = 0x04, VoltsPerSecond0_25 = 0x05, VoltsPerSecond0_5 = 0x06, VoltsPerSecond1 = 0x07, VoltsPerSecond2_5 = 0x08, VoltsPerSecond5 = 0x09, VoltsPerSecond7_5 = 0x0A, VoltsPerSecond10 = 0x0B, VoltsPerSecond12_5 = 0x0C, VoltsPerSecond15 = 0x0D, VoltsPerSecond20 = 0x0E, VoltsPerSecond30 = 0x0F, VoltsPerSecond40 = 0x10, VoltsPerSecond50 = 0x11, VoltsPerSecond60 = 0x12, VoltsPerSecond75 = 0x13, VoltsPerSecond100 = 0x14, VoltsPerSecond125 = 0x15, VoltsPerSecond150 = 0x16, VoltsPerSecond175 = 0x17, VoltsPerSecond200 = 0x18, VoltsPerSecond250 = 0x19, VoltsPerSecond300 = 0x1A, VoltsPerSecond400 = 0x1B, VoltsPerSecond500 = 0x1C, VoltsPerSecond750 = 0x1D, VoltsPerSecond1000 = 0x1E, VoltsPerSecond32767 = 0x1F, } #[derive(Debug, Copy, Clone)] pub enum ClosedLoopDecelerationMode { DecelerationRate = 0x0, AccelerationRate = 0x1, } #[derive(Debug, Copy, Clone)] pub enum PwmFrequency { Kilohertz5 = 0x00, Kilohertz6 = 0x01, Kilohertz7 = 0x02, Kilohertz8 = 0x03, Kilohertz9 = 0x04, Kilohertz10 = 0x05, Kilohertz11 = 0x06, Kilohertz12 = 0x07, Kilohertz13 = 0x08, Kilohertz14 = 0x09, Kilohertz15 = 0x0A, Kilohertz16 = 0x0B, Kilohertz17 = 0x0C, Kilohertz18 = 0x0D, Kilohertz19 = 0x0E, Kilohertz20 = 0x0F, Kilohertz25 = 0x10, Kilohertz30 = 0x11, Kilohertz35 = 0x12, Kilohertz40 = 0x13, Kilohertz45 = 0x14, Kilohertz50 = 0x15, Kilohertz55 = 0x16, Kilohertz60 = 0x17, Kilohertz65 = 0x18, Kilohertz70 = 0x19, Kilohertz75 = 0x1A, Kilohertz80 = 0x1B, Kilohertz85 = 0x1C, Kilohertz90 = 0x1D, Kilohertz95 = 0x1E, Kilohertz100 = 0x1F, } #[derive(Debug, Copy, Clone)] pub enum PwmModulation { HighSide = 0x0, LowSide = 0x1, Mixed = 0x2, } #[derive(Debug, Copy, Clone)] pub enum PwmMode { SingleEnded = 0x0, Complementary = 0x1, } #[derive(Debug, Copy, Clone)] pub enum LeadAnglePolarity { Negative = 0x0, Positive = 0x1, } #[derive(Debug, Clone)] pub struct ClosedLoop2 { pub speed_feedback_mode: SpeedFeedbackMode, pub speed_feedback_division: SpeedFeedbackDivision, pub speed_feedback_config: SpeedFeedbackConfig, pub bemf_threshold: BemfThreshold, pub motor_stop_mode: MotorStopMode, pub motor_stop_brake_time: MotorStopBrakeTime, pub active_low_high_brake_threshold: DutyCycleThreshold, pub brake_pin_threshold: DutyCycleThreshold, pub avs_enable: bool, pub cycle_current_limit: FullCurrentThreshold, } impl Default for ClosedLoop2 { fn default() -> Self { Self { speed_feedback_mode: SpeedFeedbackMode::Always, speed_feedback_division: SpeedFeedbackDivision::Pole2Divide3, speed_feedback_config: SpeedFeedbackConfig::AboveBEMFThreshold, bemf_threshold: BemfThreshold::MilliVolt1, motor_stop_mode: MotorStopMode::HighImpedance, motor_stop_brake_time: MotorStopBrakeTime::Milliseconds1, active_low_high_brake_threshold: DutyCycleThreshold::Immediate, brake_pin_threshold: DutyCycleThreshold::Immediate, avs_enable: false, cycle_current_limit: FullCurrentThreshold::NotApplicable, } } } #[derive(Debug, Copy, Clone)] pub enum SpeedFeedbackMode { Always = 0x0, ClosedLoopOnly = 0x1, FirstOpenLoop = 0x2, } #[derive(Debug, Copy, Clone)] pub enum SpeedFeedbackDivision { Pole2Divide3 = 0x0, Pole2 = 0x1, Pole4 = 0x2, Pole6 = 0x3, Pole8 = 0x4, Pole10 = 0x5, Pole12 = 0x6, Pole14 = 0x7, Pole16 = 0x8, Pole18 = 0x9, Pole20 = 0xA, Pole22 = 0xB, Pole24 = 0xC, Pole26 = 0xD, Pole28 = 0xE, Pole30 = 0xF, } #[derive(Debug, Copy, Clone)] pub enum SpeedFeedbackConfig { AboveBEMFThreshold = 0x0, WhenDriven = 0x1, } #[derive(Debug, Copy, Clone)] pub enum BemfThreshold { MilliVolt1 = 0x0, MilliVolt2 = 0x1, MilliVolt5 = 0x2, MilliVolt10 = 0x3, MilliVolt20 = 0x4, MilliVolt30 = 0x5, } #[derive(Debug, Copy, Clone)] pub enum MotorStopMode { HighImpedance = 0x0, Recirculation = 0x1, LowSideBraking = 0x2, HighSideBraking = 0x3, ActiveSpinDown = 0x4, } #[derive(Debug, Copy, Clone)] pub enum MotorStopBrakeTime { Milliseconds1 = 0x0, Milliseconds2 = 0x1, Milliseconds5 = 0x2, Milliseconds10 = 0x3, Milliseconds15 = 0x4, Milliseconds25 = 0x5, Milliseconds50 = 0x6, Milliseconds75 = 0x7, Milliseconds100 = 0x8, Milliseconds250 = 0x9, Milliseconds500 = 0xA, Milliseconds1000 = 0xB, Milliseconds2500 = 0xC, Milliseconds5000 = 0xD, Milliseconds10000 = 0xE, Milliseconds15000 = 0xF, } #[derive(Debug, Copy, Clone)] pub enum DutyCycleThreshold { Immediate = 0x0, Percent50 = 0x1, Percent25 = 0x2, Percent15 = 0x3, Percent10 = 0x4, Percent7_5 = 0x5, Percent5 = 0x6, Percent2_5 = 0x7, } #[derive(Debug, Clone)] pub struct ClosedLoop3 { pub degauss_samples: DegaussSamples, pub degauss_upper_bound: DegaussUpperBound, pub degauss_lower_bound: DegaussLowerBound, pub integration_cycle_low_threshold: IntegrationCycleLowThreshold, pub integration_cycle_high_threshold: IntegrationCycleHighThreshold, pub integration_duty_cycle_low_threshold: IntegrationDutyCycleThreshold, pub integration_duty_cycle_high_threshold: IntegrationDutyCycleThreshold, pub bemf_threshold2: IntegrationBemfThreshold, pub bemf_threshold1: IntegrationBemfThreshold, pub commutation_method: CommutationMethod, pub degauss_window: DegaussWindow, pub degauss_enable: bool, } impl Default for ClosedLoop3 { fn default() -> Self { Self { degauss_samples: DegaussSamples::Samples2, degauss_upper_bound: DegaussUpperBound::Volts0_15, degauss_lower_bound: DegaussLowerBound::Volts0_09, integration_cycle_low_threshold: IntegrationCycleLowThreshold::Samples3, integration_cycle_high_threshold: IntegrationCycleHighThreshold::Samples4, integration_duty_cycle_low_threshold: IntegrationDutyCycleThreshold::Percent12, integration_duty_cycle_high_threshold: IntegrationDutyCycleThreshold::Percent12, bemf_threshold2: IntegrationBemfThreshold::Value0, bemf_threshold1: IntegrationBemfThreshold::Value0, commutation_method: CommutationMethod::ZC, degauss_window: DegaussWindow::Degrees22_5, degauss_enable: false, } } } #[derive(Debug, Copy, Clone)] pub enum DegaussSamples { Samples2 = 0x0, Samples3 = 0x1, Samples4 = 0x2, Samples5 = 0x3, } #[derive(Debug, Copy, Clone)] pub enum DegaussUpperBound { Volts0_09 = 0x0, Volts0_12 = 0x1, Volts0_15 = 0x2, Volts0_18 = 0x3, } #[derive(Debug, Copy, Clone)] pub enum DegaussLowerBound { Volts0_03 = 0x0, Volts0_06 = 0x1, Volts0_09 = 0x2, Volts0_12 = 0x3, } #[derive(Debug, Copy, Clone)] pub enum IntegrationCycleLowThreshold { Samples3 = 0x0, Samples4 = 0x1, Samples6 = 0x2, Samples8 = 0x3, } #[derive(Debug, Copy, Clone)] pub enum IntegrationCycleHighThreshold { Samples4 = 0x0, Samples6 = 0x1, Samples8 = 0x2, Samples10 = 0x3, } #[derive(Debug, Copy, Clone)] pub enum IntegrationDutyCycleThreshold { Percent12 = 0x0, Percent15 = 0x1, Percent18 = 0x2, Percent20 = 0x3, } #[derive(Debug, Copy, Clone)] pub enum IntegrationBemfThreshold { Value0 = 0x000, Value25 = 0x001, Value50 = 0x002, Value75 = 0x003, Value100 = 0x004, Value125 = 0x005, Value150 = 0x006, Value175 = 0x007, Value200 = 0x008, Value225 = 0x009, Value250 = 0x00A, Value275 = 0x00B, Value300 = 0x00C, Value325 = 0x00D, Value350 = 0x00E, Value375 = 0x00F, Value400 = 0x010, Value425 = 0x011, Value450 = 0x012, Value475 = 0x013, Value500 = 0x014, Value525 = 0x015, Value550 = 0x016, Value575 = 0x017, Value600 = 0x018, Value625 = 0x019, Value650 = 0x01A, Value675 = 0x01B, Value700 = 0x01C, Value725 = 0x01D, Value750 = 0x01E, Value775 = 0x01F, Value800 = 0x020, Value850 = 0x021, Value900 = 0x022, Value950 = 0x023, Value1000 = 0x024, Value1050 = 0x025, Value1100 = 0x026, Value1150 = 0x027, Value1200 = 0x028, Value1250 = 0x029, Value1300 = 0x02A, Value1350 = 0x02B, Value1400 = 0x02C, Value1450 = 0x02D, Value1500 = 0x02E, Value1550 = 0x02F, Value1600 = 0x030, Value1700 = 0x031, Value1800 = 0x032, Value1900 = 0x033, Value2000 = 0x034, Value2100 = 0x035, Value2200 = 0x036, Value2300 = 0x037, Value2400 = 0x038, Value2600 = 0x039, Value2800 = 0x03A, Value3000 = 0x03B, Value3200 = 0x03C, Value3400 = 0x03D, Value3600 = 0x03E, Value3800 = 0x03F, } #[derive(Debug, Copy, Clone)] pub enum CommutationMethod { ZC = 0x0, Integration = 0x1, } #[derive(Debug, Copy, Clone)] pub enum DegaussWindow { Degrees22_5 = 0x0, Degrees10 = 0x1, Degrees15 = 0x2, Degrees18 = 0x3, Degrees30 = 0x4, Degrees37_5 = 0x5, Degrees45 = 0x6, Degrees60 = 0x7, } #[derive(Debug, Clone)] pub struct ClosedLoop4 { pub wcomp_blanking_enable: bool, pub fast_deceleration_duty_window: LowerPercentLimit, pub fast_deceleration_duty_threshold: UpperPercentLimit, pub dynamic_brake_current_lower_threshold: FullCurrentThreshold, pub dynamic_braking_current_enable: bool, pub fast_deceleration_enable: bool, pub fast_deceleration_current_threshold: FullCurrentThreshold, pub fast_brake_delta: FastBrakeDelta, } impl Default for ClosedLoop4 { fn default() -> Self { Self { wcomp_blanking_enable: false, fast_deceleration_duty_window: LowerPercentLimit::Percent0, fast_deceleration_duty_threshold: UpperPercentLimit::Percent100, dynamic_brake_current_lower_threshold: FullCurrentThreshold::NotApplicable, dynamic_braking_current_enable: false, fast_deceleration_enable: false, fast_deceleration_current_threshold: FullCurrentThreshold::NotApplicable, fast_brake_delta: FastBrakeDelta::Percent0_5, } } } #[derive(Debug, Copy, Clone)] pub enum LowerPercentLimit { Percent0 = 0x0, Percent2_5 = 0x1, Percent5 = 0x2, Percent7_5 = 0x3, Percent10 = 0x4, Percent15 = 0x5, Percent20 = 0x6, Percent25 = 0x7, } #[derive(Debug, Copy, Clone)] pub enum UpperPercentLimit { Percent100 = 0x0, Percent95 = 0x1, Percent90 = 0x2, Percent85 = 0x3, Percent80 = 0x4, Percent75 = 0x5, Percent70 = 0x6, Percent65 = 0x7, } #[derive(Debug, Copy, Clone)] pub enum FastBrakeDelta { Percent0_5 = 0x0, Percent1 = 0x1, Percent1_5 = 0x2, Percent2 = 0x3, Percent2_5 = 0x4, Percent3 = 0x5, Percent4 = 0x6, Percent5 = 0x7, }