版权声明:本文为博主原创文章,转载请备注转载地址!!!。 https://blog.csdn.net/super828/article/details/84350531
版权声明:本文为博主原创文章,转载请备注转载地址!!!。 https://blog.csdn.net/super828/article/details/80037571
最近硬件四轴很火,了解了很久,还是选择了正点原子的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
();
//开启电源
}
版权声明:本文为博主原创文章,转载请备注转载地址!!!。 https://blog.csdn.net/super828/article/details/80037571
最近硬件四轴很火,了解了很久,还是选择了正点原子的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
();
//开启电源
}