这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于用STC8G单片机测量电机转速遇到的问题

共5条 1/1 1 跳转至

关于用STC8G单片机测量电机转速遇到的问题

工程师
2020-12-18 21:36:01     打赏

我最近利用STC单片机STC8G 和 霍尔传感器想测一个电机的实时频率,要求超出规定的18.72Hz,单片机P5^5口就输出高电平,低于18.72Hz就输出低电平,因为电机的频率一直是在变化的,所以直接测霍尔传感器输出的一个脉冲的周期,然后用1秒钟除以这个周期的时间得到频率,现在单片机编程内容如下,但是发现电机频率无论怎么变化,单片机的输出一直是高电平,实在不知道程序错在什么地方,还请大神赐教。单片机频率为12MHz。


#include "stc8g.h"
#include "COMMON.H"

uint int0_count = 0;
uint th0_tl0=0;
float freq =0;
sbit out=P5^5;

void int0_init()
{
  IT0 = 0;            //为 1 是下降沿; 为 0 是低电平
  EX0 = 0;                //为 1 允许中断; 为 0 是禁止中断
}

void t0_init()  //@12MHz
{
    AUXR &= 0x7F;        //定时器时钟12T模式
        TMOD &= 0xF0;        //设置定时器模式
        TL0 = 0x00;                //设置定时初值
        TH0 = 0x00;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        ET0 = 1;                //允许T0中断
        TR0 = 0;                //定时器0停止计时
}

void test()
{
switch(int0_count)
{
  case 1:TR0=1;
  case 2:
  case 3:TR0=0;th0_tl0=TH0*256+TL0;freq=1000000/(float)th0_tl0;TL0=0X00;TH0=0X00;
  default:break;
}
if(freq>18.72)
{out=1;}
else
{out=0;}
}

void main()
{
stc_init();
int0_init();
t0_init();
out=0;
EA=1;
while(1)
{
EX0=1;
test();
}
}

void int0() interrupt 0         
{
if(int0_count>=3)
{int0_count = 0;}
int0_count++;        
}

void t0() interrupt 1
{

}




关键词: STC8G     电机     转速     测量    

工程师
2020-12-18 21:43:28     打赏
2楼

18.72Hz,这么低的频率,测其脉冲宽度可能会更准确点。


工程师
2020-12-18 21:47:07     打赏
3楼

修改成如下看看:

switch(int0_count)
{
  case 1:
   TR0=1;
   break;
  case 2:
   break;
  case 3:
TR0=0;
th0_tl0=TH0*256+TL0;
freq=1000000/(float)th0_tl0;
TL0=0X00;
TH0=0X00;
break;
  default:break;
}

每一个CASE,都要有一个break,不然的话,程序会从第一个CASE运行到最后一个CASE .



工程师
2020-12-18 21:50:26     打赏
4楼

调试程序的时候应该用可调频率发生器代替霍尔传感器吧!


高工
2020-12-18 22:34:24     打赏
5楼

问题还是蛮大的


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]