OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4692|回复: 1

stm32f1想通过mpu6050控制灯带顺时针或逆时针流水一次就停止。

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2023-4-4
在线时间
5 小时
发表于 2023-4-14 14:55:13 | 显示全部楼层 |阅读模式
stm32f1想通过mpu6050控制灯带顺时针或逆时针流水一次就停止。直到标志位MPU6050_GetFlag()变化才再流水。不知道怎么设置程序。目前处于一直流水,标志位MPU6050_GetFlag()变化会更新方向,但是还是一直流水。
  1. #include "stm32f10x.h"                  // Device header
  2. #include "OLED.h"
  3. #include "MPU6050.h"
  4. #include "DMP.h"
  5. #include "Delay.h"
  6. #include "LED.h"
  7. #include "Key.h"
  8. #include "RCC.h"
  9. #include "IO.h"
  10. #include "TIM3.h"
  11. #include "WS2812B.h"
  12. #include "OLED.h"
  13. #include <stdlib.h>
  14. #include "MPU6050_INT.h"

  15. #define Brightness 0x010101

  16. //关于MPU6050
  17. uint8_t ID, INT;
  18. int16_t AX, AY, AZ, GX, GY, GZ;
  19. float pitch, roll, yaw;
  20. uint8_t KeyNum, Count=0;
  21. uint8_t Lock=0, Flow, FlowCount;


  22. //关于WS2812B
  23. uint8_t MODE=1;
  24. uint8_t UpdateFlag=1;
  25. uint8_t Light_Mode, Light_Flag, AngleFlag=0;
  26. uint16_t Light_Time;

  27. #define WS2812B_LED_QUANTITY        29  //灯珠数量-1

  28. //后置函数的提前定义
  29. void Close(void);
  30. void WhiteLight(void);
  31. void WhiteLight_Up(void);
  32. void WhiteLight_Down(void);
  33. void MainLoop(void);

  34. void Init(void)
  35. {
  36.         RCC_Init();
  37.         Key_Init();
  38.         WS2812B_Init();
  39.         TIM3_SetIRQHandler(MainLoop);
  40.         TIM3_Init();
  41.         LED_Init();
  42.         OLED_Init();
  43.         MPU6050_Init();
  44. }

  45. int main(void)
  46. {
  47.         Init();
  48.         while(1)
  49.         {
  50.                 get_angles((float)AX, (float)AY, (float)AZ, (float)GX, (float)GY, (float)GZ, &pitch, &roll, &yaw);
  51.                
  52.                 KeyNum=Key_GetNum();
  53.                 if(KeyNum==0)
  54.                 {
  55.                         Lock=!Lock;
  56.                         if(Lock==1)
  57.                         {
  58.                                 Light_Flag=1;
  59.                                 Close();
  60.                         }
  61.                         else
  62.                         {
  63.                                 Light_Flag=0;
  64.                         }               
  65.                 }
  66.                 if(Lock==0)
  67.                 {
  68. //                        if(MPU6050_GetFlag()==1 && UpdateFlag==1)
  69. //                        {
  70.                         if(MPU6050_GetFlag()==1)
  71.                         {
  72.                                 if(MPU6050_GetFlag()==1)
  73.                                 {
  74.                                         UpdateFlag=0;
  75.                                 }
  76.                                 if(MPU6050_GetFlag()==2)
  77.                                 {
  78.                                         UpdateFlag=1;
  79.                                 }
  80.                                 MODE=2;
  81.                         }
  82. //                        if(MPU6050_GetFlag()==2 && UpdateFlag==1)
  83. //                        {
  84.                         if(MPU6050_GetFlag()==2)
  85.                         {
  86.                                 if(MPU6050_GetFlag()==2)
  87.                                 {
  88.                                         UpdateFlag=0;
  89.                                 }
  90.                                 if(MPU6050_GetFlag()==1)
  91.                                 {
  92.                                         UpdateFlag=1;
  93.                                 }
  94.                                 MODE=3;
  95.                         }
  96.                 }
  97.                 else
  98.                 {
  99.                         OLED_ShowString(2,11,"LOCK  ");
  100.                 }
  101.                 switch(MODE)
  102.                 {
  103.                         case 1:Close();break;
  104.                         case 2:WhiteLight_Up();break;
  105.                         case 3:WhiteLight_Down();break;
  106.                 }
  107.         }
  108. }

  109. void Close(void)        //MODE=1
  110. {

  111.         WS2812B_SetBuf(0x000000);
  112.         WS2812B_UpdateBuf();

  113. }

  114. void WhiteLight_Up(void)        //MODE=2
  115. {
  116.         if(Light_Flag==0)
  117.         {
  118. //                if(UpdateFlag==1)
  119. //                {
  120.                         uint8_t i;
  121.                         static uint8_t j;
  122.                         Light_Time=10;
  123.                         for(i=0;i<WS2812B_LED_QUANTITY;i++)
  124.                         {
  125.                                 WS2812B_Buf[i]=WS2812B_Buf[i+1];
  126.                         }
  127.                         if(j<5)
  128.                         {
  129.                                 WS2812B_Buf[WS2812B_LED_QUANTITY]=Brightness;
  130.                         }
  131.                         else
  132.                         {
  133.                                 WS2812B_Buf[WS2812B_LED_QUANTITY]=0;
  134.                         }
  135.                        
  136.                         j++;
  137.                         j%=40;
  138.                         WS2812B_UpdateBuf();
  139. //                }
  140.         }
  141. }

  142. void WhiteLight_Down(void)        //MODE=3
  143. {
  144.         if(Light_Flag==0)
  145.         {
  146. //                if(UpdateFlag==1)
  147. //                {
  148.                         uint8_t i;
  149.                         static uint8_t j;
  150.                         Light_Time=10;
  151.                         for(i=WS2812B_LED_QUANTITY;i>0;i--)
  152.                         {
  153.                                 WS2812B_Buf[i]=WS2812B_Buf[i-1];
  154.                         }
  155.                         if(j<5)
  156.                         {
  157.                                 WS2812B_Buf[0]=Brightness;
  158.                         }
  159.                         else
  160.                         {
  161.                                 WS2812B_Buf[0]=0;
  162.                         }

  163.                         j++;
  164.                         j%=40;
  165.                         WS2812B_UpdateBuf();
  166. //                }
  167.         }
  168. }

  169. void MainLoop(void)
  170. {
  171.         static uint16_t LoopCount;
  172.         LoopCount++;
  173.         if(LoopCount>=Light_Time)
  174.         {
  175.                 LoopCount=0;
  176.         }
  177. }
复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2021-11-18
在线时间
14 小时
发表于 2023-4-15 14:08:09 | 显示全部楼层
Close()函数是停止函数吗?如果是的话,从给出的代码来看,MODE除了初始化,赋值为2或3后就没有任何一种情况赋值为1,所以
case 1:Close();break;
此判断不会执行,
只有下面的判断才有可能进入Close()
if(KeyNum==0)
                {
                        Lock=!Lock;
                        if(Lock==1)
                        {
                                Light_Flag=1;
                                Close();
                        }
可以调试查看下KeyNum值的变化情况
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 10:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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