最近硬件四轴很火,了解了很久,还是选择了正点原子的 MiniFly,主要还是原子的论坛资料多,后边可以有人讨论,不像很多就是建了个群,研究问题还是在论坛方便很多。
四轴终于拿到手,功能很强大,主要是还支持二次开发,可以研究下玩玩小四轴了
还是先从硬件入手分析下
1. 系统框架
主体可以分成两个小系统,后续可以按照这个顺序分析代码
1. 通信部分 — 基于 M0 和 NFR51822,包括电源管理
2. 控制部分 — 基于 M4 和外围传感器
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_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(); // 开启电源}