大神帮看看这个程序是怎么计数脉冲的,能测方波脉冲吗?

[复制链接]
1243|1
 楼主| 孟孟 发表于 2014-9-10 20:33 | 显示全部楼层 |阅读模式


  1. #include <reg51.h>
  2. #include "51uart.h"


  3. //角度结算时间
  4. int HXA_CALC_TIMES = 1000;

  5. sbit A_PORT = P2^7;
  6. sbit B_PORT = P2^6;

  7. bit A_LAST_STATE;
  8. bit B_LAST_STATE;


  9. //脉冲计算
  10. #define HXA_Pluse_Get_A()    (A_LAST_STATE^A_PORT)
  11. #define HXA_Pluse_Fresh_A()  (A_LAST_STATE = A_PORT)
  12. #define HXA_Pluse_Get_B()    (B_LAST_STATE^B_PORT)
  13. #define HXA_Pluse_Fresh_B()  (B_LAST_STATE = B_PORT)


  14. //脉冲统计
  15. #define TIMER_COUNT (6000)


  16. int PluseBCountOld;
  17. int PluseBCount;
  18. int PluseBCountTimer;

  19. #define HXA_Pluse_Fresh_OLD_B() (PluseBCountOld = PluseBCount)
  20. #define HXA_Pluse_B_HAS_COUNT() (PluseBCountOld!= PluseBCount)
  21. #define HXA_Pluse_Fresh_TIMER() (PluseBCountTimer = TIMER_COUNT)
  22. #define HXA_Pluse_Fresh_SUB_TIMER() (--PluseBCountTimer < 0 ? 0 : PluseBCountTimer)
  23. #define HXA_Pluse_Fresh_TIMER_OUT() (PluseBCountTimer == 0)


  24. int dir;


  25. //XHA 状态
  26. #define XHA_SENDING 1
  27. #define XHA_WAIT 0

  28. int XHA_Status = XHA_WAIT;

  29. int main()
  30. {

  31.         BYTE Count = 0;
  32.         uartInit(BAUD_9600);

  33.         SendString("system Init!\n");

  34.     HXA_Pluse_Fresh_A();
  35.     HXA_Pluse_Fresh_B();
  36.         HXA_Pluse_Fresh_OLD_B();
  37.         HXA_Pluse_Fresh_TIMER();

  38.         PluseBCount        = 0;


  39.         P2=P2|(0x30);
  40.         while(1)
  41.         {

  42. /*---------------------------对光电编码器进行计数-----------------------------------------*/
  43.                    dir = -1;

  44. //------------------------A脉冲------------------------------------------
  45.                    if(HXA_Pluse_Get_A())
  46.                    {
  47.                                    //上升沿
  48.                                 if(A_PORT == 1 && B_PORT == 1)
  49.                                 {
  50.                                          dir = 1;
  51.                                         ++PluseBCount;
  52.                                 }
  53.                                 else if(A_PORT == 1 && B_PORT == 0)
  54.                                 {
  55.                                         dir = 0;
  56.                                         --PluseBCount;
  57.                                 }

  58.                                 //下降沿
  59.                                 if(A_PORT == 0 && B_PORT == 0)
  60.                                 {
  61.                                          dir = 1;
  62.                                         ++PluseBCount;
  63.                                 }
  64.                                 else if(A_PORT == 0 && B_PORT == 1)
  65.                                 {
  66.                                         dir = 0;
  67.                                         --PluseBCount;
  68.                                 }


  69.                                 HXA_Pluse_Fresh_TIMER();

  70.                                 HXA_Pluse_Fresh_A();

  71.                                 continue;
  72.                    }
  73.                    else
  74.                    {
  75.                                 HXA_Pluse_Fresh_SUB_TIMER();       
  76.                    }

  77. //-------------------------------B脉冲------------------------------------
  78.                    if(HXA_Pluse_Get_B())
  79.                    {
  80.                                 //上升沿
  81.                                 if(B_PORT == 1 && A_PORT == 0)
  82.                                 {
  83.                                          dir = 1;
  84.                                         ++PluseBCount;
  85.                                 }
  86.                                 else if(B_PORT == 1 && A_PORT == 1)
  87.                                 {
  88.                                         dir = 0;
  89.                                         --PluseBCount;
  90.                                 }

  91.                                 //下降沿
  92.                                 if(B_PORT == 0 && A_PORT == 1)
  93.                                 {
  94.                                          dir = 1;
  95.                                         ++PluseBCount;
  96.                                 }
  97.                                 else if(B_PORT == 0 && A_PORT == 0)
  98.                                 {
  99.                                         dir = 0;
  100.                                         --PluseBCount;
  101.                                 }


  102.                                 HXA_Pluse_Fresh_TIMER();

  103.                                 HXA_Pluse_Fresh_B();

  104.                                 continue;
  105.                    }
  106.                    else
  107.                    {
  108.                                 HXA_Pluse_Fresh_SUB_TIMER();       
  109.                    }


  110. //--------------外接P2^4,P^5作为测试led        ---------------------               
  111.                         if(dir == 1)
  112.                         {
  113.                                 P2=P2&~(0x20);
  114.                                   P2=P2|0x10;
  115.                         }
  116.                         else  if(dir == 0)
  117.                         {
  118.                                 P2=P2&~(0x10);
  119.                                   P2=P2|0x20;
  120.                         }
  121.                         else
  122.                         {
  123.                                 P2=P2&~(0x30);
  124.                         }


  125. //--------------- 串口发送模块------------------------------------
  126.                         if(HXA_Pluse_Fresh_TIMER_OUT())
  127.                         {
  128.                                 XHA_Status = XHA_SENDING;
  129.                                 HXA_Pluse_Fresh_TIMER();
  130.                         }
  131.                         else
  132.                         {
  133.                                 XHA_Status = XHA_WAIT;
  134.                                 continue;
  135.                         }

  136.                         if(XHA_Status == XHA_SENDING && PluseBCount!=0)
  137.                         {

  138.                                    Count =  PluseBCount>=0?0:0xFF;
  139.                                 SendData(Count);

  140.                                 if(PluseBCount<0)
  141.                                 {
  142.                                         PluseBCount = 0 - PluseBCount;
  143.                                 }

  144.                                 Count =  (PluseBCount>>16)&0xff;
  145.                                 SendData(Count);

  146.                                 Count =  (PluseBCount>>8)&0xff;
  147.                                 SendData(Count);

  148.                                 Count =  PluseBCount&0xff;
  149.                                 SendData(Count);


  150.                                 PluseBCount = 0;
  151.                         }


  152.                        
  153.         }
  154. }
leiwen 发表于 2014-9-10 20:47 | 显示全部楼层
本帖最后由 leiwen 于 2014-9-10 20:57 编辑

HXA_Pluse_Get_A() 每次等于1的时候,就表示来了一次上升沿,那么脉冲数就加1。从while(1)循环的语句能看出来,每次方向为1时,脉冲数加1,方向为0时,脉冲数减1。

  •                    if(HXA_Pluse_Get_A())
  •                    {
  •                                    //上升沿
  •                                 if(A_PORT == 1 && B_PORT == 1)
  •                                 {
  •                                          dir = 1;
  •                                         ++PluseBCount;
  •                                 }
  •                                 else if(A_PORT == 1 && B_PORT == 0)
  •                                 {
  •                                         dir = 0;
  •                                         --PluseBCount;
  •                                 }

  • #define HXA_Pluse_Get_A()    (A_LAST_STATE^A_PORT)
至于HXA_Pluse_Get_A()为1时,为何可以表示脉冲,从这句话可以理解出来。这个宏定义表明两路速度信号做异或处理,即得到了HXA_Pluse_Get_A()的值。而码盘的两路信号是正交的信号,做异或处理时,可以得两倍频的脉冲信号。因此这里的计数脉冲是实际脉冲的两倍

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

本版积分规则

4

主题

10

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部