????????這是第九篇,前面的文章把各個模塊的實現都介紹了一輪,本章是從運行的角度結合波形圖,把整個流程走一遍。
? ? ? ? 先看下一運行的配置,我把一些配置關閉了,這樣跑起來會好分析一些,不同配置跑起來效果會有差異。使用的ServoPwm信號。
1、運行配置
2、ESC上電啟動停止全過程
ESC上焊了很多飛線,用GPIO指示運行的狀態
void MX_GPIO_Init(void)
{gpio_mode_QUICK(GPIOA, GPIO_MODE_OUTPUT, GPIO_PULL_NONE, GPIO_PINS_12);gpio_mode_QUICK(GPIOA, GPIO_MODE_OUTPUT, GPIO_PULL_NONE, GPIO_PINS_15);gpio_mode_QUICK(GPIOB, GPIO_MODE_OUTPUT, GPIO_PULL_NONE, GPIO_PINS_2);gpio_mode_QUICK(GPIOB, GPIO_MODE_OUTPUT, GPIO_PULL_NONE, GPIO_PINS_3);gpio_mode_QUICK(GPIOB, GPIO_MODE_OUTPUT, GPIO_PULL_NONE, GPIO_PINS_4);gpio_mode_QUICK(GPIOB, GPIO_MODE_OUTPUT, GPIO_PULL_NONE, GPIO_PINS_5);gpio_mode_QUICK(GPIOB, GPIO_MODE_OUTPUT, GPIO_PULL_NONE, GPIO_PINS_7);gpio_mode_QUICK(GPIOB, GPIO_MODE_OUTPUT, GPIO_PULL_NONE, GPIO_PINS_8);//PA11作為比較器輸出 gpio_init_type gpio_init_struct;crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);gpio_init_struct.gpio_pins = GPIO_PINS_11;gpio_init_struct.gpio_mode = GPIO_MODE_MUX;gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;gpio_init_struct.gpio_pull = GPIO_PULL_NONE; gpio_init(GPIOA, &gpio_init_struct);gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE11, GPIO_MUX_7);
}
3、ESC上電油門信號檢測
先來一個部分發大圖
(1)MCU啟動
(2)發啟動音
然后開啟接收油門信號
(3)油門在位檢測
detectInput->checkServo
transfercomplete -> inputSet == 1 -> !armed
這個時候油門信號是1001us,是小于啟動點的
(4)油門信號置低解鎖
油門置低1秒解鎖
(5)解鎖后發音
發兩種頻率的聲音
4、啟動
(1)油門大于啟動點
(2)old_routine=1階段
每隔50us執行tenKhzRoutine->getBemfState讀取反電動勢
(3)找到過零點則換相
(4)轉速達到預期,切無感驅動
5、無感驅動
(1)interruptRoutine
(2)檢測到過零點
這里會設置換相等待時間waitTime,然后使能定時器
(3)PeriodElapsedCallback定時器回調
換相,計算換相等待時間,使能比較器中斷
(4)下一次interruptRoutine
6、油門減小轉速低了
old_routine ?= 1;//油門低于這個轉速,使用同步驅動的方式
7、轉速低了油門小于啟動點停轉