Quad BLDC Drone ESC Design
Table
| MCU | Motor Channels | DRV8308s | Role |
|---|---|---|---|
| U1 | M1, M2 | U3, U4 | Configure/control front two DRV8308 channels |
| U2 | M3, M4 | U5, U6 | Configure/control rear two DRV8308 channels |
Table
| Function | DRV8308 Pin | Firmware Use |
|---|---|---|
| SPI SCLK | SCLK | Register configuration |
| SPI CS | SCS | Per-driver chip select |
| SPI MOSI | SDATAI | Register write |
| SPI MISO | SDATAO | Register readback |
| Speed command | CLKIN | PWM/frequency speed command |
| Direction | DIR | Motor direction |
| Enable | ENABLE | Hardware motor enable |
| Brake | BRAKE | Braking command/failsafe |
| Reset | RESET | Driver reset |
| Fault | FAULTn | Fault interrupt/input |
| Lock/status | LOCKn | Speed lock/status input |
| Speed feedback | FGOUT | Optional timer input capture |
C
#include "main.h" #include <stdint.h> #include <stdbool.h> SPI_HandleTypeDef hspi1; TIM_HandleTypeDef htim1; #define DRV_COUNT 2 typedef struct { GPIO_TypeDef *cs_port; uint16_t cs_pin; GPIO_TypeDef *enable_port; uint16_t enable_pin; GPIO_TypeDef *brake_port; uint16_t brake_pin; GPIO_TypeDef *fault_port; uint16_t fault_pin; } drv8308_t; static drv8308_t drv[DRV_COUNT]; static uint16_t drv8308_transfer(uint8_t idx, uint16_t word) { uint8_t tx[2] = { (uint8_t)(word >> 8), (uint8_t)(word & 0xFF) }; uint8_t rx[2] = {0}; HAL_GPIO_WritePin(drv[idx].cs_port, drv[idx].cs_pin, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, tx, rx, 2, HAL_MAX_DELAY); HAL_GPIO_WritePin(drv[idx].cs_port, drv[idx].cs_pin, GPIO_PIN_SET); return ((uint16_t)rx[0] << 8) | rx[1]; } static void drv8308_write_baseline_open_loop(uint8_t idx) { const uint16_t cfg[][2] = { {0x00, 0x0911}, {0x01, 0x0000}, {0x02, 0x04FF}, {0x03, 0x6800}, {0x04, 0x40D2}, {0x05, 0x0000}, {0x06, 0x0000}, {0x07, 0x0000}, {0x08, 0x0000}, {0x09, 0x0000}, {0x0A, 0xF000}, {0x0B, 0x0000} }; for (uint32_t i = 0; i < sizeof(cfg)/sizeof(cfg[0]); i++) { uint16_t word = (uint16_t)((cfg[i][0] << 12) | (cfg[i][1] & 0x0FFF)); (void)drv8308_transfer(idx, word); } } static void drv8308_enable(uint8_t idx, bool en) { HAL_GPIO_WritePin(drv[idx].enable_port, drv[idx].enable_pin, en ? GPIO_PIN_SET : GPIO_PIN_RESET); } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_SPI1_Init(); MX_TIM1_Init(); for (uint8_t i = 0; i < DRV_COUNT; i++) { drv8308_enable(i, false); drv8308_write_baseline_open_loop(i); } while (1) { for (uint8_t i = 0; i < DRV_COUNT; i++) { if (HAL_GPIO_ReadPin(drv[i].fault_port, drv[i].fault_pin) == GPIO_PIN_RESET) { drv8308_enable(i, false); } } HAL_Delay(1); } }
Welcome 👋
Flux helps you build PCBs faster with an AI teammate!
Create your account to collaborate, stay updated, fork your own version, and get instant answers from our AI agent.