注册 登录
查看: 613|回复: 13

KL26 编码器计数问题

[复制链接]
发表于 2014-6-13 13:01:23 | 显示全部楼层 |阅读模式
我搜过论坛里的帖子。。好像大家都遇到了这个问题

我在编码器技术上也遇到了这个问题

我用的TPM脉冲计数。。用的例程然后用串口看的数据为0。。但是调试的时候看count是有值的

我还有一个疑问就是TPM_CLKIN0和TPM_CLKIN1是不是分别属于TPM1和TPM2这两个模块的?

之前用的K60正交解码一点问题都没有。。然后换了KL26就卡在编码器这里了。。

求各路大神相助!
回复

使用道具 举报

 楼主| 发表于 2014-6-13 13:01:43 | 显示全部楼层
打错了。。是编码器计数。。。
回复 支持 反对

使用道具 举报

发表于 2014-6-13 13:57:48 | 显示全部楼层
kl26没有正交解码功能 如果你需要双向测速 你可以使用外部解码芯片、jk触发器、d触发器来进行外部解码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-14 17:57:53 | 显示全部楼层
a61115 发表于 2014-6-13 13:57
kl26没有正交解码功能 如果你需要双向测速 你可以使用外部解码芯片、jk触发器、d触发器来进行外部解码

我想问关于TPM_CLKIN0和TPM_CLKIN1是不是分别属于TPM1和TPM2这两个模块的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-14 17:58:19 | 显示全部楼层
有没有人啊!
回复 支持 反对

使用道具 举报

发表于 2014-6-14 18:55:28 | 显示全部楼层
抢沙发~给哥们顶一个
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-14 19:06:30 | 显示全部楼层
〤_ㄝ↖ 发表于 2014-6-14 18:55
抢沙发~给哥们顶一个

谢谢啊!KL26计数一直出不来!都急死了
回复 支持 反对

使用道具 举报

发表于 2014-6-16 12:58:38 | 显示全部楼层
害虫 发表于 2014-6-14 19:06
谢谢啊!KL26计数一直出不来!都急死了

TPM_CLKIN0和TPM_CLKIN1 不是分别属于TPM1和TPM2这两个模块

而是可以选择绑定到 TPM0、TPM1、TPM2上。例如TPM_CLKIN0 绑定到 TPM2 上都行
回复 支持 反对

使用道具 举报

发表于 2014-6-16 12:59:07 | 显示全部楼层
害虫 发表于 2014-6-14 19:06
谢谢啊!KL26计数一直出不来!都急死了

先用我们的例程,按照操作,看看有没有数据出。编码器是开漏输出的,必须接上拉电阻的哦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-18 11:53:59 | 显示全部楼层
山外メ雲ジ 发表于 2014-6-16 12:59
先用我们的例程,按照操作,看看有没有数据出。编码器是开漏输出的,必须接上拉电阻的哦

是不是putchar的代码有问题。。调试的时候看到编码器是能采集到数据的。。但是串口看不到
而且TPM_CLKIN1的数据好像不太对
回复 支持 反对

使用道具 举报

发表于 2014-6-18 12:08:51 | 显示全部楼层
害虫 发表于 2014-6-18 11:53
是不是putchar的代码有问题。。调试的时候看到编码器是能采集到数据的。。但是串口看不到
而且TPM_CLKIN ...

直接用我们的例程,看看行不行?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-18 20:19:00 | 显示全部楼层
山外メ雲ジ 发表于 2014-6-18 12:08
直接用我们的例程,看看行不行?

直接用例程串口看不到数据
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-24 00:55:38 | 显示全部楼层
山外メ雲ジ 发表于 2014-6-18 12:08
直接用我们的例程,看看行不行?

KL26编码器数值还是出不来。。串口助手出来一直是0。。硬件确定没问题。。。
我把代码发出来帮忙看下号码?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-24 00:56:27 | 显示全部楼层
山外メ雲ジ 发表于 2014-6-18 12:08
直接用我们的例程,看看行不行?

#include "common.h"
#include "include.h"

int count_left, count_right;

//上位机协议
void Serial_Hunter(int ch1,int ch2,int ch3)
{
    int i;
    while(!(UART_S1_REG(UARTN[UART1]) & UART_S1_TDRE_MASK));
    UART_D_REG(UARTN[UART1]) = 0xA5;   
    for(i=0;i<2;i++)
    {
      while(!(UART_S1_REG(UARTN[UART1]) & UART_S1_TDRE_MASK));
      UART_D_REG(UARTN[UART1]) = (ch1>>((i)*8)&0xff);
    }
   
    for(i=0;i<2;i++)
    {   
      while(!(UART_S1_REG(UARTN[UART1]) & UART_S1_TDRE_MASK));
      UART_D_REG(UARTN[UART1]) = (ch2>>((i)*8)&0xff);
    }

    for(i=0;i<2;i++)
    {
      while(!(UART_S1_REG(UARTN[UART1]) & UART_S1_TDRE_MASK));
      UART_D_REG(UARTN[UART1]) = (ch3>>((i)*8)&0xff);
    }
}

//串口发送函数
void Send_date(void)
{
    int  A,B;
    A=(int) count_left;
    B=(int) count_right;
    //C=(int);
    Serial_Hunter(A,B,0);
}

void PIT_IRQHandler(void)
{
  led_turn(LED0);
  
  count_left    =  tpm_pulse_get(TPM1);                         //保存脉冲计数器计算值
  count_right   =  tpm_pulse_get(TPM2);
  
  
  tpm_pulse_clean(TPM1);            //清空脉冲计数器计算值(马上清空,这样才能保证计数值准确)
  tpm_pulse_clean(TPM2);
  
  Send_date();
  
  PIT_Flag_Clear(PIT0);       //清中断标志位   
  
}

void main()
{

    led_init(LED0);
  
    tpm_pulse_init(TPM1,TPM_CLKIN0,TPM_PS_1); //初始化 TPM2 为脉冲累加,输入管脚为 TPM_CLKIN0_PIN ,分频系数为 1
    tpm_pulse_init(TPM2,TPM_CLKIN1,TPM_PS_1);

    pit_init_ms(PIT0, 500);                                 //初始化PIT0,定时时间为: 5ms
    set_vector_handler(PIT_VECTORn ,PIT_IRQHandler);      //设置PIT0的中断服务函数为 PIT0_IRQHandler
    enable_irq (PIT_IRQn);                                //使能PIT0中断
   
   
   
   
    while(1)
      
    {
        
    }
   
}

回复 支持 反对

使用道具 举报

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

本版积分规则

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