注册 登录
查看: 119|回复: 3

使用双FTM模块测两个电机遇到的问题

[复制链接]
发表于 2019-3-9 18:34:33 | 显示全部楼层 |阅读模式
我们小组同时使用FTM1和FTM2同时接收两个电机反馈线的反馈脉冲,利用输入捕捉和定时中断进行测速。但是发现用单个FTM模块测单个电机的时候是准确的(这一点已经过外接512编码器的确认,确实是准确的),而用两个FTM模块分别同时测两个电机的话测量结果就会突然增大(几十倍的那种)。经过试验,我们断开了另外一个电机的反馈线和PWM线的连接,只保留了电源和接地的线,关于第二个电机的代码也从程序中注释掉了,然而并没有什么用。我们将另一个电机从车模上拆下,使两个电机相距超过30cm后进行测试,情况无改善,应该和两电机霍尔编码器之间的相互干扰无关。卡在这个问题上快一个星期了,跪求大神支招。

回复

使用道具 举报

 楼主| 发表于 2019-3-9 18:36:45 | 显示全部楼层
代码如下:
int cnvtime1 = 0;                //输入捕捉值
int cnvtime2 = 0;                //输入捕捉值

void FTM1_INPUT_IRQHandler(void);        //FTM1中断服务函数
void FTM2_INPUT_IRQHandler(void);        //FTM1中断服务函数

void PIT0_IRQHandler(void)
{
          int a;
          int b;
         
          FTM_IRQ_DIS(FTM1,FTM_CH0);
          FTM_IRQ_DIS(FTM2,FTM_CH1);
  
          a=cnvtime1*2.4  ;
          b=cnvtime2*2.4;
         
            printf("\n1捕捉到频率为:%d\n2捕捉到频率为:%d\n\n",a,b);//bus_clk_khz*1000/(1<<FTM_PS_2)/cnvtime);

            //等需要采集脉冲的时候,就开中断,过一段时间就可以获取到相应的值
            cnvtime1 = 0;
            cnvtime2 = 0;

            FTM1_STATUS = 0x00;            //清中断标志位
            FTM_IRQ_EN(FTM1,FTM_CH0);
            
            FTM2_STATUS = 0x00;            //清中断标志位
            FTM_IRQ_EN(FTM2,FTM_CH1);

   
    PIT_Flag_Clear(PIT0);       //清中断标志位
}


void main(void)
{  
   ftm_input_init  (FTM1, FTM_CH0,FTM_Falling,FTM_PS_1);
   ftm_input_init  (FTM2, FTM_CH1,FTM_Falling,FTM_PS_1);
   set_vector_handler(FTM1_VECTORn ,FTM1_INPUT_IRQHandler);
   set_vector_handler(FTM2_VECTORn ,FTM2_INPUT_IRQHandler);
   
   pit_init_ms(PIT0, 100);                                //初始化PIT0,定时时间为: 100ms
   set_vector_handler(PIT0_VECTORn ,PIT0_IRQHandler);     //设置PIT0的中断服务函数为 PIT0_IRQHandler
   
   set_irq_priority(FTM1_IRQn,3);
   set_irq_priority(FTM2_IRQn,2);
   set_irq_priority(PIT0_IRQn,1);
   
   ftm_pwm_init(FTM0, FTM_CH1,25*1000,80);  //初始化PWM输出,FTM0的CH1通道,频率为25K,占空比80%
   ftm_pwm_init(FTM0, FTM_CH2,25*1000,80);  //初始化PWM输出,FTM0的CH1通道,频率为25K,占空比80%   
   ftm_pwm_duty(FTM0,FTM_CH1,60);       //改变占空比 ,K60 输出 PWM 占空比 逐渐增大,电机逐渐 降速
   ftm_pwm_duty(FTM0,FTM_CH2,60);       //改变占空比 ,K60 输出 PWM 占空比 逐渐增大,电机逐渐 降速
    enable_irq (FTM1_IRQn);
    enable_irq (FTM2_IRQn);
    enable_irq (PIT0_IRQn);                                 //使能PIT0中断
    while(1)
    {
        
    }
}


void FTM1_INPUT_IRQHandler(void)
{
    uint8 s = FTM1_STATUS;          //读取捕捉和比较状态  All CHnF bits can be checked using only one read of STATUS.
    uint8 CHn;
    FTM1_STATUS = 0x00;
    CHn = 0;
    if( s & (1 << CHn) )
    {
        /*     用户任务       */
      
          cnvtime1++;
   
        /*********************/
    }
}

void FTM2_INPUT_IRQHandler(void)
{
    uint8 s = FTM2_STATUS;          //读取捕捉和比较状态  All CHnF bits can be checked using only one read of STATUS.
    uint8 CHn;
    FTM2_STATUS = 0x00;
    CHn = 1;
    if( s & (1 << CHn) )
    {
        /*     用户任务       */
      
          cnvtime2++;
   
        /*********************/
    }
}

回复 支持 反对

使用道具 举报

发表于 2019-3-10 12:26:48 | 显示全部楼层
2个FTM代码,但只接一个电机和编码器,看看是否准确
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-10 18:25:40 | 显示全部楼层
山外メ雲ジ 发表于 2019-3-10 12:26
2个FTM代码,但只接一个电机和编码器,看看是否准确

正确。但是问题已经解决了,是硬件的问题。稳压模块我们用的是开关稳压,对电机内部的反馈线造成了干扰。我们直接采用了12V电池供电,反馈的数值就相当准确了。总之,谢谢山外哥的回答。
回复 支持 反对

使用道具 举报

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

本版积分规则

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