找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 14652|回复: 51
打印 上一主题 下一主题
收起左侧

IAP15W4K58S4-小四轴飞行器 原理图和程序等制作资料分享

  [复制链接]
回帖奖励 2 黑币 回复本帖可获得 1 黑币奖励! 每人限 1 次(中奖概率 40%)
跳转到指定楼层
楼主
STC四轴接收原理图.pdf (85.19 KB, 下载次数: 163)

STC四轴遥控原理图.pdf (84.27 KB, 下载次数: 85)










四轴接收程序2.1.rar

263.39 KB, 下载次数: 159, 下载积分: 黑币 -5

四轴遥控器程序 2.1.rar

53.58 KB, 下载次数: 110, 下载积分: 黑币 -5

评分

参与人数 3黑币 +60 收起 理由
涡轮增压 + 5 很给力!
owl1521 + 5 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏12 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2016-7-12 16:10 | 只看该作者
楼主的部分代码:
  1. #include <STC15W4K60S4.H>
  2. #include <intrins.h>
  3. #include <NRF24L01.H>

  4. //*********************************************NRF24L01*************************************
  5. #define TX_ADR_WIDTH    5           // 5 uints TX address width
  6. #define RX_ADR_WIDTH    5           // 5 uints RX address width
  7. #define TX_PLOAD_WIDTH  20          // 20 uints TX payload
  8. #define RX_PLOAD_WIDTH  20          // 20 uints TX payload
  9. uint const TX_ADDRESS[TX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //本地地址
  10. uint const RX_ADDRESS[RX_ADR_WIDTH]= {0x34,0x43,0x10,0x10,0x01};        //接收地址
  11. //***************************************NRF24L01寄存器指令*******************************************************
  12. #define READ_REG        0x00          // 读寄存器指令
  13. #define WRITE_REG       0x20         // 写寄存器指令
  14. #define RD_RX_PLOAD     0x61          // 读取接收数据指令
  15. #define WR_TX_PLOAD     0xA0          // 写待发数据指令
  16. #define FLUSH_TX        0xE1         // 冲洗发送 FIFO指令
  17. #define FLUSH_RX        0xE2          // 冲洗接收 FIFO指令
  18. #define REUSE_TX_PL     0xE3          // 定义重复装载数据指令
  19. #define NOP             0xFF          // 保留
  20. //*************************************SPI(nRF24L01)寄存器地址****************************************************
  21. #define CONFIG2         0x00  // 配置收发状态,CRC校验模式以及收发状态响应方式
  22. #define EN_AA           0x01  // 自动应答功能设置
  23. #define EN_RXADDR       0x02  // 可用信道设置
  24. #define SETUP_AW        0x03  // 收发地址宽度设置
  25. #define SETUP_RETR      0x04  // 自动重发功能设置
  26. #define RF_CH           0x05  // 工作频率设置
  27. #define RF_SETUP        0x06  // 发射速率、功耗功能设置
  28. #define STATUS          0x07  // 状态寄存器
  29. #define OBSERVE_TX      0x08  // 发送监测功能
  30. #define CD              0x09  // 地址检测           
  31. #define RX_ADDR_P0      0x0A  // 频道0接收数据地址
  32. #define RX_ADDR_P1      0x0B  // 频道1接收数据地址
  33. #define RX_ADDR_P2      0x0C  // 频道2接收数据地址
  34. #define RX_ADDR_P3      0x0D  // 频道3接收数据地址
  35. #define RX_ADDR_P4      0x0E  // 频道4接收数据地址
  36. #define RX_ADDR_P5      0x0F  // 频道5接收数据地址
  37. #define TX_ADDR         0x10  // 发送地址寄存器
  38. #define RX_PW_P0        0x11  // 接收频道0接收数据长度
  39. #define RX_PW_P1        0x12  // 接收频道0接收数据长度
  40. #define RX_PW_P2        0x13  // 接收频道0接收数据长度
  41. #define RX_PW_P3        0x14  // 接收频道0接收数据长度
  42. #define RX_PW_P4        0x15  // 接收频道0接收数据长度
  43. #define RX_PW_P5        0x16  // 接收频道0接收数据长度
  44. #define FIFO_STATUS     0x17  // FIFO栈入栈出状态寄存器设置
  45. //*****************************************长延时*****************************************
  46. void Delay(unsigned int s)
  47. {
  48.         volatile unsigned int i;
  49.         for(i=0; i<s; i++);
  50.         for(i=0; i<s; i++);
  51. }
  52. //******************************************************************************************
  53. uint         bdata sta;   //状态标志
  54. sbit        RX_DR        =sta^6;
  55. sbit        TX_DS        =sta^5;
  56. sbit        MAX_RT        =sta^4;
  57. sbit  TX_FULL =sta^0;
  58. /******************************************************************************************
  59. /*延时函数
  60. /******************************************************************************************/
  61. void inerDelay_us(unsigned char n)
  62. {
  63.         for(;n>0;n--);
  64. }
  65. //****************************************************************************************
  66. /*NRF24L01初始化
  67. //***************************************************************************************/
  68. void init_NRF24L01(void)
  69. {
  70.         CE=0;    // chip enable
  71.         CSN=1;   // Spi  disable
  72.         SCK=0;   //
  73.         SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);    // 写本地地址       
  74.         SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, RX_ADDRESS, RX_ADR_WIDTH); // 写接收端地址
  75.         SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);      //  频道0自动        ACK应答允许       
  76.         SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);  //  允许接收地址只有频道0,如果需要多频道可以参考Page21  
  77.         SPI_RW_Reg(WRITE_REG + RF_CH, 0x6e);        //   设置信道工作为2.4GHZ,收发必须一致
  78.         SPI_RW_Reg(WRITE_REG + RX_PW_P0, RX_PLOAD_WIDTH); //设置接收数据长度,本次设置为32字节
  79.         SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x27);                   //设置发射速率为1MB/S,发射功率为最大值+7dB,由于有X2401L功放,实际+21dbm输出
  80. }
  81. /****************************************************************************************************
  82. /*函数:uint SPI_RW(uint uchar)
  83. /*功能:NRF24L01的SPI写时序
  84. /****************************************************************************************************/
  85. uint SPI_RW(uint uchar)
  86. {
  87.         uint bit_ctr;
  88.            for(bit_ctr=0;bit_ctr<8;bit_ctr++) // output 8-bit
  89.            {
  90.                 MOSI = (uchar & 0x80);         // output 'uchar', MSB to MOSI
  91.                 uchar = (uchar << 1);           // shift next bit into MSB..
  92.                 SCK = 1;                      // Set SCK high..
  93.                 inerDelay_us(12);
  94.                 uchar |= MISO;                         // capture current MISO bit
  95.                 inerDelay_us(12);
  96.                 SCK = 0;                              // ..then set SCK low again
  97.            }
  98.     return(uchar);                             // return read uchar
  99. }
  100. /****************************************************************************************************
  101. /*函数:uchar SPI_Read(uchar reg)
  102. /*功能:NRF24L01的SPI时序
  103. /****************************************************************************************************/
  104. uchar SPI_Read(uchar reg)
  105. {
  106.         uchar reg_val;
  107.        
  108.         CSN = 0;                // CSN low, initialize SPI communication...
  109.         inerDelay_us(12);
  110.         SPI_RW(reg);            // Select register to read from..
  111.         inerDelay_us(12);
  112.         reg_val = SPI_RW(0);    // ..then read registervalue
  113.         inerDelay_us(12);
  114.         CSN = 1;                // CSN high, terminate SPI communication
  115.        
  116.         return(reg_val);        // return register value
  117. }
  118. /****************************************************************************************************/
  119. /*功能:NRF24L01读写寄存器函数
  120. /****************************************************************************************************/
  121. uint SPI_RW_Reg(uchar reg, uchar value)
  122. {
  123.         uint status;
  124.        
  125.         CSN = 0;                   // CSN low, init SPI transaction
  126.         status = SPI_RW(reg);      // select register
  127.         SPI_RW(value);             // ..and write value to it..
  128.         CSN = 1;                   // CSN high again
  129.        
  130.         return(status);            // return nRF24L01 status uchar
  131. }
  132. /****************************************************************************************************/
  133. /*函数:uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  134. /*功能: 用于读数据,reg:为寄存器地址,pBuf:为待读出数据地址,uchars:读出数据的个数
  135. /****************************************************************************************************/
  136. uint SPI_Read_Buf(uchar reg, uchar *pBuf, uchar uchars)
  137. {
  138.         uint status,uchar_ctr;
  139.        
  140.         CSN = 0;                                    // Set CSN low, init SPI tranaction
  141.         status = SPI_RW(reg);                       // Select register to write to and read status uchar
  142.        
  143.         for(uchar_ctr=0;uchar_ctr<uchars;uchar_ctr++)
  144.                 pBuf[uchar_ctr] = SPI_RW(0);    //
  145.        
  146.         CSN = 1;                           
  147.        
  148.         return(status);                    // return nRF24L01 status uchar
  149. }
  150. /*********************************************************************************************************
  151. /*函数:uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  152. /*功能: 用于写数据:为寄存器地址,pBuf:为待写入数据地址,uchars:写入数据的个数
  153. /*********************************************************************************************************/
  154. uint SPI_Write_Buf(uchar reg, uchar *pBuf, uchar uchars)
  155. {
  156.         uint status,uchar_ctr;
  157.        
  158.         CSN = 0;            //SPI使能      
  159.         status = SPI_RW(reg);   
  160.         for(uchar_ctr=0; uchar_ctr<uchars; uchar_ctr++) //
  161.         SPI_RW(*pBuf++);
  162.         CSN = 1;           //关闭SPI
  163.         return(status);    //
  164. }
  165. /****************************************************************************************************/
  166. /*函数:void SetRX_Mode(void)
  167. /*功能:数据接收配置
  168. /****************************************************************************************************/
  169. void SetRX_Mode(void)
  170. {
  171.         CE=0;
  172.         SPI_RW_Reg(WRITE_REG + CONFIG2, 0x0f);                   // IRQ收发完成中断响应,16位CRC        ,主接收
  173.         CE = 1;
  174. }
  175. /******************************************************************************************************/
  176. /*函数:unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  177. /*功能:数据读取后放如rx_buf接收缓冲区中
  178. /******************************************************************************************************/
  179. unsigned char nRF24L01_RxPacket(unsigned char* rx_buf)
  180. {
  181.   unsigned char revale=0;
  182.         sta=SPI_Read(STATUS);        // 读取状态寄存其来判断数据接收状况
  183.         if(RX_DR)                                // 判断是否接收到数据
  184.         {
  185.             CE = 0;                         //SPI使能
  186.                 SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);// read receive payload from RX_FIFO buffer
  187.                 revale =1;                        //读取数据完成标志
  188.         }
  189.         SPI_RW_Reg(WRITE_REG+STATUS,sta);   //接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志
  190.            CE=1;                                                                     //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  191.         return revale;
  192. }
  193. /***********************************************************************************************************
  194. /*函数:void nRF24L01_TxPacket(unsigned char * tx_buf)
  195. /*功能:发送 tx_buf中数据
  196. /**********************************************************************************************************/
  197. void nRF24L01_TxPacket(unsigned char * tx_buf)
  198. {
  199.         SPI_RW_Reg(WRITE_REG+STATUS,0xff);
  200.         SPI_RW_Reg(0xE1,0xff);
  201.         CE=0;               
  202.         SPI_Write_Buf(WR_TX_PLOAD, tx_buf, TX_PLOAD_WIDTH);                              
  203.         SPI_RW_Reg(WRITE_REG + CONFIG2, 0x0e);                  
  204.         CE=1;                 
  205.         inerDelay_us(10);   //CE高电平大于10us才能进入发射模式
  206. }
复制代码

  1. #include <STC15W4K60S4.H>
  2. #include <EEPROM.h>
  3. #include <intrins.h>
  4. #include <NRF24L01.H>
  5. #include <MPU6050.H>
  6. #define CMD_IDLE    0            
  7. #define CMD_READ    1              
  8. #define CMD_PROGRAM 2               
  9. #define CMD_ERASE   3              

  10. #define ENABLE_IAP 0x80           //if SYSCLK<30MHz
  11. extern int g_x,g_y,g_z;            //陀螺仪矫正参数
  12. extern char a_x,a_y;               //角度矫正参数
  13. extern double Angle,Angley;
  14. void IapIdle()
  15. {
  16.     IAP_CONTR = 0;                 
  17.     IAP_CMD = 0;                    
  18.     IAP_TRIG = 0;                  
  19.     IAP_ADDRH = 0x80;              
  20.     IAP_ADDRL = 0;
  21. }
  22. unsigned char IapReadByte(unsigned int addr) //读取1字节
  23. {
  24.     unsigned char dat;                  
  25.     IAP_CONTR = ENABLE_IAP;      
  26.     IAP_CMD = CMD_READ;           
  27.     IAP_ADDRL = addr;            
  28.     IAP_ADDRH = addr >> 8;         
  29.     IAP_TRIG = 0x5a;            
  30.     IAP_TRIG = 0xa5;            
  31.     _nop_();                     
  32.     dat = IAP_DATA;
  33.     IapIdle();       
  34.     return dat;                  
  35. }

  36. void IapProgramByte(unsigned int addr, unsigned char dat) //写入1字节
  37. {
  38.     IAP_CONTR = ENABLE_IAP;        
  39.     IAP_CMD = CMD_PROGRAM;        
  40.     IAP_ADDRL = addr;            
  41.     IAP_ADDRH = addr >> 8;         
  42.     IAP_DATA = dat;               
  43.     IAP_TRIG = 0x5a;              
  44.     IAP_TRIG = 0xa5;               
  45.     _nop_();   
  46.     IapIdle();       
  47. }

  48. void IapEraseSector(unsigned int addr) //扇区擦除
  49. {
  50.     IAP_CONTR = ENABLE_IAP;        
  51.     IAP_CMD = CMD_ERASE;         
  52.     IAP_ADDRL = addr;            
  53.     IAP_ADDRH = addr >> 8;         
  54.     IAP_TRIG = 0x5a;              
  55.     IAP_TRIG = 0xa5;               
  56.     _nop_();
  57.     IapIdle();       
  58. }
  59. void IAP_Gyro()   //陀螺仪校准
  60. {
  61.         IapEraseSector(0xE200); //扇区擦除
  62.         g_y = GetData(GYRO_YOUT_H);  //读取陀螺仪数据
  63.         g_x = GetData(GYRO_XOUT_H);
  64.         g_z = GetData(GYRO_ZOUT_H);
  65.         IapProgramByte(0xE200,g_y>>8);  //写入数据至EEPROM
  66.         IapProgramByte(0xE201,g_y);
  67.         IapProgramByte(0xE202,g_x>>8);     //陀螺仪数据存放至114扇区
  68.         IapProgramByte(0xE203,g_x);
  69.         IapProgramByte(0xE204,g_z>>8);
  70.         IapProgramByte(0xE205,g_z);
  71.         IapProgramByte(0xE206,1);
  72. }
  73. void IAP_Angle()
  74. {
  75.         IapEraseSector(0xE400);           //加速度计数据存放至115扇区
  76.         a_x=(char)Angle;
  77.         a_y=(char)Angley;
  78.         IapProgramByte(0xE400,1);
  79.         IapProgramByte(0xE401,a_x);
  80.         IapProgramByte(0xE402,a_y);
  81. }
  82. void IAPRead()
  83. {
  84.         unsigned char i;
  85.         i=IapReadByte(0xE206);
  86.         if(i==1)      //判断数据是否已经更新过,更新过才读取数据
  87.         {
  88.         g_y=IapReadByte(0xE200)<<8|IapReadByte(0xE201);
  89.         g_x=IapReadByte(0xE202)<<8|IapReadByte(0xE203);
  90.         g_z=IapReadByte(0xE204)<<8|IapReadByte(0xE205);
  91.         }
  92.         i=IapReadByte(0xE400);
  93.         if(i==1)      //判断数据是否已经更新过,更新过才读取数据
  94.         {
  95.         a_x=IapReadByte(0xE401);
  96.         a_y=IapReadByte(0xE402);
  97.         }
  98. }

复制代码
回复

使用道具 举报

板凳
ID:129080 发表于 2016-7-13 13:52 | 只看该作者
这个是我们做飞行器不错的参考资料了
回复

使用道具 举报

地板
ID:130274 发表于 2016-7-19 10:15 | 只看该作者
haitao4675 发表于 2016-7-13 13:52
这个是我们做飞行器不错的参考资料了

学习了,感谢分享
回复

使用道具 举报

5#
ID:144374 发表于 2016-10-25 17:18 | 只看该作者
没黑币,什么都做不了
回复

使用道具 举报

6#
ID:143758 发表于 2016-10-28 21:05 | 只看该作者
路过,看看
回复

使用道具 举报

7#
ID:142588 发表于 2016-10-30 16:18 | 只看该作者

回帖奖励 +1 黑币

mark= =
回复

使用道具 举报

8#
ID:147796 发表于 2016-11-14 23:18 来自手机 | 只看该作者
最小系统可不可以啊
回复

使用道具 举报

9#
ID:154656 发表于 2016-12-14 12:33 | 只看该作者
顶一个不错
回复

使用道具 举报

10#
ID:137676 发表于 2017-1-7 15:10 | 只看该作者
学习了,感谢分享
回复

使用道具 举报

11#
ID:149634 发表于 2017-1-9 17:15 | 只看该作者
发发发
回复

使用道具 举报

12#
ID:205813 发表于 2017-5-29 13:23 | 只看该作者
和H啊哈哈哈哈哈哈哈哈哈哈哈,,,,学习
回复

使用道具 举报

13#
ID:207443 发表于 2017-6-5 19:26 | 只看该作者
好长的程序呀
回复

使用道具 举报

14#
ID:210531 发表于 2017-6-12 17:42 | 只看该作者
初学前来学习
回复

使用道具 举报

15#
ID:212208 发表于 2017-6-18 10:43 | 只看该作者
楼主好人,谢谢楼主!
回复

使用道具 举报

16#
ID:136713 发表于 2017-6-24 05:30 | 只看该作者
非常感谢分享
回复

使用道具 举报

17#
ID:213318 发表于 2017-6-28 15:22 | 只看该作者
收藏先,以后好研究
回复

使用道具 举报

18#
ID:197714 发表于 2017-6-30 10:54 来自手机 | 只看该作者
不知道,四轴都需要买什么东西?
回复

使用道具 举报

19#
ID:218461 发表于 2017-7-11 15:18 | 只看该作者
很厉害的设计,值得学习
回复

使用道具 举报

20#
ID:220748 发表于 2017-7-19 12:21 | 只看该作者
我正在学习制作遥控飞机模型,很需要的资料,谢谢无私奉献!!
回复

使用道具 举报

21#
ID:220748 发表于 2017-7-19 12:24 | 只看该作者
我正在做遥控飞机模型,正好需要这方面的技术资料!感谢奉献!!
回复

使用道具 举报

22#
ID:220748 发表于 2017-7-20 13:11 | 只看该作者
楼主!能否用方框图描述一下“MPU6050”的程序设计思路。
谢谢!!
回复

使用道具 举报

23#
ID:220748 发表于 2017-7-29 11:51 | 只看该作者
用的什么软件编译?
回复

使用道具 举报

24#
ID:233528 发表于 2017-9-16 19:27 | 只看该作者
要币下载呀
回复

使用道具 举报

25#
ID:135728 发表于 2017-9-17 12:00 | 只看该作者
mark
回复

使用道具 举报

26#
ID:234347 发表于 2017-9-23 15:42 | 只看该作者
66666,老铁
回复

使用道具 举报

27#
ID:142499 发表于 2018-1-5 18:54 | 只看该作者
感谢分享
回复

使用道具 举报

28#
ID:276347 发表于 2018-1-15 20:09 | 只看该作者
初学者,一点也看不懂。嘿嘿
回复

使用道具 举报

29#
ID:324648 发表于 2018-5-8 08:05 | 只看该作者

很厉害的设计,值得学习
回复

使用道具 举报

30#
ID:272104 发表于 2018-5-16 12:47 | 只看该作者
感谢分享
回复

使用道具 举报

31#
ID:370052 发表于 2018-7-12 11:36 | 只看该作者
学习了,感谢分享
回复

使用道具 举报

32#
ID:336691 发表于 2018-7-19 18:47 | 只看该作者
感谢楼主分享
回复

使用道具 举报

33#
ID:350791 发表于 2018-8-2 09:56 | 只看该作者
感谢楼主分享
回复

使用道具 举报

34#
ID:435813 发表于 2018-11-30 09:54 | 只看该作者
赞一个
回复

使用道具 举报

35#
ID:431575 发表于 2018-12-21 08:57 | 只看该作者
想看呓
回复

使用道具 举报

36#
ID:456412 发表于 2018-12-27 14:19 | 只看该作者
电调也是自己做的吗
回复

使用道具 举报

37#
ID:318672 发表于 2019-1-9 20:12 来自手机 | 只看该作者
非常感谢分享
回复

使用道具 举报

38#
ID:472519 发表于 2019-1-24 15:41 | 只看该作者
很好的资料 谢谢分享 最近研究四轴
回复

使用道具 举报

39#
ID:498382 发表于 2019-3-26 02:52 | 只看该作者
感谢楼主分享!!学习了!!
回复

使用道具 举报

40#
ID:377919 发表于 2019-5-29 16:01 | 只看该作者
过来看看,学习一下
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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