TIM_SetCompare3 (TIM1, T0 + T1 + T2); // W+?
break;?
case 3:?
// U - 導通,V - 導通,W + 導通?
TIM_SetCompare1 (TIM1, T0); // U-?
TIM_SetCompare2 (TIM1, T0); // V-?
TIM_SetCompare3 (TIM1, T0 + T1 + T2); // W+?
break;?
case 4:?
// U - 導通,V + 導通,W - 導通?
TIM_SetCompare1 (TIM1, T0); // U-?
TIM_SetCompare2 (TIM1, T0 + T1 + T2); // V+?
TIM_SetCompare3 (TIM1, T0); // W-?
break;?
case 5:?
// U + 導通,V - 導通,W - 導通?
TIM_SetCompare1 (TIM1, T0 + T1 + T2); // U+?
TIM_SetCompare2 (TIM1, T0); // V-?
TIM_SetCompare3 (TIM1, T0); // W-?
break;?
case 6:?
// U - 導通,V + 導通,W + 導通?
TIM_SetCompare1 (TIM1, T0); // U-?
TIM_SetCompare2 (TIM1, T0 + T1 + T2); // V+?
TIM_SetCompare3 (TIM1, T0 + T1); // W+?
break;?
default:?
// 異常情況:關閉所有 PWM 輸出?
TIM_SetCompare1 (TIM1, 0);?
TIM_SetCompare2 (TIM1, 0);?
TIM_SetCompare3 (TIM1, 0);?
break;?
}?
// 配置互補通道(下橋臂 PWM,與上橋臂互補,避免上下橋臂直通)?
TIM_SetCompare1N (TIM1, Ts - TIM_GetCompare1 (TIM1)); // U-(互補于 U+)?
TIM_SetCompare2N (TIM1, Ts - TIM_GetCompare2 (TIM1)); // V-(互補于 V+)?
TIM_SetCompare3N (TIM1, Ts - TIM_GetCompare3 (TIM1)); // W-(互補于 W+)?
}?
?### 6.3 DShot完整代碼(接收+解析)?
DShot接收需通過定時器輸入捕獲解析飛控發送的脈沖信號,需處理同步位識別、CRC校驗與油門值提取,代碼如下:?
```c?
// DShot接收全局變量?
uint8_t dshot_rx_buf[20] = {0}; // 存儲20bit幀數據?
uint8_t dshot_rx_cnt = 0; // 接收bit計數?
uint16_t dshot_throttle = 0; // 解析后的油門值?
uint8_t dshot_rx_flag = 0; // 接收完成標志(1=完成)?
/**?
* @brief TIM2初始化(DShot接收:輸入捕獲模式)?
*/?
void DShot_RX_TIM_Init(void) {?
// 1. GPIO初始化(PA15=TIM2_CH1,輸入模式)?
GPIO_InitTypeDef GPIO_InitStruct;?
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);?
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;?
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;?
GPIO_InitStruct.GPIO_PuPd = GPIO_Pu