色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 四旋翼飛行器的飛控實現(xiàn)

          四旋翼飛行器的飛控實現(xiàn)

          作者: 時間:2017-01-06 來源:網(wǎng)絡(luò) 收藏

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

          本文引用地址:http://cafeforensic.com/article/201701/342563.htm

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

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

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

             

           

            比較重要的地方:

            1.i2c通信方式;

            因為我不是學(xué)電類專業(yè),最開始對i2c這些是沒有一點概念,最后通過Google了解了一些原理,然后發(fā)現(xiàn)的開發(fā)庫是帶有i2c通信的相關(guān)函數(shù)的,但是我最后還是沒有用這些函數(shù)。

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

            庫實現(xiàn)的模擬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 下一頁

          關(guān)鍵詞: STM32 飛行器

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉