注册 登录
查看: 827|回复: 8

DMA脉冲计数遇见的问题,求助!

[复制链接]
发表于 2014-2-19 15:19:35 | 显示全部楼层 |阅读模式
本帖最后由 笑失风 于 2014-2-19 15:24 编辑
  1. #include    "include.h"
  2. #include    "common.h"


  3. volatile uint8  pit_flag = 0;
  4. //volatile uint32 dma_int_count = 0;
  5. extern uint8 pit_count;
  6. /*
  7. void DMA_CH0_Handler(void)
  8. {
  9.    
  10.     DMA_IRQ_CLEAN(DMA_CH0);                             //清除通道传输中断标志位    (这样才能再次进入中断)
  11.     DMA_EN(DMA_CH0);                                    //使能通道CHn 硬件请求      (这样才能继续触发DMA传输)
  12. }
  13. */

  14. void PIT0_IRQHandler()
  15. {
  16.     pit_count++;
  17.     pit_flag = 1;               //标记进入PIT中断
  18.     PIT_Flag_Clear(PIT0);       //清中断标志位
  19.     PIT_MCR = 0;  // add for correcting PIT bug
  20. }
问题如下:
              我用的是K60芯片,现在用两个编码器,out分别接PTB1、PTB19,串口输出两个编码器的脉冲值count1(PTB1输入值)、count2(PTB19输入值),只转动其中一个编码器的齿轮(另一个编码器放置不动)看输出的数值,发现count2总是等于两倍的count1,转另一个编码器,之前转动的放置不动,现象还是一样,为什么啊?

不好意思 main()在下面

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2014-2-19 15:20:32 | 显示全部楼层
  1. void  main(void)
  2. {
  3.     //LCD_Init();
  4.    
  5.     //LCD_P6x8Str(0,0, "Pulse NUM:");
  6.    // LCD_P6x8Str(0,1, "FTM FREQ: 300");
  7.    
  8.     //FTM_PWM_init(FTM2, FTM_CH0, 500, 50);
  9.     DMA_count_Init(DMA_CH0, PTB19, 0x7FFF, DMA_falling_keepon);  //PTB19 接 编码器out
  10.     DMA_count_Init(DMA_CH1, PTB1, 0x7FFF, DMA_falling_keepon);  //PTB1 接 编码器out
  11.     pit_init_ms(PIT0, 1000);
  12.    
  13.     //set_vector_handler(DMA0_VECTORn , DMA_CH0_Handler);
  14.     set_vector_handler(PIT0_VECTORn, PIT0_IRQHandler);
  15.    
  16.     enable_irq(PIT0_IRQn);
  17.    
  18.    
  19.     while(1)
  20.     {
  21.         if( pit_flag > 0 )                          /*   1 秒中断了  */
  22.         {
  23.             count1 = DMA_count_get(DMA_CH0);
  24.             count2 = DMA_count_get(DMA_CH1);
  25.             DMA_count_reset(DMA_CH0);
  26.             DMA_count_reset(DMA_CH1);
  27.             printf("读取脉冲1:%d个\n", count1);     //读取间隔1秒的脉冲次数
  28.             printf("读取脉冲2:%d个\n", count2);     //读取间隔1秒的脉冲次数
  29.             //LCD_Change_Str(64, 0, count, 3);
  30.            // dma_int_count = 0;
  31.             pit_flag = 0;                                //清空pit中断标志位
  32.         }      
  33.     }
回复 支持 反对

使用道具 举报

发表于 2014-2-19 15:29:38 | 显示全部楼层
请求源都是接PTB端口,所以两个计数都是一起计数,由于计数时间的差异,所以计数值就有差异。
不能都用同一个端口
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-19 15:33:57 | 显示全部楼层
山外メ雲ジ 发表于 2014-2-19 15:29
请求源都是接PTB端口,所以两个计数都是一起计数,由于计数时间的差异,所以计数值就有差异。
不能都用同一 ...

这样啊,刚才试了一下PTA19、PTB1,问题果然解决了,那么有没有什么办法可以在同一个端口进行两个计数呢?该不会要进行延时吧?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-19 15:42:58 | 显示全部楼层
还是用两个端口分别计数比较好
回复 支持 反对

使用道具 举报

发表于 2014-2-19 15:43:37 | 显示全部楼层
笑失风 发表于 2014-2-19 15:33
这样啊,刚才试了一下PTA19、PTB1,问题果然解决了,那么有没有什么办法可以在同一个端口进行两个计数呢? ...

同一时间是不能这样做的,本身k60内部DMA请求是这样定死了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-19 15:50:11 | 显示全部楼层
山外メ雲ジ 发表于 2014-2-19 15:43
同一时间是不能这样做的,本身k60内部DMA请求是这样定死了。

原来如此,多谢!多谢!
回复 支持 反对

使用道具 举报

发表于 2014-2-20 18:54:55 | 显示全部楼层
强烈支持,非常感谢哥们
回复 支持 反对

使用道具 举报

发表于 2014-3-21 12:52:01 | 显示全部楼层
山外メ雲ジ 发表于 2014-2-19 15:29
请求源都是接PTB端口,所以两个计数都是一起计数,由于计数时间的差异,所以计数值就有差异。
不能都用同一 ...

请问一下,目前我用K60搭的硬件,一路编码器采用正交解码,另一路采用DMA脉冲计数,行得通吗?另外正交解码是不是同时占用两个管脚,给两个输入信号,占用一个FTM模块?
回复 支持 反对

使用道具 举报

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

本版积分规则

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