久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 18754|回復(fù): 11
收起左側(cè)

KK開源四軸飛控源代碼與使用說明

  [復(fù)制鏈接]
ID:199977 發(fā)表于 2017-10-30 15:01 | 顯示全部樓層 |閱讀模式
KK是一個很有趣的開源飛控,由于其硬件要求低,價格大眾化,所以雖然性能有限,還是有著廣泛的使用群體。我也有一個KK飛控板,并且我下 載了KK的源碼進(jìn)行研究,比較麻煩的是,KK的源碼是用匯編寫的,很多人是看不懂的。

我覺得這是一個很好的硬件平臺(便宜),適合懂單片機(jī)的用戶進(jìn)行電子試驗和算法試驗,因此我花了幾個晚上的時間,用C語言完整從零編寫了KK飛控的源代碼,并且增強(qiáng)了一些很有價值的功能,使得KK的使用更加方便。

現(xiàn)在,我把全部的源碼開放在這里,不懂單片機(jī)的模友可以直接下 載使用,懂單片機(jī)的模友可以嘗試改寫代碼,加入自己喜歡的功能~

0.png

飛控的使用說明:
1. 概述
KK_C 是一個四軸飛控固件項目,該固件可用于各種模式的四軸、三軸、六軸、八軸等模式的飛行器,也可用于固定翼穩(wěn)定之用。 KK_C 是完全用 C 語言編寫的固件 , 兼容 KK V5.5 飛控板 , V1.0 版固件大小為 4K 左右 , 適合 ATMAEL 的 MEGA48/88/16 8等單片機(jī)芯片。
KK_C 目前還在不斷完善中,歡迎大家下載使用,隨著版本的升級,還將加入更多
實用的功能,敬請期待!
三軸陀螺儀穩(wěn)定系統(tǒng)
支持正反向陀螺儀芯片
支持電調(diào)油門行程校準(zhǔn)
支持十字模式和 X 模式安裝
支持鎖定保護(hù)功能
3. 改進(jìn)功能( KK_C 特有功能)
開機(jī)等待遙控器信號功能(保障使用安全)
飛行器模式選擇功能(免燒固件)
全遙控器設(shè)置(免調(diào)電位器)
軟件消震動算法(可配置開 / 關(guān))
支持搖桿指數(shù)功能(可配置開 / 關(guān))
PI 控制算法(電位器調(diào)節(jié)感度)
333Hz 高精度電調(diào)信號輸出
電位器正反向識別功能(見 9.5 節(jié))
4. 使用前準(zhǔn)備
1. 遙控器應(yīng)設(shè)定為固定翼工作模式(或單舵機(jī)直升機(jī)模式)
2. 各通道的舵量( EPA )應(yīng)設(shè)置在 80 以上,推薦使用 80
3. 如果有大小舵開關(guān)(雙比率控制 D/R ) ,應(yīng)將開關(guān)撥至大舵量位置
4. 初始時,各通道正反向全部設(shè)置為正向
5. 各通道的微調(diào)歸零( TRIM 或 SUBTRIM 菜單)
6. 各搖桿的微調(diào)歸零(搖桿旁邊的微動開關(guān))
7. 如使用的遙控系統(tǒng)需要對碼,請在連接飛控板之前完成對碼
5. 連線和布局
1. 飛控板和接收機(jī)之間需要連接 4 個通道:副翼 -AIL 、升降 -ELE 、油門 -THR 、方
向 -RUD ,連接方法和標(biāo)準(zhǔn) KK 固件相同,請注意看 KK 飛控板的標(biāo)識
0.png 0.png
(余下內(nèi)容請下載附件)

單片機(jī)源程序如下:
  1. //###############################################
  2. // Author  : Gale
  3. // Email   : galemx@126.com
  4. // Location: FuZhou FuJian China
  5. //
  6. #include "KK_C.H"
  7. #include "F_DELAY.H"
  8. #include "F_EEROM.H"

  9. //###############################################
  10. // Global Vars define
  11. // 全局變量定義

  12. //--------------------------------------
  13. //##Gyro signal 陀螺儀信號
  14. uchar DevRev;                                         //Gyro rev flags 陀螺儀信號反轉(zhuǎn)標(biāo)識
  15. uchar SoftSet;                                        //Fly control software setting 飛控軟件設(shè)置
  16. uchar AxisMode;                                        //Fly control mode 飛控模式

  17. //--------------------------------------
  18. //##Arm 鎖定
  19. bool InLock=1;        //model is in lock 模型處于鎖定狀態(tài)
  20. uchar ArmCnt=0;        //Count for arm/disarm

  21. //###############################################
  22. //
  23. //   Stick exp
  24. //   搖桿指數(shù)調(diào)整
  25. //
  26. int StickExp(int stk)
  27. {
  28.          uchar neg=(stk<0);
  29.         
  30.         stk*=stk;
  31.         stk/=128;
  32.         
  33.         if(neg) stk=-stk;
  34.         
  35.         return stk;
  36. }

  37. //###############################################
  38. //
  39. //   Stick angle limit
  40. //   搖桿角度限幅
  41. //
  42. int StickLimitValue(int v)
  43. {
  44.          if(v>PPM_MAX)        return PPM_MAX;
  45.         if(v<0)                        return 0;
  46.         return v;
  47. }

  48. //###############################################
  49. //
  50. //   Board initialization
  51. //   系統(tǒng)初始化
  52. //
  53. void Init(void)
  54. {
  55.          //Disable all int 禁用全部中斷
  56.         CLI();           
  57.         
  58.         //Port direction 設(shè)置端口方向
  59.         DDRB=0x7F;                 //0b01111111
  60.         DDRC=0xC0;                 //0b11000000
  61.         DDRD=0xF1;                 //0b11110001
  62.         
  63.         //Interrupt setting 設(shè)置中斷
  64.         PCICR=0x05;                 //0b00000101 PB7,PB1
  65.         PCMSK0=0x80;         //0b10000000 PB7
  66.         PCMSK2=0x02;         //0b00000010 PD1
  67.         EICRA=0x05;                 //0b00000101 PD2,PD3
  68.         EIMSK=0x03;                 //0b00000011 PD2,PD3
  69.         
  70.         //Set timer1 to 1M 將定時器1設(shè)為1M
  71.         TCCR1B=0x02;         // 1/8 sysclk, 1us count
  72.         
  73.         //Set timer2 to 8us count
  74.         TCCR2B=4;                // 1/64 sysclk,8us count
  75.                         
  76.         //Enable interrupts 打開中斷
  77.         SEI();
  78.         
  79.         //Delay to avoid power jitter
  80.         //延時2秒避開電源不穩(wěn)定階段
  81.         Delay100ms(20);
  82. }

  83. //###############################################
  84. //
  85. //   Test arming/disarming
  86. //   判斷是否需要鎖定/解鎖
  87. //----Hold rud stick for a while, ARMING_TIME should mul main-loop cycle
  88. //----保持方向搖桿一會后解/鎖,ARMING_TIME乘以主循環(huán)周期就是時間
  89. //
  90. #define ARMING_TIME                  250
  91. void ArmingRoutine(void)
  92. {
  93.          //Count for anti-jitter 鎖定消抖動
  94.         if(RxRud<-STICKGATE || RxRud>STICKGATE)        ArmCnt++;
  95.         else                                                                            ArmCnt=0;
  96.                         
  97.         //Hold rud stick for a while, the num should mul main-loop cycle
  98.         if(ArmCnt>ARMING_TIME)               
  99.         {         
  100.                 if(InLock)
  101.                 {
  102.                          if(RxRud>STICKGATE)        
  103.                         {
  104.                                  GyroBaseCnt=GYROBASECNT;        
  105.                                  InLock=0;
  106.                         }
  107.                 }
  108.                 else
  109.                 {
  110.                          if(RxRud<-STICKGATE)                InLock=1;
  111.                 }
  112.         }
  113. }

  114. //###############################################
  115. //
  116. //   Gain scale (return gyro*gain/128)
  117. //   感度調(diào)整
  118. //
  119. int GainAdj(int gyro,uchar gain)
  120. {
  121.          int r;
  122.         r=gyro/8;
  123.         r*=gain;                  
  124.         return r/(128/8);
  125. }

  126. //###############################################
  127. //
  128. //   Caculate plane attitude
  129. //   計算飛行器姿態(tài)
  130. //
  131. void CaclAttitude(void)
  132. {
  133.         GyroRead();
  134.         
  135.         //If no gyro base, calibrate gyro
  136.         //如果還未建立基準(zhǔn),建立它
  137.         if(GyroBaseCnt)
  138.         {                        
  139.                  GyroBaseRol+=GyroRol;
  140.                 GyroBaseRol/=2;
  141.                
  142.                 GyroBasePit+=GyroPit;
  143.                 GyroBasePit/=2;
  144.                
  145.                 GyroBaseYaw+=GyroYaw;
  146.                 GyroBaseYaw/=2;
  147.                
  148.                 GyroBaseCnt--;
  149.                 if(!(GyroBaseCnt&7)) LED0_TOG();        //Shine LED show gyro cali 閃爍LED表示在進(jìn)行陀螺儀校準(zhǔn)
  150.                
  151.                 GyroRolI=GyroPitI=GyroYawI=0;//Reset I value 清空積分值
  152.         }
  153.         else
  154.         {               
  155.                 if(InLock)
  156.                 {
  157.                          //熄滅LED表示在鎖定中
  158.                         LED0_OFF();
  159.                 }
  160.                 else
  161.                 {
  162.                           //Remove base part from gyro value
  163.                         //減去基礎(chǔ)值
  164.                          GyroRol-=GyroBaseRol;
  165.                          GyroPit-=GyroBasePit;
  166.                          GyroYaw-=GyroBaseYaw;
  167.         
  168.                         //Reverse gyro signals if necessary
  169.                         //根據(jù)設(shè)置反轉(zhuǎn)各個陀螺儀信號
  170.                         if(BITTST(DevRev,GYRO_ROL))          GyroRol=-GyroRol;
  171.                         if(BITTST(DevRev,GYRO_PIT))          GyroPit=-GyroPit;
  172.                         if(BITTST(DevRev,GYRO_YAW))          GyroYaw=-GyroYaw;
  173.                         
  174.                         //Gyro feature compensation
  175.                         //陀螺儀特性補償
  176.                         GyroRol=GyroCompe(GyroRol,GyroRolPN);
  177.                         GyroPit=GyroCompe(GyroPit,GyroPitPN);
  178.                         GyroYaw=GyroCompe(GyroYaw,GyroYawPN);
  179.                         
  180.                         //Sum integral value with return
  181.                         //帶回歸計算積分值               
  182.                         GyroRolI=GyroIntegral(GyroRolI,GyroRol);
  183.                         GyroPitI=GyroIntegral(GyroPitI,GyroPit);
  184.                         GyroYawI=GyroIntegral(GyroYawI,GyroYaw);
  185.                
  186.                         //Light LED
  187.                         //點亮LED表示在工作中
  188.                          LED0_ON();
  189.                 }
  190.         }
  191. }

  192. //###############################################
  193. //
  194. //   Axis signal mixer
  195. //   計算電機(jī)輸出信號
  196. //
  197. void AxisMixer(void)
  198. {
  199.          int thr,ail,ele,rud;
  200.         
  201.         //Stick exp
  202.         //搖桿指數(shù)
  203.         if(BITTST(SoftSet,SOFT_EXP))
  204.         {
  205.                  //Rudder do not need exp
  206.                  thr=StickExp(RxThr);
  207.                  ail=StickExp(RxAil)/2;
  208.                  ele=StickExp(RxEle)/2;
  209.         }
  210.         else
  211.         {
  212.                  thr=RxThr;        
  213.                  ail=RxAil/4;
  214.                  ele=RxEle/4;
  215.         }        
  216.                
  217.         //Add gyro to adjustment
  218.         //將陀螺儀信號累加到調(diào)節(jié)量上
  219.         ail+=GainAdj(GyroRol,GainRol)+GainAdj(GyroRolI,GainPit);
  220.         ele+=GainAdj(GyroPit,GainRol)+GainAdj(GyroPitI,GainPit);
  221.         rud=RxRud/4+GainAdj(GyroYaw,GainYaw);//+GainAdj(GyroYawI,GainPit);

  222.         if(AxisMode==AXIS_CROSS)
  223.         {
  224.                  // + Mode 十字模式
  225.                 //       1  
  226.                 //     3 + 2
  227.                 //       4        
  228.                  Motor1=MotorLimitValue(thr - ele + rud);
  229.                  Motor2=MotorLimitValue(thr - ail - rud);
  230.                  Motor3=MotorLimitValue(thr + ail - rud);
  231.                  Motor4=MotorLimitValue(thr + ele + rud);
  232.         }
  233.         else
  234.         {
  235.                  // X Mode X模式
  236.                 //     1   2
  237.                 //       X
  238.                 //     3   4
  239.                  Motor1=MotorLimitValue(thr + ail - ele + rud);
  240.                  Motor2=MotorLimitValue(thr - ail - ele - rud);
  241.                  Motor3=MotorLimitValue(thr + ail + ele - rud);
  242.                  Motor4=MotorLimitValue(thr - ail + ele + rud);
  243.         }
  244. }

  245. //###############################################
  246. //
  247. //   Main routine
  248. //   主程序
  249. //
  250. void main(void)
  251. {        
  252.          Init();                                    //Board init 初始化系統(tǒng)
  253.         PpmWaitSignal();        //Wait rx signal, led will flash 等待接收機(jī)的信號,等待時LED閃爍
  254.         Setup();                        //Load & Adjust parameters 加載&調(diào)節(jié)參數(shù)
  255.         
  256.         //Main loop 主循環(huán)
  257.          LED0_OFF();
  258.         while(1)
  259.         {               
  260.                 TimerRst();
  261.                         CaclAttitude();        //Caculate plane attitude 計算飛行器姿態(tài)        
  262.                 TimerTo(1000);
  263.                                 
  264.                 //Do something between MotorControlBegin() and MotorControlEnd
  265.                 //See functions declaration, can not exceed 1000us
  266.                 //在MotorControlBegin()和MotorControlEnd()之間干點事兒,注意不要超過1000us
  267.                 MotorControlBegin();        //Output head of ppm signal 輸出PPM信號的頭部分
  268.                         PpmReadSignal();        //Read rx 讀取接收機(jī)信號 140us
  269.                         if(RxThr<RxThrLow)        //If thr shutdown 如果油門關(guān)閉
  270.                         {        
  271.                                 GyroGainRead();                //Read gain 讀取感度電位器 670us               
  272.                                 ArmingRoutine();        //Arm/disarm 加鎖解鎖測試 5us
  273.                         }
  274.                         else
  275.                         {
  276.                                 AxisMixer();                //Cacl motor signal 計算電機(jī)信號 305us
  277.                         }               
  278.                         
  279.                         //If locked(arm) or no gyro base, shutdown all motor
  280.                         //如果處于鎖定態(tài)或者陀螺儀基準(zhǔn)未建立,關(guān)閉所有馬達(dá)
  281.                         if(InLock || GyroBaseCnt || RxThr<5)
  282.                         {
  283.                                   Motor1=Motor2=Motor3=Motor4=0;
  284.                         }               
  285.                         //MOTOR6_L();                        //I use it for test execute period 我用來觀察執(zhí)行時間的               
  286.                 MotorControlEnd();                //Output whole ppm signal 輸出完整的PPM信號
  287.         }
  288. }

  289. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
KK_C_V100_M88.rar (20.32 KB, 下載次數(shù): 151)
回復(fù)

使用道具 舉報

ID:252798 發(fā)表于 2018-3-16 14:14 | 顯示全部樓層
雖然剛開始學(xué)習(xí),但很喜歡飛行器和平衡車!樓主發(fā)的是好資源!頂起!
回復(fù)

使用道具 舉報

ID:283655 發(fā)表于 2019-7-8 23:34 | 顯示全部樓層
樓主太強(qiáng)了!請問樓主是在哪找到的鴨?最近想做二軸,想學(xué)習(xí)一下KK的代碼~
回復(fù)

使用道具 舉報

ID:362900 發(fā)表于 2019-7-9 10:44 | 顯示全部樓層
感謝樓主無私分享啊!!!
回復(fù)

使用道具 舉報

ID:609185 發(fā)表于 2020-1-3 18:01 | 顯示全部樓層
非常感謝你

回復(fù)

使用道具 舉報

ID:609185 發(fā)表于 2020-1-3 18:01 | 顯示全部樓層
非常感謝
回復(fù)

使用道具 舉報

ID:698113 發(fā)表于 2020-2-25 17:20 | 顯示全部樓層
非常感謝
回復(fù)

使用道具 舉報

ID:505599 發(fā)表于 2020-3-7 18:13 | 顯示全部樓層
非常好,嘗試一下
回復(fù)

使用道具 舉報

ID:20373 發(fā)表于 2020-6-3 23:31 | 顯示全部樓層
感謝樓主無私分享啊!
回復(fù)

使用道具 舉報

ID:698113 發(fā)表于 2020-6-20 15:25 | 顯示全部樓層
開始研究下
回復(fù)

使用道具 舉報

ID:701385 發(fā)表于 2020-6-21 21:33 來自手機(jī) | 顯示全部樓層
收藏了,留個足跡
回復(fù)

使用道具 舉報

ID:159157 發(fā)表于 2020-11-20 16:17 | 顯示全部樓層
試試看 很感興趣
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲欧美精品一区 | 国产精品久久久精品 | 91视频大全| 免费一级大片 | 午夜久久久 | 亚洲精品在线视频 | 成人在线免费观看 | 精品久久精品 | 欧美精品中文字幕久久二区 | 天堂在线中文 | 亚洲免费在线 | 欧美美女爱爱视频 | 亚洲精品视频在线看 | 999久久久| 亚洲a视频| 国产精品a一区二区三区网址 | 一区二区三区国产在线观看 | 日韩a在线| 久草久 | 99久视频 | 欧美日韩国产精品一区 | 成人性视频免费网站 | 欧美一区成人 | 国产精品电影在线观看 | 欧美自拍另类 | 看av网址 | 综合一区二区三区 | 国产欧美精品一区二区色综合朱莉 | 日韩欧美第一页 | 深夜福利影院 | 欧美在线观看免费观看视频 | 97国产在线观看 | 久久99精品久久久 | 久久爱黑人激情av摘花 | 在线免费看黄 | 成人一区二区在线 | 少妇一区二区三区 | 亚洲欧美中文日韩在线 | av免费在线播放 | 国产精品18hdxxxⅹ在线 | 中文字幕黄色大片 |