注册 登录
查看: 1053|回复: 10

【KL26】【编码器】小白路过有好些问题要想哭了

[复制链接]
发表于 2014-5-24 13:03:42 | 显示全部楼层 |阅读模式

1,既然可以在TPM_CLKIN 那个引脚输入,TPM1.TPM2分配的四个引脚是做什么用的?

2,编码器 有A OUT, B OUT,这两个输出脉冲是一样的,,,,,为什么要用两个,这两个线在其他地方有应用么?

3,编码器是要累加之后才能算速度的是吧
  pit_delay_ms(PIT0,1000);                                //利用 PIT 延时时间,LPTMR模块进行 计算,累加 FTM 产生的PWM脉冲


如果这个编码器累加是在中断里的,那这个中断是不是要很长时间。如果不是这样,那怎么解决这个速度采集问题?

4,我在把山外哥KL26库代码改成这样了
  1. void main()
  2. {
  3.     uint16 count1,count2;

  4.     printf("\n*****TPM 脉冲计数 测试*****\n");

  5.     tpm_pwm_init(TPM0, TPM_CH0,100,0);      //初始化 PWM
  6.    
  7.    
  8.     tpm_pulse_init(TPM_L,TPM_CLKIN0,TPM_PS_1); //初始化 TPM2 为脉冲累加,输入管脚为 TPM_CLKIN0_PIN ,分频系数为 1
  9.     tpm_pulse_init(TPM_R,TPM_CLKIN1,TPM_PS_1);
  10.     while(1)
  11.     {
  12.      //   tpm_pulse_clean(TPM2);                                  //清空脉冲计数器计算值(马上清空,这样才能保证计数值准确)
  13.        //tpm_pulse_clean(TPML);
  14.         pit_delay_ms(PIT0,1000);                                //利用 PIT 延时时间,LPTMR模块进行 计算,累加 FTM 产生的PWM脉冲

  15.           count1   =  tpm_pulse_get(TPM_R);  
  16.         count2   =  tpm_pulse_get(TPM_L);                         //保存脉冲计数器计算值

  17.         printf("LPTMR脉冲计数为:%d     %d\n",   count1,  count2);                 //打印计数值
  18.     }
  19. }
竟然还能在串口输出数值,和不改一样

那么 tpm_pulse_get(); 里面的这个TPM是个什么?如果get的只是一个变量,还是从TPM1模块里GET?  TPM1,2 不是用于输出pwm的么?
回复

使用道具 举报

 楼主| 发表于 2014-5-24 13:47:56 | 显示全部楼层
还有,山外哥,例程里的初始化 PTM0是做什么用的?这不就是把电机初始化了?

TPM_CLKIN0 和 TPM1 有什么关系? TPM模块就三个,那这个TPM_CLKIN 是做什么用的?
回复 支持 反对

使用道具 举报

发表于 2014-5-24 13:54:03 | 显示全部楼层
坐等山外出手
回复 支持 反对

使用道具 举报

发表于 2014-5-24 13:54:04 | 显示全部楼层
TPM 他可以输出 PWM ,他同样可以外部获取时钟 TPM_CLKIN 里获取时钟。

输出PWM和获取的时钟管脚是不同的,我们用于脉冲计数的时候,实际上就是把脉冲当作时钟,数一下多少个脉冲
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-24 15:20:00 | 显示全部楼层
Admin 发表于 2014-5-24 13:54
TPM 他可以输出 PWM ,他同样可以外部获取时钟 TPM_CLKIN 里获取时钟。

输出PWM和获取的时钟管脚是不同的 ...

山外哥可能忙去了
回复 支持 反对

使用道具 举报

发表于 2014-5-24 15:32:12 | 显示全部楼层
TPM,他有时钟输入管脚和信号输出管脚。
脉冲计数就是用到他的时钟输入管脚。
PWM就用到他的信号输出管脚
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-24 16:21:25 | 显示全部楼层
山外メ雲ジ 发表于 2014-5-24 15:32
TPM,他有时钟输入管脚和信号输出管脚。
脉冲计数就是用到他的时钟输入管脚。
PWM就用到他的信号输出管脚

那山外哥,时钟输入管脚就是 TPM_CLKIN啦? 然后用TPM1,2 两个模块 脉冲计数?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-24 16:22:16 | 显示全部楼层
Admin 发表于 2014-5-24 13:54
TPM 他可以输出 PWM ,他同样可以外部获取时钟 TPM_CLKIN 里获取时钟。

输出PWM和获取的时钟管脚是不同的 ...

这样的话,TPM 累加的时候是在中断里么?
回复 支持 反对

使用道具 举报

发表于 2014-5-24 16:24:11 | 显示全部楼层
kongqijin 发表于 2014-5-24 16:21
那山外哥,时钟输入管脚就是 TPM_CLKIN啦? 然后用TPM1,2 两个模块 脉冲计数?

是的,每个模块选择不同的时钟输入管脚,就可以同时脉冲计数。
累加是不会触发中断的,由硬件累加的。

用了脉冲计数后,由于时钟已经是非标准的,所以不能再用于PWM输出,否则PWM输出的信号是不准的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-24 17:00:49 | 显示全部楼层
山外メ雲ジ 发表于 2014-5-24 16:24
是的,每个模块选择不同的时钟输入管脚,就可以同时脉冲计数。
累加是不会触发中断的,由硬件累加的。
...

那山外哥你看这程序
void GetMotorPulse (void)
{
//tpm_pwm_init(TPM0, TPM_CH0,1000,0);      //初始化 PWM
   tpm_pulse_init(TPM1,TPM_CLKIN0,TPM_PS_1); //初始化 TPM2 为脉冲累加,输入管脚为 TPM_CLKIN0_PIN ,分频系数为 1      
    tpm_pulse_init(TPM2,TPM_CLKIN1,TPM_PS_1);                     
         //  tpm_pulse_clean(TPM2);                                  //清空脉冲计数器计算值(马上清空,这样才能保证计数值准确)  main函数中 使用此函是会导致电机反应慢
         //  tpm_pulse_clean(TPM1);
  pit_delay_ms(PIT0,1000);                                //利用 PIT 延时时间,LPTMR模块进行 计算,累加 FTM 产生的PWM脉冲

         g_nLeftMotorPulseSigma  =  tpm_pulse_get(TPM1);  
         g_nRightMotorPulseSigma  = tpm_pulse_get(TPM2);                         //保存脉冲计数器计算值
}   


官方例程里是吧速度采集放在中断里的,那您以前这个 初始化TPM0就不需要了,
PIT延时注释掉的时候,速度就采集不到了,但是加上之后,电机就不动了
回复 支持 反对

使用道具 举报

发表于 2015-2-3 10:32:05 | 显示全部楼层
kongqijin 发表于 2014-5-24 17:00
那山外哥你看这程序

官方例程里是吧速度采集放在中断里的,那您以前这个 初始化TPM0就不需要了,

楼主还在么,想问一下

//  tpm_pulse_clean(TPM2);                                  //清空脉冲计数器计算值(马上清空,这样才能保证计数值准确)  main函数中 使用此函是会导致电机反应慢


导致电机反应慢是什么意思啊
回复 支持 反对

使用道具 举报

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

本版积分规则

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