sl-controls 80a41e5008 feat: motor driver layer — differential drive, steer ramp, estop
Adds motor_driver.c/h between the balance PID and the raw
hoverboard UART driver:

- Differential drive: balance_cmd → speed, steer_cmd → steer
- Steer-only ramping at MOTOR_STEER_RAMP_RATE (balance PID keeps
  full immediate authority — no ramp on speed channel)
- Headroom clamp: reduces steer so |speed|+|steer|<=MOTOR_CMD_MAX
  ensuring ESC never clips the balance command
- Emergency stop: latches on TILT_FAULT, clears on BALANCE_DISARMED;
  send path stays in 50Hz ESC tick to avoid flooding UART

main.c: replace bare hoverboard_send() with motor_driver_update();
config.h: MOTOR_CMD_MAX=1000, MOTOR_STEER_RAMP_RATE=20 counts/ms

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 17:15:40 -05:00

148 lines
5.0 KiB
C

#ifndef CONFIG_H
#define CONFIG_H
// ============================================
// SaltyLab Balance Bot — MAMBA F722S FC
// Pin assignments from Betaflight: DIAT-MAMBAF722_2022B
// ============================================
// --- IMU: MPU6000 (SPI1) ---
// SPI1: PA5=SCK, PA6=MISO, PA7=MOSI
// WHO_AM_I = 0x68
#define MPU_SPI SPI1
#define MPU_CS_PORT GPIOA
#define MPU_CS_PIN GPIO_PIN_4 // GYRO_CS 1
#define MPU_EXTI_PORT GPIOC
#define MPU_EXTI_PIN GPIO_PIN_4 // GYRO_EXTI 1 (data ready IRQ)
#define GYRO_ALIGN CW270 // gyro_1_sensor_align = CW270
// --- Barometer: BMP280 or DPS310 (I2C1) ---
#define BARO_I2C I2C1
#define BARO_SCL_PORT GPIOB
#define BARO_SCL_PIN GPIO_PIN_8 // I2C_SCL 1
#define BARO_SDA_PORT GPIOB
#define BARO_SDA_PIN GPIO_PIN_9 // I2C_SDA 1
// Magnetometer also on I2C1 (external, header only)
// --- LEDs ---
#define LED1_PORT GPIOC
#define LED1_PIN GPIO_PIN_15 // LED 1 (active low)
#define LED2_PORT GPIOC
#define LED2_PIN GPIO_PIN_14 // LED 2 (active low)
// --- Buzzer ---
#define BEEPER_PORT GPIOB
#define BEEPER_PIN GPIO_PIN_2 // BEEPER 1
#define BEEPER_INVERTED 1 // beeper_inversion = ON
// beeper_od = OFF (push-pull)
// --- Battery Monitoring (ADC3) ---
#define ADC_VBAT_PORT GPIOC
#define ADC_VBAT_PIN GPIO_PIN_1 // ADC_BATT 1
#define ADC_CURR_PORT GPIOC
#define ADC_CURR_PIN GPIO_PIN_3 // ADC_CURR 1
#define ADC_IBAT_SCALE 115 // ibata_scale
// --- LED Strip (WS2812) ---
#define LED_STRIP_PORT GPIOB
#define LED_STRIP_PIN GPIO_PIN_3 // LED_STRIP 1 (TIM2_CH2)
// --- OSD: MAX7456 (SPI2) ---
#define OSD_SPI SPI2
#define OSD_CS_PORT GPIOB
#define OSD_CS_PIN GPIO_PIN_12 // OSD_CS 1
// SPI2: PB13=SCK, PB14=MISO, PB15=MOSI
// --- Blackbox Flash: M25P16 (SPI3) ---
#define FLASH_SPI SPI3
#define FLASH_CS_PORT GPIOA
#define FLASH_CS_PIN GPIO_PIN_15 // FLASH_CS 1
// SPI3: PC10=SCK, PC11=MISO, PB5=MOSI
// --- Motor Outputs (PWM/DShot) ---
#define MOTOR1_PORT GPIOC
#define MOTOR1_PIN GPIO_PIN_8 // TIM8_CH3
#define MOTOR2_PORT GPIOC
#define MOTOR2_PIN GPIO_PIN_9 // TIM8_CH4
#define MOTOR3_PORT GPIOA
#define MOTOR3_PIN GPIO_PIN_8 // TIM1_CH1
#define MOTOR4_PORT GPIOA
#define MOTOR4_PIN GPIO_PIN_9 // TIM1_CH2
#define MOTOR5_PORT GPIOB
#define MOTOR5_PIN GPIO_PIN_0 // TIM3_CH3
#define MOTOR6_PORT GPIOB
#define MOTOR6_PIN GPIO_PIN_1 // TIM3_CH4
#define MOTOR7_PORT GPIOA
#define MOTOR7_PIN GPIO_PIN_10 // TIM1_CH3
#define MOTOR8_PORT GPIOB
#define MOTOR8_PIN GPIO_PIN_4 // TIM3_CH1
// --- UARTs ---
// USART1: PB6=TX, PB7=RX (serial 0, SmartAudio/VTX)
#define UART1_TX_PORT GPIOB
#define UART1_TX_PIN GPIO_PIN_6
#define UART1_RX_PORT GPIOB
#define UART1_RX_PIN GPIO_PIN_7
// USART2: PA2=TX, PA3=RX (serial 1)
#define UART2_TX_PORT GPIOA
#define UART2_TX_PIN GPIO_PIN_2
#define UART2_RX_PORT GPIOA
#define UART2_RX_PIN GPIO_PIN_3
// USART3: PB10=TX, PB11=RX (serial 2, SBUS RX default)
#define UART3_TX_PORT GPIOB
#define UART3_TX_PIN GPIO_PIN_10
#define UART3_RX_PORT GPIOB
#define UART3_RX_PIN GPIO_PIN_11
// UART4: PA0=TX, PA1=RX (serial 3)
#define UART4_TX_PORT GPIOA
#define UART4_TX_PIN GPIO_PIN_0
#define UART4_RX_PORT GPIOA
#define UART4_RX_PIN GPIO_PIN_1
// UART5: PC12=TX, PD2=RX (serial 4)
#define UART5_TX_PORT GPIOC
#define UART5_TX_PIN GPIO_PIN_12
#define UART5_RX_PORT GPIOD
#define UART5_RX_PIN GPIO_PIN_2
// USART6: PC6=TX, PC7=RX (serial 5)
#define UART6_TX_PORT GPIOC
#define UART6_TX_PIN GPIO_PIN_6
#define UART6_RX_PORT GPIOC
#define UART6_RX_PIN GPIO_PIN_7
// --- PINIO (switchable outputs, e.g. VTX power) ---
#define PINIO1_PORT GPIOC
#define PINIO1_PIN GPIO_PIN_2 // pinio_config = 129 (USER1)
#define PINIO2_PORT GPIOC
#define PINIO2_PIN GPIO_PIN_0 // pinio_config = 129 (USER2)
// --- SaltyLab Assignments ---
// Hoverboard ESC: USART2 (PA2=TX, PA3=RX) or USART3
// ELRS Receiver: UART4 (PA0=TX, PA1=RX) — CRSF 420000 baud
// Jetson: USART6 (PC6=TX, PC7=RX)
// Debug: UART5 (PC12=TX, PD2=RX)
// --- PID Tuning ---
#define PID_KP 35.0f
#define PID_KI 1.0f
#define PID_KD 1.0f
#define PID_INTEGRAL_MAX 500.0f
#define PID_LOOP_HZ 1000
// --- Safety ---
#define MAX_TILT_DEG 25.0f
#define RC_TIMEOUT_MS 500
#define ARMING_HOLD_MS 3000
#define MAX_SPEED_LIMIT 100
#define WATCHDOG_TIMEOUT_MS 50
// --- Motor Driver ---
#define MOTOR_CMD_MAX 1000 /* ESC range: -1000..+1000 */
#define MOTOR_STEER_RAMP_RATE 20 /* counts/ms — steer ramp only */
#endif // CONFIG_H