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(); //开启电源
}
相关文章
相关标签/搜索