MiniFly四軸學習系列1---四軸部分系統及電源分析

timg (7).jpg


最近硬件四軸很火,瞭解了好久,仍是選擇了正點原子的MiniFly,主要仍是原子的論壇資料多,後邊能夠有人討論,不像不少就是建了個羣,研究問題仍是在論壇方便不少。框架

四軸終於拿到手,功能很強大,主要是還支持二次開發,能夠研究下玩玩小四軸了函數

仍是先從硬件入手分析下spa

1.系統框架
主體能夠分紅兩個小系統,後續能夠按照這個順序分析代碼
1.通訊部分---基於M0和NFR51822,包括電源管理
2.控制部分---基於M4和外圍傳感器code

image.png

2.比較關注的電源部分
電源仍是比較考究,直接包含了充電功能,不用每次使用外置的充電模塊(以前自制過一個充電模塊,看來之後能夠集成到電路里了)blog

按鍵斷電功能這個比較喜歡:這個是NFR51822控制VEN_D引腳來實現斷電的ip

上個NFR51822部分電路
image.png開發

開始看代碼,大體看了下程序,先是監測按鍵狀態input

/*按鍵掃描處理*/
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;
}

而後就是在主函數中進行相應的操做,先不說了it

看下怎麼實現電源開關的:這麼最後應該F1部分仍是有電的,只是消耗較少,尋求一種能夠徹底斷電的方案??io

/*開啓電源*/
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_clear(STM_NRST_PIN);
    msDelay(100);   
    nrf_gpio_pin_set(STM_NRST_PIN);
    msDelay(100);   
    nrf_gpio_cfg_input(USB_CONNECTED_PIN, NRF_GPIO_PIN_NOPULL);
    nrf_gpio_cfg_input(PM_CHG_STATE_PIN, NRF_GPIO_PIN_PULLUP);
    
    pmPowerOn(); //開啓電源
}
相關文章
相關標籤/搜索