打印

旋转编码器计数完要如何才能得到转速和显示啊?

[复制链接]
7604|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
namefull|  楼主 | 2009-4-26 13:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这是前辈给的计数程序 基本看懂了  可是不知道怎么才能把测速和显示的程序加进去。。转向我是用触发器鉴相

帮忙看看原题图右何问题。
用中断测完脉冲后 如何才能得到转速啊
我把我的硬件图贴上来 还有计数的程序
麻烦大家帮我看看 如何加进来。
这个是代码:

//******************************************************************************
// 旋转编码器脉冲计数程序,在8051上通过外部中断0实现
// 特别说明:适应于旋转编码器脉冲频率较低的场合(对于12MHz晶体,大致可以支持 4KHz
//           以下的旋转编码器脉冲频率),若旋转编码器脉冲频率更高,建议采用计数器
//           T0和T1分别实现正反向计数,此时一般需要附加少量外部电路的配合
// 以下代码仅供参考,由此产生的任何后果,本人不承担任何责任
//******************************************************************************
#include "reg51.h"

long counter=0;                      //旋转编码器的脉冲计数值,左转为正,右转为负
void main()
{
  IT0 = 1;                                                 //外部中断0为边沿触发
  EX0 = 1;                                                       //使能外部中断0
  EA  = 1;                                                            //使能中断
  while(1)
  {
    //                在这里写代码实现你想做的事,比如计数值的进一步处理等等等等
  }
}

//******************************************************************************
// 延时函数delay(unsigned char dly)
// 延时值与晶体频率有关,可以自己调整变量x的值以取得合适的单位延时值
//******************************************************************************
void delay(unsigned char dly)
{
  unsigned int x;
  while(dly--)
  {
    x = 1000;
    while(x--);
  }
}

//******************************************************************************
// 外部中断0的中断处理函数void ISR0()
// 注意:旋转编码器的A接P3.2,B接P1.7(跟你图上一样不变)
//******************************************************************************
void ISR0()   interrupt 0
{
   if((P1&0x80) == 0x80)
   {
     delay(10); //消抖动,延时一会,确认P1.7仍然为高,如果频率比较高,延时要缩短
     if((P1&0x80) == 0x80)
       counter++;
   }
   else
   {
     delay(10); //消抖动,延时一会,确认P1.7仍然为低,如果频率比较高,延时要缩短
     if((P1&0x80) == 0x00)
     counter--;
   }
}

相关帖子

沙发
李冬发| | 2009-4-26 15:01 | 只看该作者

哪有在中断里这样消抖的?

使用特权

评论回复
板凳
ayb_ice| | 2009-4-26 16:56 | 只看该作者

看来LZ对51不熟

if((P1&0x80) == 0x80)这样的语句都出来了

使用特权

评论回复
地板
namefull|  楼主 | 2009-4-26 23:32 | 只看该作者

呵呵

呵呵 
这个程序本来就是论坛上有人发的。 楼上的,那个语句具体错到哪里了啊 ~

我也是贴出来的  我现在不知道怎么把脉冲计数才能转换成转速。
我这里的编码器是500个脉冲式1圈

使用特权

评论回复
5
高勇| | 2009-4-27 08:40 | 只看该作者

楼主已经了脉冲的积分数据

楼主你的中断程序目的就是旋转编码器的积分量。即:counter的数值。转速就是此量的微分即:△counter/△t。

使用特权

评论回复
6
gaohq| | 2009-4-27 09:39 | 只看该作者

if((P1&0x80) == 0x80)

if((P1&0x80) == 0x80)  这个P1是P1口啊,不能这样写的吧.

使用特权

评论回复
7
hanbing0898| | 2021-7-9 15:36 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

21

帖子

0

粉丝