标题: IAP15W4K58S4-小四轴飞行器 原理图和程序等制作资料分享 [打印本页]

作者: haitao4675    时间: 2016-7-12 11:34
标题: IAP15W4K58S4-小四轴飞行器 原理图和程序等制作资料分享
STC四轴接收原理图.pdf (85.19 KB, 下载次数: 166)

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










四轴接收程序2.1.rar

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

四轴遥控器程序 2.1.rar

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


作者: admin    时间: 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. }

复制代码

作者: haitao4675    时间: 2016-7-13 13:52
这个是我们做飞行器不错的参考资料了
作者: 742586    时间: 2016-7-19 10:15
haitao4675 发表于 2016-7-13 13:52
这个是我们做飞行器不错的参考资料了

学习了,感谢分享
作者: aaaa123    时间: 2016-10-25 17:18
没黑币,什么都做不了
作者: 666.    时间: 2016-10-28 21:05
路过,看看
作者: 传说中的黑夜    时间: 2016-10-30 16:18
mark= =
作者: 涛涛UU    时间: 2016-11-14 23:18
最小系统可不可以啊
作者: zong8819169    时间: 2016-12-14 12:33
顶一个不错
作者: 黑黑—坤    时间: 2017-1-7 15:10
学习了,感谢分享
作者: 东北男孩007    时间: 2017-1-9 17:15
发发发
作者: 9869869    时间: 2017-5-29 13:23
和H啊哈哈哈哈哈哈哈哈哈哈哈,,,,学习
作者: ywwimmortals    时间: 2017-6-5 19:26
好长的程序呀
作者: psto    时间: 2017-6-12 17:42
初学前来学习
作者: 科大渣男    时间: 2017-6-18 10:43
楼主好人,谢谢楼主!

作者: rsxrb    时间: 2017-6-24 05:30
非常感谢分享
作者: zhuhouming    时间: 2017-6-28 15:22
收藏先,以后好研究
作者: 朱小文    时间: 2017-6-30 10:54
不知道,四轴都需要买什么东西?
作者: yhk123456    时间: 2017-7-11 15:18
很厉害的设计,值得学习
作者: lanhua520    时间: 2017-7-19 12:21
我正在学习制作遥控飞机模型,很需要的资料,谢谢无私奉献!!
作者: lanhua520    时间: 2017-7-19 12:24
我正在做遥控飞机模型,正好需要这方面的技术资料!感谢奉献!!
作者: lanhua520    时间: 2017-7-20 13:11
楼主!能否用方框图描述一下“MPU6050”的程序设计思路。
谢谢!!
作者: lanhua520    时间: 2017-7-29 11:51
用的什么软件编译?
作者: yhh_179127    时间: 2017-9-16 19:27
要币下载呀
作者: zxc4560160    时间: 2017-9-17 12:00
mark
作者: aojiaodekunge    时间: 2017-9-23 15:42
66666,老铁
作者: 好难学    时间: 2018-1-5 18:54
感谢分享

作者: oO承Oo    时间: 2018-1-15 20:09
初学者,一点也看不懂。嘿嘿
作者: 844837057    时间: 2018-5-8 08:05

很厉害的设计,值得学习
作者: AI.阳    时间: 2018-5-16 12:47
感谢分享
作者: 2924220947    时间: 2018-7-12 11:36
学习了,感谢分享
作者: li415984943    时间: 2018-7-19 18:47
感谢楼主分享
作者: hf6    时间: 2018-8-2 09:56
感谢楼主分享
作者: 1434036249    时间: 2018-11-30 09:54
赞一个
作者: 訾锴録    时间: 2018-12-21 08:57
想看呓
作者: 魏苏君    时间: 2018-12-27 14:19
电调也是自己做的吗
作者: zhlip    时间: 2019-1-9 20:12
非常感谢分享
作者: twl66630    时间: 2019-1-24 15:41
很好的资料 谢谢分享 最近研究四轴
作者: FENGJLONG    时间: 2019-3-26 02:52
感谢楼主分享!!学习了!!
作者: qxqy080602    时间: 2019-5-29 16:01
过来看看,学习一下
作者: 狂野的野马    时间: 2019-6-12 19:04
值得学习下,已经收藏,帮顶
作者: AFFF    时间: 2019-8-10 18:38
这个遥控器源程序为何没看到main主函数?请高手指点一下
作者: dengxiangxi    时间: 2019-8-14 13:15
值得学习下,已经收藏,帮顶
作者: ahweixiao    时间: 2019-8-22 23:52
太厉害了啊,受用了
作者: 难得糊涂2018    时间: 2019-9-13 20:34
这个是STC官网的那个吗
作者: berlin235    时间: 2019-9-14 08:05
正好在搞飞行器,谢谢楼主分享
作者: yuChen1    时间: 2019-9-26 16:58
打算做无人机,想观看观摩一下
作者: 依恋晓    时间: 2019-10-17 21:49
下载下来程序的头文件是stc15f2k60s2的
作者: 墨弦    时间: 2019-10-25 14:42
谢谢。。。。
作者: bryan_guan    时间: 2019-11-28 11:40
mark= =
作者: 蔡永东    时间: 2020-2-18 18:04
很不错




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1