MiniFly四轴学习系列1---四轴部分系统及电源分析



最近硬件四轴很火,了解了很久,还是选择了正点原子的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.51cto.com/12483417/2417640

时间: 2024-10-07 07:56:41

MiniFly四轴学习系列1---四轴部分系统及电源分析的相关文章

Android学习系列(39)--Android主题和样式之系统篇(上)

Android学习系列(39)--Android主题和样式之系统篇(上) [基于最新的Android4.4的源码分析] 每家公司或者每个移动团队无不想开发出一套自己的UI框架,融入自己的设计和特性,这必然会去修改android的ui.所以,学习和理解android的UI设计是最基础和非常有必要的.android ui设计最重要的就是主题和样式. 1.位置在Android的frameworks/base/core/res/res/values目录下有一下几个文件: 1 2 3 4 themes.x

Linux运维系统工程师与java基础学习系列-8

Java天生骄傲系列-8 函数的应用(重点掌握) 如何定义函数 例1: package test.myeclipse;                 publicclass test1 { publicstaticvoid main(String[]args) { int Sum = getSum(); System.out.println("Sum="+Sum); } publicstaticint getSum() { return 3+4; } } 运行结果:Sum=7 例2:

Linux运维系统工程师与java基础学习系列-4

Java天生骄傲系列-4 程序流程控制 判断 选择 循环 判断结构: If语句三种格式: 1.  if(条件表达式) { 执行语句: } 2.  if(条件表达式) { 执行语句: } else { 执行语句: } 3.  if(条件表达式) { 执行语句: } else if (条件表达式) { 执行语句: } --. else { 执行语句: } if(条件表达式) { 执行语句: } 牛刀小试: package test.myeclipse; publicclass test1 { pub

Linux运维系统工程师与java基础学习系列-2

Java天生骄傲系列-2 运算符 1.   算术运算符 注: 1)"+"号除了用于加法运算以外,还用作字符串连接符: 2)字符串数据和任何数据使用+都是相连接,最终都会变成字符串. package day4javatest.myeclipse;         publicclass day4test1 { /** * @param args */ publicstaticvoid main(String[]args) { // TODO Auto-generated method s

Linux运维系统工程师与java基础学习系列-1

Java天生骄傲系列-1 1     Eclipse的使用(略): 2 在eclipse下Java程序的编写和运行,及Java运行环境的配置略: 3 快捷键的配置,常用快捷键(略): 注:当程序有错误的时候,我们才会采取debug的方式去运行程序! 4 程序的调试和运行:以断点的方式去查看程序出现的问题. 断点调试常用功能(快捷键): F5(跳入)      F6(跳过)      F7(跳出) drop to frame:跳到当前方法的第一行: resume:跳到下一个断点(如果没有下一个,则

Linux运维系统工程师与java基础学习系列-5

Java天生骄傲系列-5 程序流程控制(续): 选择结构 switch语句 格式: Switch(表达式) { case取值1: 执行语句: break; case取值2: 执行语句: break; -- default: 执行语句: break; } 牛刀小试1:         package test.myeclipse; publicclass test1 { publicstaticvoid main(String[] args) { int x=3; switch(x) { case

Linux运维系统工程师与java基础学习系列-6

Java天生骄傲系列-6 程序流程控制(续) 循环结构 代表语句:while, do while, for While语句格式: while(条件表达式) { 执行语句: } 牛刀小试: package test.myeclipse; publicclass test1 { publicstaticvoid main(String[] args) { int x=1; while (x<4) { System.out.println("x="+x); x++; } } } 运行结

Linux运维系统工程师与java基础学习系列-3

Java天生骄傲系列-3 运算符(续) 1.  逻辑运算符(续) 逻辑运算符用于连接boolean类型的表达式 1)与符号:& true&true=true; true&false=false; false&true=false; false&false=false; 2)或符号:| true| true = true; true| false = true; false|true = true; false| false = false 3)非符号:! 4)双与符

Java I/O系统学习系列二:输入和输出

编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象.“流”屏蔽了实际的I/O设备中处理数据的细节. 在这个系列的第一篇文章:<<Java I/O系统学习系列一:File和RandomAccessFile>>中,我们讲到RandomAccessFile可以写入和读取文件,具备I/O功能,但是其只能针对文件,而I/O还涉及到很多其他场景比如网络.读取内存中的字符串等,所以Java类库中提供了一系列的类库来对其进行支持,也就是