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

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 1943|回复: 16
打印 上一主题 下一主题

有关KK_C源码油门校调部分请教gale兄!

[复制链接]
跳转到指定楼层
楼主
发表于 2012-7-1 18:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序段取自F_setup.c文件中void SetupThrTravel(void)函数。


有两个问题暂未明白,希望gale兄不吝指教。

1. 校调油门时,为什么要把最终输出给电调的频率控制在50Hz(周期2ms)左右?

      油门校调的过程,我个人理解,就是让电调获知并记忆油门杆在最高和最低时的高电平时长,我想应该和信号频率关系不大(只要是电调工作可接受的频率范围内别太离谱就行),那么,此时飞控板要做的事就是,直接把接收机的信号转手递给电调就好了,保证高电平时长是不变的,哪怕动一点信号频率也无大碍。
      我实测了一下Futaba R617FS 接收机输出的信号频率大约为62Hz(周期约16ms),XCopter V2.5固件下KK飞控板解锁后输出信号频率约为486Hz(周期约2.05ms)。于是,我的问题就是,为什么KK_C里面要特意将传递给电调的信号频率控制在50Hz上?

2. 既然是50Hz,为啥要延时16ms呢?

      不知道我分析得对不对啊,如有不正确之处还请指点,我看程序里MotorControlBegin()要做的事是拉高电平,MotorControlEnd()则是先让电平保持住1ms,然后再开始决定哪个电机上的电平该降下来,用125次判断,每次8us延时,以决定后1ms里电平究竟还要保持多长,总共一对Begin End函数应该是消耗了2ms时间,那么16+2=18ms啊,另外2ms在哪被用到了呢?

再次感谢gale!也欢迎广大模友赐教和讨论!

[ 本帖最后由 pbjacob 于 2012-7-1 18:20 编辑 ]

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

沙发
发表于 2012-7-1 18:35 | 只看该作者
16ms只是来打酱油的
50hz是为了通用所有电调,不管支持不支持高速ppm
3
发表于 2012-7-1 18:37 | 只看该作者
不delay while(1)的周期太短了吧
4
 楼主| 发表于 2012-7-1 18:43 | 只看该作者
原帖由 crazyboyyy 于 2012-7-1 18:37 发表
不delay while(1)的周期太短了吧

但是它delay的时间加上前面输出信号的时间也凑不够20ms啊
5
发表于 2012-7-1 18:53 | 只看该作者
原帖由 pbjacob 于 2012-7-1 18:43 发表

但是它delay的时间加上前面输出信号的时间也凑不够20ms啊


还有程序运行时间啊,亲
6
发表于 2012-7-1 18:54 | 只看该作者
尤其是往EEPROM写的延时
7
 楼主| 发表于 2012-7-1 19:07 | 只看该作者
原帖由 crazyboyyy 于 2012-7-1 18:54 发表
尤其是往EEPROM写的延时


这一部分延时应该也包含进End函数里的1000us中了吧,它要是慢了,后面的信号传递就全错了。
8
发表于 2012-7-1 19:13 | 只看该作者
原帖由 pbjacob 于 2012-7-1 19:07 发表


这一部分延时应该也包含进End函数里的1000us中了吧,它要是慢了,后面的信号传递就全错了。

是EEWriteB()这个函数的延时
这个延时只在存油门最低值的时候出现 对主循环没影响
9
 楼主| 发表于 2012-7-1 19:57 | 只看该作者
原帖由 crazyboyyy 于 2012-7-1 19:13 发表

是EEWriteB()这个函数的延时
这个延时只在存油门最低值的时候出现 对主循环没影响


但是校准就会出问题了。

我不认为这个延时会额外占用Begin和End之间所用的2ms时间,因为它会被End中的1000us计时器给兜住。
亦或这50Hz只是个虚的数,在那附近(小于)就好。反正对于电调来说没有太大关系。
10
发表于 2012-7-1 21:39 | 只看该作者
void MotorControlEnd(void)
{               
        uchar Cnt;
         
        //Wait until 1000us
        TimerTo(1000);
        TimerRst();
        
        //8us per cycle
        for(Cnt=0;Cnt<125;Cnt++)
        {
                 if(Cnt>Motor1)          MOTOR1_L();
                else                          MOTOR1_H();
                if(Cnt>Motor2)          MOTOR2_L();
                else                          MOTOR2_H();
                if(Cnt>Motor3)          MOTOR3_L();
                else                          MOTOR3_H();
                if(Cnt>Motor4)          MOTOR4_L();
                else                          MOTOR4_H();
               
                //Patch cycle to 8us
                TimerTo(8);
                TimerRst();
        }
        
        MOTOR1_L();
        MOTOR2_L();
        MOTOR3_L();
        MOTOR4_L();
}

我觉得这块begin和end的功能是,begin将四个电调的信号拉到高电平,end则首先保证延时1ms满足ppm脉宽最小1ms的要求,然后在最大2ms的脉冲宽度内,根据motorX的数值来适时的把某个电机电平拉低,从而实现一个完整PPM波形。1ms的脉冲宽度的分辨率是8us,也就是分了125个刻度。
11
发表于 2012-7-1 21:45 | 只看该作者
void EEWriteB(uint uiAddress, uchar ucData)
{
        /* 等待上一次写操作结束 */
        while(EECR & (1<<EEWE));

        /* 设置地址和数据寄存器 */
        EEAR = uiAddress;
        EEDR = ucData;
        
        /* 置位EEMWE */
        EECR |= (1<<EEMWE);

        /* 置位EEWE以启动写操作 */
        EECR |= (1<<EEWE);
        
        WDR();
}
这段肯定是占时间了

[ 本帖最后由 crazyboyyy 于 2012-7-1 21:47 编辑 ]
12
发表于 2012-7-1 21:57 | 只看该作者
给电调校准的信号貌似会有所变形啊
高电平被拉长了一点
至于16ms应该是从示波器看的,不是计算出的精确值
13
发表于 2012-9-7 18:01 | 只看该作者
有关KK_C源码
14
发表于 2013-7-3 01:42 | 只看该作者
一年前的帖子,仍值得好好学习
15
发表于 2013-7-12 16:11 | 只看该作者
KK_C适用于什么接收机啊

16
发表于 2013-7-15 16:38 | 只看该作者
请教楼主一个问题哦,楼主说“油门校调的过程,我个人理解,就是让电调获知并记忆油门杆在最高和最低时的高电平时长”,但是这段程序是怎么实现这个功能的呢?
17
发表于 2013-7-15 16:45 | 只看该作者
Dragonboy 发表于 2013-7-3 01:42
一年前的帖子,仍值得好好学习

请问一下,您能够理解这部分的内容吗?
我想求教一下:
thrmin=120;
while(1)
{
  MotorControlBegin(); //Output head of ppm signal 输出PPM信号的头部分
   PpmReadSignal(); //Read rx 读取接收机信号
   Motor1=Motor2=Motor3=Motor4=MotorLimitValue(RxThr);//Transfer 直通 0~125
   if(thrmin>RxThr)
   {
     thrmin=RxThr;
    EEWriteB(EE_THRLOW,thrmin);//#define EE_THRLOW  0X24
   }
  MotorControlEnd();  //Output whole ppm signal 输出完整的PPM信号
   
   LED0_TOG();          //LED flash to indicate cali LED闪烁表示校准中
  Delay1ms(16);   //Make about 50Hz ppm freq 形成约50Hz PPM频率
}

它实行油门校准的原理是什么呢,主要是往寄存器里面写这个thrmin有什么意义呢,理解不了。。。

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

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

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