新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 四旋翼飛行器的飛控實現

        四旋翼飛行器的飛控實現

        作者: 時間:2017-01-06 來源:網絡 收藏

          嘗試制作這個四旋翼飛控的過程,感觸頗多,整理了思緒之后,把重要的點一一記下來;

        本文引用地址:http://www.104case.com/article/201701/342563.htm

          這個飛控是基于,整合了MPU6050,即陀螺儀和重力加速計,但沒有融合電子羅盤;

          另外,四旋翼的運動方式請百度百科,不太復雜,具體不再贅述;

          這是飛控程序的控制流程(一個執行周期):

           

         

          比較重要的地方:

          1.i2c通信方式;

          因為我不是學電類專業,最開始對i2c這些是沒有一點概念,最后通過Google了解了一些原理,然后發現的開發庫是帶有i2c通信的相關函數的,但是我最后還是沒有用這些函數。

          我通過GPIO模擬i2c,這樣也能獲得mpu6050的數據,雖然代碼多了一些,但是比較好的理解i2c的原理。

          庫實現的模擬i2c代碼(注釋好像因為編碼問題跪了):

          /*******************************************************************************

          // file : i2c_conf.h

          // MCU : STM32F103VET6

          // IDE : Keil uVision4

          // date £o2014.2.28

          *******************************************************************************/

          #include "stm32f10x.h"

          #define uchar unsigned char

          #define uint unsigned int

          #define FALSE 0

          #define TRUE 1

          void I2C_GPIO_Config(void);

          void I2C_delay(void);

          void delay5ms(void);

          int I2C_Start(void);

          void I2C_Stop(void);

          void I2C_Ack(void);

          void I2C_NoAck(void);

          int I2C_WaitAck(void);

          void I2C_SendByte(u8 SendByte);

          unsigned char I2C_RadeByte(void);

          int Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data);

          unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address);

          /*******************************************************************************

          // file : i2c_conf.c

          // MCU : STM32F103VET6

          // IDE : Keil uVision4

          // date £o2014.2.28

          *******************************************************************************/

          #include "i2c_conf.h"

          #define SCL_H GPIOB->BSRR = GPIO_Pin_6

          #define SCL_L GPIOB->BRR = GPIO_Pin_6

          #define SDA_H GPIOB->BSRR = GPIO_Pin_7

          #define SDA_L GPIOB->BRR = GPIO_Pin_7

          #define SCL_read GPIOB->IDR & GPIO_Pin_6 //IDR:???úê?è???′??÷?£

          #define SDA_read GPIOB->IDR & GPIO_Pin_7

          void I2C_GPIO_Config(void)

          {

          GPIO_InitTypeDef GPIO_InitStructure;

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //?a??ê?3??£ê?

          GPIO_Init(GPIOB, &GPIO_InitStructure);

          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;

          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

          GPIO_Init(GPIOB, &GPIO_InitStructure);

          }

          void I2C_delay(void)

          {

          int i=6; //?aà??éò?ó??ˉ?ù?è £??­2aê?×?μíμ?5?1?üD′è?

          while(i)

          {

          i--;

          }

          }

          void delay5ms(void)

          {

          int i=5000;

          while(i)

          {

          i--;

          }

          }

          int I2C_Start(void)

          {

          SDA_H; //II2D­òé1??¨±?D??úê±?ó???aμíμ???μ??°ìá??£?2??éò?è? êy?Y??D?o???±?

          SCL_H;

          I2C_delay();

          if(!SDA_read)

          return FALSE; //SDA???aμíμ????ò×ü???|,í?3?

          SDA_L;

          I2C_delay();

          if(SDA_read)

          return FALSE; //SDA???a??μ????ò×ü??3?′í,í?3?

          SDA_L;

          I2C_delay();

          return TRUE;

          }

          void I2C_Stop(void)

          {

          SCL_L;

          I2C_delay();

          SDA_L;

          I2C_delay();

          SCL_H;

          I2C_delay();

          SDA_H;

          I2C_delay();

          }

          void I2C_Ack(void)

          {

          SCL_L;

          I2C_delay();

          SDA_L;

          I2C_delay();

          SCL_H;

          I2C_delay();

          SCL_L;

          I2C_delay();

          }

          void I2C_NoAck(void)

          {

          SCL_L;

          I2C_delay();

          SDA_H;

          I2C_delay();

          SCL_H;

          I2C_delay();

          SCL_L;

          I2C_delay();

          }

          int I2C_WaitAck(void) //·μ???a:=1óDACK, =0?TACK

          {

          SCL_L;

          I2C_delay();

          SDA_H;

          I2C_delay();

          SCL_H;

          I2C_delay();

          if(SDA_read)

          {

          SCL_L;

          I2C_delay();

          return FALSE;

          }

          SCL_L;

          I2C_delay();

          return TRUE;

          }

          void I2C_SendByte(u8 SendByte) //êy?Y′ó????μ?μí??//

          {

          u8 i=8;

          while(i--)

          {

          SCL_L;

          I2C_delay();

          if(SendByte&0x80) // 0x80 = 1000 0000;

          SDA_H;

          else

          SDA_L;

          SendByte<<=1; // SendByte×óò?ò????£

          I2C_delay();

          SCL_H;

          I2C_delay();

          }

          SCL_L;

          }

          unsigned char I2C_RadeByte(void) //êy?Y′ó????μ?μí??//

          {

          u8 i=8;

          u8 ReceiveByte=0;

          SDA_H;

          while(i--)

          {

          ReceiveByte<<=1; //×óò?ò???£?

          SCL_L;

          I2C_delay();

          SCL_H;

          I2C_delay();

          if(SDA_read)

          {

          ReceiveByte"=0x01; //D′è?

          }

          }

          SCL_L;

          return ReceiveByte;

          }

          int Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data)

          {

          if(!I2C_Start())

          return FALSE;

          I2C_SendByte(SlaveAddress); //·¢?íéè±?μ??·+D′D?o? //I2C_SendByte(((REG_Address & 0x0700) >>7) | SlaveAddress & 0xFFFE); //éè?????eê?μ??·+?÷?tμ??·

          if(!I2C_WaitAck())

          {

          I2C_Stop();

          return FALSE;

          }

          I2C_SendByte(REG_Address ); //éè??μí?eê?μ??·

          I2C_WaitAck();

          I2C_SendByte(REG_data);

          I2C_WaitAck();

          I2C_Stop();

          delay5ms();

          return TRUE;

          }

          unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address)

          {

          unsigned char REG_data;

          if(!I2C_Start())

          return FALSE;

          I2C_SendByte(SlaveAddress); //I2C_SendByte(((REG_Address & 0x0700) >>7) | REG_Address & 0xFFFE);//éè?????eê?μ??·+?÷?tμ??·

          if(!I2C_WaitAck())

          {

          I2C_Stop();

          return FALSE;

          }


        上一頁 1 2 下一頁

        關鍵詞: STM32 飛行器

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 称多县| 茂名市| 昔阳县| 仁化县| 巢湖市| 澳门| 昌图县| 太原市| 德阳市| 青海省| 泗阳县| 赫章县| 西和县| 云阳县| 钟山县| 平度市| 通城县| 朝阳市| 龙陵县| 大邑县| 阜宁县| 襄垣县| 邻水| 义乌市| 镇安县| 仙游县| 五峰| 新乡县| 库车县| 将乐县| 平南县| 轮台县| 友谊县| 百色市| 敖汉旗| 阿尔山市| 商丘市| 建水县| 乐山市| 桐梓县| 泾源县|