新聞中心

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

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

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

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

本文引用地址:http://m.butianyuan.cn/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)閉