5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 1752|回复: 12

自制富斯接收机一代【感谢芝士蛋糕的源码】

[复制链接]
发表于 2017-10-2 18:22 | 显示全部楼层 |阅读模式
本帖最后由 wangluoqishi 于 2017-10-2 23:36 编辑

// Flysky receiver for STC15W408AS
// Modify by gloeagle
// STC15W408AS 单片机没有T1定时器,需要特别注意,串口只能使用T2计时器来产生波特率
// TO加跳,T2输出  实测副翼输出频率136hz  接舵机然后上电不抖舵,遥控器无操作的时候有轻微的抖舵(408AS没有定时器1)
// PCA0输出电机PWM信号,通过芯片直接驱动电机
// 程序测试正常,剩下的就是来校准电调了

用面包板搭建的电路,测试舵机没啥问题,用万用表测量了P1.1引脚的电压,遥控器控制没问题,当然自己修改代码可以实现电磁舵机的功能
一直想完善这个接收机的电调校准功能,由于各种原因,拖到了最近。结果比较悲剧,A7105模块貌似出现了问题,while(AREG_read(0x02)); 在这个循环中出不来了
最后把源代码贴上,以前虽然学的电气自动化,但是单片机水平比较渣,有模友觉得有错误也可以提出来,V信  gloeagle
uVison V5.14.2.1 编译通过



  1. //*************************************************************************
  2. // RX A7105 2.4Ghz protocol Flysky/turnigy 9x (v2)
  3. // look at thread: http://www.rcgroups.com/forums/showthread.php?t=1626362
  4. // many thanks to: PhracturedBlue, Dave1993, Surfbreizh, CristiV...
  5. // author: Thierry P閎ayle
  6. //
  7. // Flysky receiver for STC11F04E
  8. // look at thread: http://bbs.mx3g.com/thread-473651-1-1.html
  9. //
  10. // LOLI receiver for STC15W408AS
  11. // look at thread: http://bbs.mx3g.com/thread-498303-1-1.html
  12. //
  13. // Flysky receiver for STC15W408AS
  14. // Modify by gloeagle
  15. // STC15W408AS 单片机没有T1定时器,需要特别注意,串口只能使用T2计时器来产生波特率
  16. // TO加跳,T2输出  实测副翼输出频率136hz  接舵机然后上电不抖舵,遥控器无操作的时候有轻微的抖舵
  17. // 下面计划PCA0输出电机PWM信号,通过芯片直接驱动电机  校准电调是个难点

  18. // 程序测试正常,剩下的就是来校准电调了
  19. //**********************************************************************
  20. //*******晶振选择内置 12Mhz*******//
  21. //#include<reg52.h>
  22. #include <STC15.H>
  23. #include <intrins.h>
  24. #define GUDING                                //固定失控值/自由自定
  25. #define u8 unsigned char
  26. #define u16 unsigned int
  27. #define u32 unsigned long int

  28. ////*****modify
  29. //定义指示灯
  30. sbit LED=P5^5;        //定义指示灯
  31. sbit bind=P5^4; //先接地然后接收机上电,进入对频模式
  32. sbit LED2=P3^7; //排错

  33. ////*****modify
  34. //定义4个通道输出
  35. sbit CH1=P3^2;   //副翼
  36. sbit CH2=P3^3;         //升降
  37. sbit CH3=P3^6;   //方向
  38. //油门-> PWM输出方式,脉冲在P1.1引脚    CCP0/P1.1引脚


  39. //*****定义无线模块的管脚
  40. sbit GIO=P1^2;   
  41. sbit MDI=P1^3;  
  42. sbit SCK=P1^4;
  43. sbit CSN=P1^5;

  44. u8 code A7105_regs[]={                        //模块寄存器设定表
  45.     0xff, 0x42, 0x00, 0x14, 0x00, 0xff, 0xff ,0x00, 0x00, 0x00, 0x00, 0x01, 0x21, 0x05, 0x00, 0x50,
  46.     0x9e, 0x4b, 0x00, 0x02, 0x16, 0x2b, 0x12, 0x00, 0x62, 0x80, 0x80, 0x00, 0x0a, 0x32, 0xc3, 0x0f,
  47.     0x13, 0xc3, 0x00, 0xff, 0x00, 0x00, 0x3b, 0x00, 0x17, 0x47, 0x80, 0x03, 0x01, 0x45, 0x18, 0x00,
  48.     0x01, 0x0f, 0xff,
  49. };
  50. u8 code tx_channels[16][16]={                //跳频表
  51.   {0x0a, 0x5a, 0x14, 0x64, 0x1e, 0x6e, 0x28, 0x78, 0x32, 0x82, 0x3c, 0x8c, 0x46, 0x96, 0x50, 0xa0},
  52.   {0xa0, 0x50, 0x96, 0x46, 0x8c, 0x3c, 0x82, 0x32, 0x78, 0x28, 0x6e, 0x1e, 0x64, 0x14, 0x5a, 0x0a},
  53.   {0x0a, 0x5a, 0x50, 0xa0, 0x14, 0x64, 0x46, 0x96, 0x1e, 0x6e, 0x3c, 0x8c, 0x28, 0x78, 0x32, 0x82},
  54.   {0x82, 0x32, 0x78, 0x28, 0x8c, 0x3c, 0x6e, 0x1e, 0x96, 0x46, 0x64, 0x14, 0xa0, 0x50, 0x5a, 0x0a},
  55.   {0x28, 0x78, 0x0a, 0x5a, 0x50, 0xa0, 0x14, 0x64, 0x1e, 0x6e, 0x3c, 0x8c, 0x32, 0x82, 0x46, 0x96},
  56.   {0x96, 0x46, 0x82, 0x32, 0x8c, 0x3c, 0x6e, 0x1e, 0x64, 0x14, 0xa0, 0x50, 0x5a, 0x0a, 0x78, 0x28},
  57.   {0x50, 0xa0, 0x28, 0x78, 0x0a, 0x5a, 0x1e, 0x6e, 0x3c, 0x8c, 0x32, 0x82, 0x46, 0x96, 0x14, 0x64},
  58.   {0x64, 0x14, 0x96, 0x46, 0x82, 0x32, 0x8c, 0x3c, 0x6e, 0x1e, 0x5a, 0x0a, 0x78, 0x28, 0xa0, 0x50},
  59.   {0x50, 0xa0, 0x46, 0x96, 0x3c, 0x8c, 0x28, 0x78, 0x0a, 0x5a, 0x32, 0x82, 0x1e, 0x6e, 0x14, 0x64},
  60.   {0x64, 0x14, 0x6e, 0x1e, 0x82, 0x32, 0x5a, 0x0a, 0x78, 0x28, 0x8c, 0x3c, 0x96, 0x46, 0xa0, 0x50},
  61.   {0x46, 0x96, 0x3c, 0x8c, 0x50, 0xa0, 0x28, 0x78, 0x0a, 0x5a, 0x1e, 0x6e, 0x32, 0x82, 0x14, 0x64},
  62.   {0x64, 0x14, 0x82, 0x32, 0x6e, 0x1e, 0x5a, 0x0a, 0x78, 0x28, 0xa0, 0x50, 0x8c, 0x3c, 0x96, 0x46},
  63.   {0x46, 0x96, 0x0a, 0x5a, 0x3c, 0x8c, 0x14, 0x64, 0x50, 0xa0, 0x28, 0x78, 0x1e, 0x6e, 0x32, 0x82},
  64.   {0x82, 0x32, 0x6e, 0x1e, 0x78, 0x28, 0xa0, 0x50, 0x64, 0x14, 0x8c, 0x3c, 0x5a, 0x0a, 0x96, 0x46},
  65.   {0x46, 0x96, 0x0a, 0x5a, 0x50, 0xa0, 0x3c, 0x8c, 0x28, 0x78, 0x1e, 0x6e, 0x32, 0x82, 0x14, 0x64},
  66.   {0x64, 0x14, 0x82, 0x32, 0x6e, 0x1e, 0x78, 0x28, 0x8c, 0x3c, 0xa0, 0x50, 0x5a, 0x0a, 0x96, 0x46},
  67. };
  68. u32 id;                                         //对码ID
  69. u8 chanrow,chancol,chanoffset,channel;
  70. u8 txid[21]={0,0,0,0,0,220,5,220,5,232,3,220,5,220,5,220,5,220,5,220,5};
  71. u8 packet[21];
  72. u8 Htemp[8]={5,5,3,5,5,5,5,5};
  73. u8 Ltemp[8]={220,220,232,220,220,220,220,220};
  74. u8 ch=0;
  75. u16 mss;
  76. bit hch,cb;
  77. //modify
  78. ////FS-I6 GUDING -- 通过修改程序,手动获取的  在这定义的值函数里面为啥用不了
  79. unsigned short int ESC_MIN=990;  //小油门行程
  80. unsigned short int ESC_MAX=1980;  //大油门行程
  81. unsigned short int RxESC;
  82. unsigned short int ESCtemp;
  83. //延时定义
  84. void Delay1ms(){                //@12.000MHz
  85.         unsigned char i, j;
  86.         _nop_();
  87.         _nop_();
  88.         i = 10;
  89.         j = 83;
  90.         do
  91.         {
  92.                 while (--j);
  93.         } while (--i);
  94. }

  95. void delay_ms(u16 i){
  96.         while(i--)
  97.         Delay1ms();
  98. }

  99. //错误灯函数
  100. void ErrorLED(){
  101.         LED2=0;               //add    2017
  102.         delay_ms(500);
  103.         LED2=1;
  104.         delay_ms(500);
  105.         LED2=0;
  106. }

  107. void IapIdle(){
  108.     IAP_CONTR = 0;                  //Close IAP function
  109.     IAP_CMD = 0;                    //Clear command to standby
  110.     IAP_TRIG = 0;                   //Clear trigger register
  111.     IAP_ADDRH = 0x80;               //Data ptr point to non-EEPROM area
  112.     IAP_ADDRL = 0;                  //Clear IAP address to prevent misuse
  113. }
  114. u8 EEPROM_read(u8 addr){
  115.     u8 dat;                               //Data buffer
  116.     IAP_CONTR = 0x82;                         //Open IAP function, and set wait time
  117.     IAP_CMD = 0x01;                     //Set ISP/IAP/EEPROM READ command
  118.     IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
  119.     IAP_ADDRH = 0;                          //Set ISP/IAP/EEPROM address high
  120.     IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
  121.     IAP_TRIG = 0xa5;                //Send trigger command2 (0xa5)
  122.     _nop_();                               //MCU will hold here until ISP/IAP/EEPROM operation complete
  123.     dat = IAP_DATA;                 //Read ISP/IAP/EEPROM data
  124.     IapIdle();                      //Close ISP/IAP/EEPROM function
  125.     return dat;                     //Return Flash data
  126. }
  127. void EEPROM_write(u8 addr,u8 dat){
  128.     IAP_CONTR = 0x82;                         //Open IAP function, and set wait time
  129.     IAP_CMD = 0x02;                          //Set ISP/IAP/EEPROM PROGRAM command
  130.     IAP_ADDRL = addr;               //Set ISP/IAP/EEPROM address low
  131.     IAP_ADDRH = 0;                          //Set ISP/IAP/EEPROM address high
  132.     IAP_DATA = dat;                 //Write ISP/IAP/EEPROM data
  133.     IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
  134.     IAP_TRIG = 0xa5;                //Send trigger command2 (0xa5)
  135.     _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
  136.     IapIdle();
  137. }
  138. void EEPROM_clean(u8 addr){
  139.     IAP_CONTR = 0x82;                         //Open IAP function, and set wait time
  140.     IAP_CMD = 0x03;                     //Set ISP/IAP/EEPROM ERASE command
  141.     IAP_ADDRL = 0;                      //Set ISP/IAP/EEPROM address low
  142.     IAP_ADDRH = addr;                          //Set ISP/IAP/EEPROM address high
  143.     IAP_TRIG = 0x5a;                //Send trigger command1 (0x5a)
  144.     IAP_TRIG = 0xa5;                //Send trigger command2 (0xa5)
  145.     _nop_();                        //MCU will hold here until ISP/IAP/EEPROM operation complete
  146.     IapIdle();
  147. }
  148. void IDWR(bit wr){                                         // 1:保存        0:读取
  149.         u8 i;
  150.         if(wr)EEPROM_clean(0),delay_ms(10);
  151.         for(i=0;i<21;i++){
  152.                 if(wr){
  153.                         EEPROM_write(i,txid[i]); }
  154.                 //        txid[i]=packet[i];}
  155.                 else txid[i]=EEPROM_read(i);
  156.         }
  157. }
  158. void SPIwrite(u8 command){                   //时序写
  159.         u8 n=8;
  160.         SCK=0;MDI=0;
  161.         while(n--) {
  162.                 if(command&0x80)MDI=1;
  163.                 else MDI=0;
  164.                 SCK=1;_nop_();SCK=0;
  165.                 command = command << 1;
  166.         }
  167.         MDI=1;
  168. }  
  169. u8 SPIread(void){                                        //时序读
  170.         u8 i,result=0;
  171.         for(i=0;i<8;i++) {                    
  172.                 if(MDI==1)result=(result<<1)|0x01;
  173.                 else result=result<<1;
  174.                 SCK=1;_nop_();SCK=0;_nop_();
  175.         }return result;
  176. }
  177. void AREG_write(u8 address, u8 dat){//写寄存器
  178.         CSN=0;
  179.         SPIwrite(address);
  180.         _nop_();
  181.         SPIwrite(dat);  
  182.         CSN=1;
  183. }
  184. u8 AREG_read(u8 address){                         //读寄存器
  185.         u8 result;
  186.         CSN=0;
  187.         address |=0x40;
  188.         SPIwrite(address);
  189.         result = SPIread();  
  190.         CSN=1;
  191.         return(result);
  192. }
  193. void A7105_WriteID(u32 ida) {                //写模块ID
  194.         CSN=0;
  195.         SPIwrite(0x06);
  196.         SPIwrite((ida>>24)&0xff);
  197.         SPIwrite((ida>>16)&0xff);
  198.         SPIwrite((ida>>8)&0xff);
  199.         SPIwrite((ida>>0)&0xff);
  200.         CSN=1;
  201. }
  202. void Read_Packet(){                                        //读数据包,遥控数据
  203.         u8 i;
  204.         CSN=0;
  205.         SPIwrite(0x45);
  206.         for (i=0;i<21;i++)packet[i]=SPIread();
  207.         CSN=1;
  208. }
  209. void Strobe(u8 address){                        //模块设定
  210.         CSN=0;
  211.         SPIwrite(address);
  212.         CSN=1;
  213. }
  214. ////PWM_config -- modify
  215. void PWM_init()
  216. {
  217.         P1M0=0x00;P1M1=0x00;
  218.         //CMOD=0x80;                   // #10000000B   空闲模式下停止PCA计数器工作;选择PCA时钟源为Fosc/12,禁止PCA计数器溢出时中断
  219.         CMOD=0x00;
  220.         CCON = 0;              // 清零PCA计数器溢出中断请求标志位CF
  221.         CL = 0;                // 清零PCA 计数器
  222.         CH = 0;         
  223.         CCAPM0=0x42;                   // 设置PCA模块0为8位PWM输出方式,脉冲在P1.1引脚    CCP0/P1.1引脚
  224.         CR=1;                                   // PCA计数器开始运行;CR = 0, 不允许 PCA 计数器计数,清零PCA 各模块中断请求标志位CCFn
  225. }
  226. void PWM_ESC()
  227. {
  228.     EA=0;
  229.     RxESC=packet[10];
  230.     RxESC<<=8;
  231.     RxESC+=packet[9];
  232.         RxESC=RxESC/10;
  233.         ESC_MIN=990/10;
  234.         ESC_MAX=1980/10;
  235.         ESCtemp=256-(256*(RxESC-ESC_MIN))/(ESC_MAX-ESC_MIN);
  236.         EA=1;
  237.         CCAP0H=ESCtemp;           //输出特定占空比的PWM
  238. }
  239. ////end
  240. void bind_Flysky(){                                        //对频
  241.         u8 i,counter1=255;
  242.         Strobe(0xA0);
  243.         Strobe(0xF0);
  244.         AREG_write(0x0F,0x00);//比发射低一频道
  245.         Strobe(0xC0);
  246.         while(counter1){
  247.                 delay_ms(10);
  248.                 if(counter1&0x04)LED=1;
  249.                 else LED=0;               
  250.                 if(GIO==0){
  251.                         if((AREG_read(0x00)&0x60)==0){                                       
  252.                                 Read_Packet();
  253.                                 for(i=0;i<21;i++)txid[i]=packet[i];
  254.                                 break;
  255.                         }
  256.                         else{
  257.                                 Strobe(0xA0);
  258.                                 Strobe(0xF0);
  259.                                 AREG_write(0x0F,0x00);
  260.                                 Strobe(0xC0);
  261.                                 continue;
  262.                         }
  263.                 }
  264.                 else{
  265.                 --counter1;
  266.                 if (counter1==0)counter1=255;
  267.                 //LED2=0;  //add    2017
  268.                 }
  269.         }        
  270. }
  271. void flysky_cb(){                                        //主循环
  272.         u8 i,x;
  273.         channel=tx_channels[chanrow][chancol]-chanoffset;//跳频道
  274.         channel-=1;
  275.         Strobe(0xA0);
  276.         Strobe(0xF0);
  277.         AREG_write(0x0F,channel);//设定频道
  278.         Strobe(0xC0);
  279.         chancol=(chancol+1)%16;
  280.         while(1){
  281.                 if(mss>80){    //无信号1.5s后失控保护
  282.                          #ifdef GUDING
  283.                                 Ltemp[2]=232;Htemp[2]=3;
  284.                         #endif        
  285.                         for(i=0;i<8;i++){
  286.                                 #ifdef GUDING        
  287.                                                 if(i==2)continue;
  288.                                                 Ltemp[i]=220;
  289.                                                 Htemp[i]=5;
  290.                                 #else               
  291.                                                 Ltemp[i]=txid[2*i+5];
  292.                                                 Htemp[i]=txid[2*i+6];
  293.                                 #endif
  294.                         }
  295.                 }
  296.                 if(hch){                 //大于20ms加跳
  297.                         hch=0;LED=0;
  298.                         chancol=(chancol+1)%16;
  299.                 //        channel=tx_channels[chanrow][chancol]-1-chanoffset;
  300.                         break;
  301.                 }
  302.                 if (GIO==1)continue;
  303.                 x=AREG_read(0x00);
  304.                 if(x&0x60)continue;//数据检验
  305.                 Read_Packet();//读遥控数据               ↓↓↓↓↓匹配ID
  306.                 if (!(packet[1]==txid[1])&&!(packet[2]==txid[2])&&!(packet[3]==txid[3])&&!(packet[4]==txid[4]))continue;
  307.                 mss=0;
  308.                 if(cb){
  309.                         for (i=0;i<8;i++){//输出                1000~2000
  310.                                 EA=0;               //总中断开关:关
  311.                                 x=packet[6+(2*i)];
  312.                                 if((x>=3)&&(x<=8) ){        //防止溢出
  313.                                         Ltemp[i]=packet[5+(2*i)];
  314.                                         Htemp[i]=x;
  315.                                 }
  316.                                 EA=1;               //总中断开关:开
  317.                         }
  318.                 }        
  319.                 if(cb)LED=1;
  320.                 break;
  321.         }
  322. }
  323. void flysky_init(){          //初始化
  324.         u8 i,k;
  325.         u16 HT;
  326.         P1M0 |= 0x03;     //(00000011B)  设置1口01为10状态
  327.         P3M0 |= 0xcf;     //(11001111B)  设置3口012367为10状态
  328.         P5M0 |= 0x20;     //(00100000B)  5.5 led;5.4 bind
  329.         //TMOD=0x11;                  //(00010001)  T1 T0非自动重装方式(默认)
  330.         TMOD = 0x01;AUXR = 0x00;      //(00000001)  T0非自动重装方式;T2为12T模式
  331.         //IE=0x8a;                    //(10001010)  EA ET1 ET0 开中断 (默认)
  332.         IE |= 0x82;IE2 |= 0x04;       //(10000010)  EA ET0 开中断;//定时器2 开中断
  333.         bind=1;CSN=1;MDI=1;SCK=0;
  334.         delay_ms(10);
  335.         AREG_write(0x00,0x00);
  336.         A7105_WriteID(0x5475c52A);
  337.         for (i = 0; i < 0x33; i++){
  338.                 if(A7105_regs[i] != 0xff)
  339.                         AREG_write(i, A7105_regs[i]);
  340.         }        
  341.         Strobe(0xA0);
  342.         AREG_write(0x02,0x01);
  343.         //ErrorLED();  //  没问题,可以执行
  344.         while(AREG_read(0x02));     //这出现问题了,循环没有出来
  345.         ErrorLED();    //  有问题,没有执行,应该断在循环中,没出来
  346.         AREG_write(0x24,0x13);
  347.         AREG_write(0x26,0x3b);
  348.         AREG_write(0x0F,0x00);
  349.         AREG_write(0x02,0x02);
  350.         while(AREG_read(0x02));
  351.         AREG_write(0x0F,0xA0);
  352.         AREG_write(0x02,0x02);
  353.         while(AREG_read(0x02));
  354.         AREG_write(0x25,0x08);
  355.         Strobe(0xA0);
  356.          while(1){
  357.                 LED=1;
  358.                 delay_ms(500);
  359.                 LED=0;
  360.                 delay_ms(500);
  361.                 if(bind==1){
  362.                         IDWR(0);                //读取ID
  363.                         cb=1;
  364.                         if(txid[0]==0xaa)break;
  365.                         else continue;
  366.                 }
  367.                 else{
  368.                         bind_Flysky();//对频
  369.                         LED=1;        
  370.                         delay_ms(500);
  371.                         LED=0;
  372.                         delay_ms(500);
  373.                         //TR0=TR1=1;              //Modify
  374.                         TR0=1;AUXR|=0x10;
  375.                         cb=0;
  376.                         break;
  377.                 }
  378.         }                        
  379.         //↓↓↓↓↓↓↓↓合拼ID
  380.         id=(txid[1]|((u32)txid[2]<<8)|((u32)txid[3]<<16)|((u32)txid[4]<<24));        
  381.         chanrow=id%16;
  382.         chanoffset=(id&0xff)/16;
  383.         chancol=0;
  384.         if(chanoffset>9)chanoffset=9;
  385.         while(TR0){
  386.                 ////if(bind){IDWR(1);LED=0;TR0=TR1=0;while(1){LED=1;delay_ms(1000);LED=0;delay_ms(1500);};}
  387.                 if(bind){IDWR(1);LED=0;TR0=0;AUXR=0x00;while(1){LED=1;delay_ms(1000);LED=0;delay_ms(1500);};}    //Modify
  388.                 flysky_cb();//4:1024  5:1280  6:1536  7:1792  8:2048
  389.                 if(mss>5){mss=0;
  390.                         for(i=0;i<8;i++){
  391.                                 if((i>3)||(i==2)){
  392.                                         Ltemp[i]=txid[2*i+5]=packet[2*i+5];
  393.                                         Htemp[i]=txid[2*i+6]=packet[2*i+6];
  394.                                         continue;
  395.                                 }
  396.                                 if((packet[2*i+6]<5)||(packet[2*i+6]>6)){
  397.                                         if(k&(1<<i)){k&=(0xfe<<i);LED=1;
  398.                                                 HT=(u16)txid[2*i+5]|(u16)(txid[2*i+6]<<8);
  399.                                                 if(packet[2*i+6]<5){if(HT>900)HT-=100;}
  400.                                                 else if(HT<2000)HT+=100;
  401.                                                 Ltemp[i]=txid[2*i+5]=HT&0xff;
  402.                                                 Htemp[i]=txid[2*i+6]=(HT>>8)&0xff;}
  403.                                         }
  404.                                 else k|=(1<<i);                        
  405.                         }                        
  406.                 }
  407.         }
  408. }
  409. void main(){
  410.     PWM_init();        
  411.         flysky_init();
  412.         //启动加跳和输出定时器 -- Modify
  413.         //TR0=1;TR1=1;                //T0为跳频定时器,T1为输出定时器(默认)
  414.         TR0=1;AUXR |= 0x10;            //T0为跳频定时器,T2为输出定时器
  415.         while(1)flysky_cb();
  416. }
  417. /*
  418. //如果SYSclk的单位用Hz,则T单位用S,
  419. //16位定时器(12T)初值=65536-(SYSclk/12)*T;
  420. //16位定时器(1T)初值=65536-SYSclk*T;
  421. //8位定时器(12T)初值=256-(SYSclk/12)*T;
  422. //8位定时器(1T)初值=256-SYSclk*T;
  423. */
  424. void et0()interrupt 1{                                                  //加跳定时器
  425.         //TH0 =248;TL0 =50;                                              //@12Mhz  2ms        +2
  426.   //初值=65536-(12000000/12)*0.020=45536=B1E0   16位@12Mhz  20ms
  427.         TH0=0xb1;TL0=0xe0;                                            //@12Mhz  20ms
  428.         //TH0=0xD8;TL0=0xF0;                            //@12Mhz  10ms
  429.         //TH0=0x3C;TL0=0xB0;                            //@12Mhz  50ms
  430.         hch=1;
  431.         mss++;
  432.         //PWM_math();                     //函数中,关总中断,开总中断;结果是没波形,电压没有降低
  433. }
  434. //void et1()interrupt 3{                    //输出定时器,定时器T1中断程序
  435. void et2()interrupt 12{                                //输出定时器,定时器T2中断程序
  436.     PWM_ESC();                      //P1.1输出占空比PWM波;函数中,关总中断,开总中断;结果是只有4khz的波形,电压没有降低;
  437.         CH1=0;CH2=0;CH3=0;
  438.         //CH4=0;
  439.         T2H=255-Htemp[ch];                    //@12Mhz   252                3
  440.         T2L=255-Ltemp[ch];                    //@12Mhz   23                232
  441.         switch (ch) {
  442.         case 1:        CH1=1;break;            //副翼
  443.         case 2:        CH2=1;break;            //升降
  444.         case 3:        CH3=1;break;            //方向
  445.         }
  446.         if(ch < 4)ch++;//3通道循环
  447.         else ch=0;
  448. }

复制代码





评分

参与人数 1威望 +2 收起 理由
永丰狼人 + 2 很给力!

查看全部评分

欢迎继续阅读楼主其他信息

发表于 2017-10-4 11:54 | 显示全部楼层
厉害!羡慕!支持!

发表于 2017-10-21 20:14 | 显示全部楼层
我也要仿制接收机,谢谢!
发表于 2017-10-25 19:19 | 显示全部楼层

发表于 2017-10-29 12:33 | 显示全部楼层
测试了,这个版本不错!
可以用15W408AS了
发表于 2017-10-29 15:03 | 显示全部楼层
楼主你这样做,让原厂接收机怎么想,不过我喜欢,继续鼓捣天地飞如何?
来自安卓客户端来自安卓客户端
发表于 2018-4-25 17:01 | 显示全部楼层
请问你还有自制蛋糕的 接收机的资料嘛? 我看 模型三国上不去了啊
 楼主| 发表于 2018-4-26 11:45 | 显示全部楼层
lldsww 发表于 2018-4-25 17:01
请问你还有自制蛋糕的 接收机的资料嘛? 我看 模型三国上不去了啊

程序里面有备注的,单片机接电源,接个LED灯,再就是舵机输出,很简单
来自安卓客户端来自安卓客户端
发表于 2018-5-25 10:38 | 显示全部楼层
stc15w408as做接收比stc15w204s效果好吗?还是可以增加功能?还是其它原因?
 楼主| 发表于 2018-5-25 11:00 | 显示全部楼层
dukecheng 发表于 2018-5-25 10:38
stc15w408as做接收比stc15w204s效果好吗?还是可以增加功能?还是其它原因?

我自己增加了电调的功能,只实现了标准行程,没实现校准油门行程的功能,每个遥控器的油门行程都不一样的
来自安卓客户端来自安卓客户端
 楼主| 发表于 2018-5-25 11:02 | 显示全部楼层
dukecheng 发表于 2018-5-25 10:38
stc15w408as做接收比stc15w204s效果好吗?还是可以增加功能?还是其它原因?

手里只有408,所以就用的40。要用204估计要改代码
来自安卓客户端来自安卓客户端
发表于 2018-5-25 11:36 | 显示全部楼层
wangluoqishi 发表于 2018-5-25 11:02
手里只有408,所以就用的40。要用204估计要改代码

我还以为408好一些呢。我104,204,408都买了一些,用最便宜的了

发表于 2018-7-5 19:09 | 显示全部楼层
没人研究接收机啊?比买成品便宜多了,还在摸索萝莉控
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /2 下一条

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