智能车制作

标题: 野火库 LPT计数 有点问题一直突破不了 [打印本页]

作者: 寒窗乍暖    时间: 2013-4-1 14:26
标题: 野火库 LPT计数 有点问题一直突破不了
如题,用野火的库进行函数操作,在测速时选用了野火例程上的那种方法:
lptmr_counter_init(LPT0_ALT2,INT_COUNT,2,LPT_Rising);                                            //初始化脉冲计数器,用LPT0_ALT2,即PTC5输入,
      //每隔INT_COUNT产生中断,延时2个时钟滤波,上升沿触发

我的INT_COUNT设定为10,在LPT中断中对jishu++,
然后再在PIT中断里读取jishu,并清零
定时时间设定的是5ms,读取结果还算准确,后来细想这种方法有点不妥,相当于每十个脉冲就要进一次LPT中断,这样会不会很耗费资源,既然LPT能计算出我要比较的那个INT_COUNT,那么可不可以让LPT直接计数,然后再在PIT中断中读取清零呢,今天细看了一下相关内容,没有找到很好的方法,在野火库里找到了这些:
#define LPTMR0_CSR                               LPTMR_CSR_REG(LPTMR0_BASE_PTR)
#define LPTMR0_PSR                               LPTMR_PSR_REG(LPTMR0_BASE_PTR)
#define LPTMR0_CMR                               LPTMR_CMR_REG(LPTMR0_BASE_PTR)
#define LPTMR0_CNR                               LPTMR_CNR_REG(LPTMR0_BASE_PTR)

#define LPTMR0_BASE_PTR                          ((LPTMR_MemMapPtr)0x40040000u)
我以为是K60将采集的脉冲数放到了内部地址0x40040000u中了,用J-link调试时发现确实有变化,却不稳定,看不太明白,我应该怎么将这个数读出呢。
之后在论坛里看到有人发了官方例程,他是将 a_cur=LPTMR0_CNR;  这样读出来的是不是脉冲数呢,求解各位指点小菜一下。

作者: ☆_。寒泉..+    时间: 2013-4-1 15:35
当然是啊,但是为了安全INT_COUNT设为60000就会比较稳妥,因为定时时间很短,测速用嘛。所以永远也不会进入LTP中断,也没必要进,反正你计数也不会超过65535,我的16ms 512线编码器最快才返回1000多的数值,
作者: Y__man    时间: 2013-4-1 19:30
☆_。寒泉..+ 发表于 2013-4-1 15:35
当然是啊,但是为了安全INT_COUNT设为60000就会比较稳妥,因为定时时间很短,测速用嘛。所以永远也不会进入 ...

那我想问一下 那个PIT0_IRQHandler中断里该怎么写啊  是不是 关定时器中断 计数  开定时器中断啊  就是那个关中断 和开中断是什么啊 怎么写啊 可以发个底层看看么 纠结了~~ 拜谢

作者: 寒窗乍暖    时间: 2013-4-1 20:12
☆_。寒泉..+ 发表于 2013-4-1 15:35
当然是啊,但是为了安全INT_COUNT设为60000就会比较稳妥,因为定时时间很短,测速用嘛。所以永远也不会进入 ...

我也是这么想的,但是我在PIT中断中应该怎么把这个数读出来呢,换句话说,这个数存在哪了呢,我一直很困惑,邪神哥,帮我分析一下好吧

作者: ☆_。寒泉..+    时间: 2013-4-2 13:43
LPTMR0_CNR直接读,然后清零
作者: ☆_。寒泉..+    时间: 2013-4-2 13:46
Y__man 发表于 2013-4-1 19:30
那我想问一下 那个PIT0_IRQHandler中断里该怎么写啊  是不是 关定时器中断 计数  开定时器中断啊  就是那 ...

你可以看看野火的教程啊,上面写的很清楚,开关中断是enable_irq(x);x是中断向量号-16

作者: Y__man    时间: 2013-4-2 23:15
☆_。寒泉..+ 发表于 2013-4-2 13:46
你可以看看野火的教程啊,上面写的很清楚,开关中断是enable_irq(x);x是中断向量号-16

那 PIT0的中断向量号是-16?  我看X 貌似都是正数啊
作者: 野火    时间: 2013-4-3 08:14
Y__man 发表于 2013-4-2 23:15
那 PIT0的中断向量号是-16?  我看X 貌似都是正数啊

PIT0的中断向量号 -16
PIT0 的中断向量号是 84 ,即 84 - 16


作者: Y__man    时间: 2013-4-3 20:43
野火 发表于 2013-4-3 08:14
PIT0的中断向量号 -16
PIT0 的中断向量号是 84 ,即 84 - 16

谢谢火哥 支持火哥
作者: jifadage11    时间: 2013-4-7 17:06

作者: Y__man    时间: 2013-4-8 20:00
野火 发表于 2013-4-3 08:14
PIT0的中断向量号 -16
PIT0 的中断向量号是 84 ,即 84 - 16



火哥  求助  按照你教程里的操作 LPT 为什么最后出来的脉冲值是0个那?我PTC5和PTA8短接了啊


37. #define INT_COUNT 100 //LPT 产生中断的计数次数
38. void main(void)
39. {
40. u16 count;
41.
42. DisableInterrupts; //禁止总中断
43.
44. FTM_PWM_init(FTM1,CH0,100,50);
45. //FTM 模块产生PWM,用 FTM1_CH0 ,即 PTA8 ,频率为 100
46.
47. lptmr_counter_init(LPT0_ALT2,INT_COUNT,2,LPT_Rising);
48. //初始化脉冲计数器,用LPT0_ALT2,即PTC5 输入,
49. //每隔INT_COUNT 产生中断,延时2 个时钟滤波,上升沿触发
50. EnableInterrupts; //开总中断
51.
52. while(1)
53. {
54. if( LPT_INT_count > 0 )
55. {
56. count = LPTMR0_CNR; //保存脉冲计数器计算值
57. lptmr_counter_clean();
58. //清空脉冲计数器计算值(马上清空,这样才能保证计数值准确)
59. printf("LPT 产生一次中断啦:%d\n",LPT_INT_count*INT_COUNT + count);
60. //打印计数值
61. LPT_INT_count = 0; //清空LPT 中断次数
62. }
63. }

作者: 野火    时间: 2013-4-9 10:04
Y__man 发表于 2013-4-8 20:00
火哥  求助  按照你教程里的操作 LPT 为什么最后出来的脉冲值是0个那?我PTC5和PTA8短接了啊

LPTMR ,是直接用我们的例程?没经过修改的?


作者: Y__man    时间: 2013-4-9 10:12
野火 发表于 2013-4-9 10:04
LPTMR ,是直接用我们的例程?没经过修改的?

LPT 脉冲计数中断实验 这个例程   原例程输不出来数 把if( LPT_INT_count > 0 )这句去掉 能输出来数 但累加的脉冲是0个[attach]43406[/attach]例程就是这个  PTA8和PTC5短接了
作者: 野火    时间: 2013-4-9 10:18
Y__man 发表于 2013-4-9 10:12
LPT 脉冲计数中断实验 这个例程   原例程输不出来数 把if( LPT_INT_count > 0 )这句去掉 能输出来数 但累 ...

你用示波器测测 PWM 有没有输出


作者: Y__man    时间: 2013-4-9 10:34
野火 发表于 2013-4-9 10:18
你用示波器测测 PWM 有没有输出

火哥 可以出图的
作者: Y__man    时间: 2013-4-13 20:23
☆_。寒泉..+ 发表于 2013-4-2 13:46
你可以看看野火的教程啊,上面写的很清楚,开关中断是enable_irq(x);x是中断向量号-16

你的野火教程是哪个啊?能不能分享一份啊 952641879@qq.com  拜谢

作者: ☆_。寒泉..+    时间: 2013-4-14 10:45
Y__man 发表于 2013-4-13 20:23
你的野火教程是哪个啊?能不能分享一份啊 952641879@qq.com  拜谢

到处都是啊,你搜一下就行了 在论坛里

作者: 541236895    时间: 2013-4-16 21:36
能具体说一下你实验后,具体输出什么吗?比如说:LPT 产生一次中断啦: 100.等




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2