关于霍尔测速的问题

2019-03-24 18:32发布

本人刚学单片机不久,想用霍尔传感器41F(开关型)测下电机速度为以后做准备。我的硬件部分已没问题,现在说说程序的问题。我将信号输出接到单片机P3^5即T1口,用T0作定时器,T1作计数器,在一定时间内计数霍尔元件产生的脉冲,从而得到速度。下面是我的程序:
#include<reg51.h>#define uchar unsigned char
#define uint unsigned int
#define led P1
sbit dula=P2^6;         //U1寄存器
sbit wela=P2^7;        //U2寄存器
uint z=0;            
uint code table[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
    0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};                                                                  
  uint data  chushi=600;                                                                                                                  
  //====================================================
  void init(void)           //定义名为init的初始化子函数
  {                    //init子函数开始,分别赋值
   TMOD=0X51;            //GATE  C/T  M1  M0  GATE  C/T  M1  M0  计数器T1 定时器T                //  0     1   0   1    0     0   0   1
   TH1=0;                //计数器T1初始值
   TL1=0;
   TH0=(65536-50000)/256;    //定时器t0  定时50ms
   TL0=(65536-50000)%256;     
   EA=1;                       // IE=0X00;     //EA  -  ET1  ES  ET1  EX1  ET0  EX0
   ET0=1;                                     // 1  0    0   0    0    0      1   0
   TR1=1;
   TR0=1;
   }
   //=============================================
   void delay(uint k)        //延时程序
   {
            uint  i,j;
           for(i=0;i<k;i++)
            
         for(j=0;j<110;j++);
         
   }

//================================================
  void display(uint numdis)
{
    uint m,n,s,k;
    m=numdis/1000;
    n=numdis%1000/100;
        s=numdis%100/10;
        k=numdis%10;
    dula=1;
        P0=table[m];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfe;
        wela=0;
        delay(2);

        dula=1;
        P0=table[n];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xfd;
        wela=0;
        delay(2);

              dula=1;
        P0=table;
       dula=0;
        P0=0xff;
        wela=1;
        P0=0xfb;
        wela=0;
        delay(2);

        dula=1;
        P0=table[k];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0xf7;
        wela=0;
        delay(2);
}                             //数码管显示函数
   //=========================================
   void main(void)                 //主程序开始
   {       led=0xff;
            init();
           while(1)
           {   
                   z=(TH1<<8)+TL1;
               display(z);
        
           }
                             //无限循环语句,等待中断
         }                                                        
//===================================================
void time(void)        interrupt 1 using 0
{        
         
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        chushi--;
        if(chushi<=0)     
     {
            led=~led;  // LED以周期1分钟闪烁,作为指示灯
            TH1=0;
            TL1=0;                 //清零计数器
            chushi=600;         //50ms*600=30s
          }
         
           
}
通过实验,我观察到每次计数到4000左右便清零,我想问下这4000多是不是一分钟计数?还有是不是马达每转一周就产生一个脉冲?另外,我想通过按键来查询上一次最后计数是四千几,或者通过延时来读出准确数值。哪位大神能帮忙解决下,小弟不胜感激! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
xuyiyi
1楼-- · 2019-03-25 01:50
 精彩回答 2  元偷偷看……
xuyiyi
2楼-- · 2019-03-25 05:10
至于马达每转一周就产生一个脉冲?

这由你的硬件决定,假如你只用一个霍尔元件且马达旋转轴上只装一块单极性磁铁,那么马达每转一周就产生一个脉冲。
xuyiyi
3楼-- · 2019-03-25 11:04
如果你在马达旋转轴上装了一块多极性磁铁,那么马达每转一周就可能产生数个脉冲,脉冲数由你装的磁铁极数决定。
xuyiyi
4楼-- · 2019-03-25 15:33
 精彩回答 2  元偷偷看……
youluo
5楼-- · 2019-03-25 20:44
不错。顶一个。
电学之光
6楼-- · 2019-03-26 00:38
我的这个可以测,我观察了下是每转一周产生一个脉冲,半分钟总计大概4000左右(我用的6V电压,小马达型号不知道,好像是飞思卡尔用的)但是最后清零太快了,我希望能准确读到最后的数值,或者通过按键查询,这是不是要涉及中断套中断?

一周热门 更多>