发 帖  
原厂入驻New

[经验] MiniFly四轴学习备忘之---四轴部分系统及电源分析

2019-8-28 15:04:00  778 四轴飞行器 开关电源 STM32
分享
0
  最近硬件四轴很火,了解了很久,还是选择了***的MinIFly,主要还是资料多,后边可以有人讨论,建了个群830802928,研究问题相对来说方便一些。
  兴奋!!四轴终于拿到手,功能很强大,主要是还支持二次开发,可以研究下玩玩小四轴了
  还是先从硬件入手分析下
  1.系统框架
  主体可以分成两个小系统,后续可以按照这个顺序分析代码
  1.通信部分---基于M0和NFR51822,包括电源管理
  2.控制部分---基于M4和外围传感器
   四轴1.webp.jpg

  2.比较关注的电源部分
  电源还是比较考究,直接包含了充电功能,不用每次使用外置的充电模块(之前自制过一个充电模块,看来以后可以集成到电路里了)
  按键断电功能这个比较喜欢:这个是NFR51822控制VEN_D引脚来实现断电的
  上个NFR51822部分电路

四轴2.webp.jpg
  开始看代码,大致看了下程序,先是监测按键状态
  /*按键扫描处理*/

  1. <p style="font-size: 18px;">  void buttonProcess()</p>
  2. <p style="font-size: 18px;">  {</p>
  3. <p style="font-size: 18px;">  static unsigned int lastTick;</p>
  4. <p style="font-size: 18px;">  static unsigned int pressedTick;</p>
  5. <p style="font-size: 18px;">  static bool pressed = false;</p>
  6. <p style="font-size: 18px;">  if (lastTick != systickGetTick())</p>
  7. <p style="font-size: 18px;">  {</p>
  8. <p style="font-size: 18px;">  lastTick = systickGetTick();</p>
  9. <p style="font-size: 18px;">  if(pressed==false && BUTTON_READ()==BUTTON_PRESSED)</p>
  10. <p style="font-size: 18px;">  {</p>
  11. <p style="font-size: 18px;">  pressed = true;</p>
  12. <p style="font-size: 18px;">  pressedTick = systickGetTick();</p>
  13. <p style="font-size: 18px;">  }</p>
  14. <p style="font-size: 18px;">  else if(pressed==true)</p>
  15. <p style="font-size: 18px;">  {</p>
  16. <p style="font-size: 18px;">  if(BUTTON_READ()==BUTTON_RELEASED)</p>
  17. <p style="font-size: 18px;">  pressed = false;</p>
  18. <p style="font-size: 18px;">  if ((systickGetTick()-pressedTick) > BUTTON_LONGPRESS_TICK)</p>
  19. <p style="font-size: 18px;">  state = buttonLongPress;</p>
  20. <p style="font-size: 18px;">  else if(BUTTON_READ()==BUTTON_RELEASED)</p>
  21. <p style="font-size: 18px;">  state = buttonShortPress;</p>
  22. <p style="font-size: 18px;">  }</p>
  23. <p style="font-size: 18px;">  }</p>
  24. <p style="font-size: 18px;">  }</p>
  25. <p style="font-size: 18px;">  /*获取按键状态*/</p>
  26. <p style="font-size: 18px;">  buttonEvent_e buttonGetState()</p>
  27. <p style="font-size: 18px;">  {</p>
  28. <p style="font-size: 18px;">  buttonEvent_e currentState = state;</p>
  29. <p style="font-size: 18px;">  state = buttonIdle;</p>
  30. <p style="font-size: 18px;">  return currentState;</p>
  31. <p style="font-size: 18px;">  }</p>
复制代码

  然后就是在主函数中进行相应的操作,先不说了
  看下怎么实现电源开关的:这么最后应该F1部分还是有电的,只是消耗较少,寻求一种可以完全断电的方案??
  /*开启电源*/

  1. <p style="font-size: 18px;">  void pmPowerOn(void)</p>
  2. <p style="font-size: 18px;">  {</p>
  3. <p style="font-size: 18px;">  nRF_gpio_cfg_output(UART_TX_PIN); //使能串口TX</p>
  4. <p style="font-size: 18px;">  nrf_gpio_pin_set(UART_TX_PIN);</p>
  5. <p style="font-size: 18px;">  nrf_gpio_cfg_output(RADIO_PAEN_PIN);// 开启无线功能</p>
  6. <p style="font-size: 18px;">  nrf_gpio_pin_set(RADIO_PAEN_PIN);</p>
  7. <p style="font-size: 18px;">  nrf_gpio_cfg_output(PM_VBAT_SINK_PIN);// 设置ADC</p>
  8. <p style="font-size: 18px;">  nrf_gpio_pin_clear(PM_VBAT_SINK_PIN);</p>
  9. <p style="font-size: 18px;">  pmstartAdc(); //开启ADC转换</p>
  10. <p style="font-size: 18px;">  }</p>
  11. <p style="font-size: 18px;">  /*关闭电源*/</p>
  12. <p style="font-size: 18px;">  void pmPowerOff(void)</p>
  13. <p style="font-size: 18px;">  {</p>
  14. <p style="font-size: 18px;">  nrf_gpio_cfg_input(UART_TX_PIN, NRF_GPIO_PIN_PULLDOWN);</p>
  15. <p style="font-size: 18px;">  uartDeinit();</p>
  16. <p style="font-size: 18px;">  nrf_gpio_cfg_input(STM_NRST_PIN, NRF_GPIO_PIN_PULLDOWN);</p>
  17. <p style="font-size: 18px;">  nrf_gpio_pin_clear(STM_NRST_PIN);</p>
  18. <p style="font-size: 18px;">  nrf_gpio_pin_clear(PM_VCCEN_PIN); //关闭 LDO使能控制脚</p>
  19. <p style="font-size: 18px;">  LED_OFF();</p>
  20. <p style="font-size: 18px;">  nrf_gpio_pin_clear(RADIO_PAEN_PIN); //关闭PA</p>
  21. <p style="font-size: 18px;">  nrf_gpio_cfg_input(PM_VBAT_SINK_PIN, NRF_GPIO_PIN_NOPULL);</p>
  22. <p style="font-size: 18px;">  NRF_POWER->SYSTEMOFF = 1UL;</p>
  23. <p style="font-size: 18px;">  while(1); //进入死循环</p>
  24. <p style="font-size: 18px;">  }</p>
  25. <p style="font-size: 18px;">  void pmInit()</p>
  26. <p style="font-size: 18px;">  {</p>
  27. <p style="font-size: 18px;">  /* STM32 电源配置 */</p>
  28. <p style="font-size: 18px;">  nrf_gpio_cfg_output(PM_VCCEN_PIN);</p>
  29. <p style="font-size: 18px;">  nrf_gpio_pin_set(PM_VCCEN_PIN); //使能stm32电源</p>
  30. <p style="font-size: 18px;">  msDelay(100);</p>
  31. <p style="font-size: 18px;">  /* STM32 复位 */</p>
  32. <p style="font-size: 18px;">  nrf_gpio_cfg_output(STM_NRST_PIN);</p>
  33. <p style="font-size: 18px;">  nrf_gpio_pin_clear(STM_NRST_PIN);</p>
  34. <p style="font-size: 18px;">  msDelay(100);</p>
  35. <p style="font-size: 18px;">  nrf_gpio_pin_set(STM_NRST_PIN);</p>
  36. <p style="font-size: 18px;">  msDelay(100);</p>
  37. <p style="font-size: 18px;">  nrf_gpio_cfg_input(USB_CONNECTED_PIN, NRF_GPIO_PIN_NOPULL);</p>
  38. <p style="font-size: 18px;">  nrf_gpio_cfg_input(PM_CHG_STATE_PIN, NRF_GPIO_PIN_PULLUP);</p>
  39. <p style="font-size: 18px;">  pmPowerOn(); //开启电源</p>
  40. <p style="font-size: 18px;">  }</p>
复制代码


王栋春 2019-8-28 22:33:59
学习借鉴一下
回复

举报

z16051032 2020-1-30 15:22:19
不错,谢谢楼主分享。
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表