最近硬體四軸很火,了解了很久,還是選擇了MiniFly,主要還是資料多,後邊可以有人讨論,不像很多就是建了個群,研究問題還是在論壇友善很多。
四軸終于拿到手,功能很強大,主要是還支援二次開發,可以研究下玩玩小四軸了
還是先從硬體入手分析下
1.系統架構
主體可以分成兩個小系統,後續可以按照這個順序分析代碼
1.通信部分---基于M0和NFR51822,包括電源管理
2.控制部分---基于M4和外圍傳感器

image.png
2.比較關注的電源部分
電源還是比較考究,直接包含了充電功能,不用每次使用外置的充電子產品(之前自制過一個充電子產品,看來以後可以內建到電路裡了)
按鍵斷電功能這個比較喜歡:這個是NFR51822控制VEN_D引腳來實作斷電的
上個NFR51822部分電路
開始看代碼,大緻看了下程式,先是監測按鍵狀态
/*按鍵掃描處理*/
void buttonProcess()
{
static unsigned int lastTick;
static unsigned int pressedTick;
static bool pressed = false;
if (lastTick != systickGetTick())
lastTick = systickGetTick();
if(pressed==false && BUTTON_READ()==BUTTON_PRESSED)
pressed = true;
pressedTick = systickGetTick();
}
else if(pressed==true)
if(BUTTON_READ()==BUTTON_RELEASED)
pressed = false;
if ((systickGetTick()-pressedTick) > BUTTON_LONGPRESS_TICK)
state = buttonLongPress;
else if(BUTTON_READ()==BUTTON_RELEASED)
state = buttonShortPress;
/*擷取按鍵狀态*/
buttonEvent_e buttonGetState()
buttonEvent_e currentState = state;
state = buttonIdle;
return currentState;
然後就是在主函數中進行相應的操作,先不說了
看下怎麼實作電源開關的:這麼最後應該F1部分還是有電的,隻是消耗較少,尋求一種可以完全斷電的方案??
/*開啟電源*/
void pmPowerOn(void)
nrf_gpio_cfg_output(UART_TX_PIN); //使能序列槽TX
nrf_gpio_pin_set(UART_TX_PIN);
nrf_gpio_cfg_output(RADIO_PAEN_PIN);// 開啟無線功能
nrf_gpio_pin_set(RADIO_PAEN_PIN);
nrf_gpio_cfg_output(PM_VBAT_SINK_PIN);// 設定ADC
nrf_gpio_pin_clear(PM_VBAT_SINK_PIN);
pmStartAdc(); //開啟ADC轉換
/*關閉電源*/
void pmPowerOff(void)
nrf_gpio_cfg_input(UART_TX_PIN, NRF_GPIO_PIN_PULLDOWN);
uartDeinit();
nrf_gpio_cfg_input(STM_NRST_PIN, NRF_GPIO_PIN_PULLDOWN);
nrf_gpio_pin_clear(STM_NRST_PIN);
nrf_gpio_pin_clear(PM_VCCEN_PIN); //關閉 LDO使能控制腳
LED_OFF();
nrf_gpio_pin_clear(RADIO_PAEN_PIN); //關閉PA
nrf_gpio_cfg_input(PM_VBAT_SINK_PIN, NRF_GPIO_PIN_NOPULL);
NRF_POWER->SYSTEMOFF = 1UL;
while(1); //進入死循環
void pmInit()
/* STM32 電源配置 */
nrf_gpio_cfg_output(PM_VCCEN_PIN);
nrf_gpio_pin_set(PM_VCCEN_PIN); //使能stm32電源
msDelay(100);
/* STM32 複位 */
nrf_gpio_cfg_output(STM_NRST_PIN);
nrf_gpio_pin_set(STM_NRST_PIN);
nrf_gpio_cfg_input(USB_CONNECTED_PIN, NRF_GPIO_PIN_NOPULL);
nrf_gpio_cfg_input(PM_CHG_STATE_PIN, NRF_GPIO_PIN_PULLUP);
pmPowerOn(); //開啟電源
最後也是給大家分享一些四軸和stm32方面的資料友善後期的學習參考
四軸飛行器開發:makeru.com.cn/course/details/2986?s=45051