AnasSarkiz/usb-c-pd-brushed-motor
USB-C PD-powered motor controller with protected input, selectable 5/9/12 V buck supply, MCU qualification, PWM H-bridge drive, overvoltage sensing, regenerative energy-dump resistors, and safety interlocks.
- Version
- 0.0.1-a48-cloud-pipeline9-unrouted-c41d79a-305b1e7a
- License
- unset
- Stars
- 0
firmware/pd_policy.h
/* Board A7 PD qualification policy. No GPIO/I2C driver is implied by this file. */
#ifndef MOTOR_PD_POLICY_H
#define MOTOR_PD_POLICY_H
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#define PD_MAX_OBJECTS 7
struct pd_plan {
bool valid;
uint8_t source_object_position;
uint8_t motor_voltage_v;
uint32_t source_generation;
uint32_t source_pdo; /* Exact selected advertisement, not the sink request. */
uint16_t voltage_mv;
uint16_t current_ma;
uint32_t sink_pdo;
};
/* Outward-rounded physical bounds from a qualified measurement adapter.
* Raw ADC validity alone must never set this flag. */
struct pd_voltage_interval {
uint32_t lower_mv, upper_mv;
bool valid;
};
struct pd_observation {
bool attached, communication_ok, fresh_ps_rdy, motor_fault;
uint8_t pe_fsm_state;
uint32_t source_generation, rdo;
struct pd_voltage_interval vbus, motor_rail;
};
struct pd_rail_check {
const struct pd_plan *plan;
const struct pd_observation *observation;
uint8_t selector_bits;
};
struct pd_capabilities {
const uint32_t *source_pdos;
size_t count;
uint32_t source_generation;
};
/* 00=5 V; bit 0=9 V; bit 1=12 V; 11=invalid. */
uint8_t pd_motor_voltage(uint8_t selector_bits);
struct pd_plan pd_make_plan(uint8_t selector_bits, const struct pd_capabilities *capabilities);
bool pd_plan_valid(const struct pd_plan *plan);
bool pd_voltage_interval_valid(const struct pd_voltage_interval *interval);
bool pd_contract_qualified(const struct pd_plan *plan,
const struct pd_observation *observation);
/* Rail check while the bridge is asleep; nFAULT is checked separately at wake. */
bool pd_motor_rail_qualified(const struct pd_rail_check *check);
bool pd_motor_qualified(const struct pd_rail_check *check);
#endif