3323|2

90

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

关于电机测速问题 急求...... [复制链接]

最近在做一个直流电机测速模块     测速采用红外对管,将电机的叶轮置于红外对管之间,叶轮转过,挡住对管,产生中断,给单片机,从而实现计数,进而计算出电机的速度。  下面是测速程序:

 

 

 void init0()  //定时器0,外部中断0的初始化
{
   TMOD=0x01;      //设置定时器T0工作在方式1下
   TH0=(65536-50000)/256;  //置初值
   TL0=(65536-50000)%256;
   EA=1;     //开总中断
   ET0=1;     //开定时器T1中断
   EX0=1;     //开外部中断
   IT0=1;     //设置外部中断为下降沿触发
   TR0=1;     //开定时器

}


void INT0_0() interrupt 0      //外部中断0的中断函数
{
  speed_sd++;


 }             


void T0_time() interrupt 1   //定时器T0的中断函数
{
  EA=0;
  TR0=0;
  TH0=(65536-50000)/256;
  TL0=(65536-50000)%256;
  time++;
  if(time==10)
  {
    time=0;
    speed=speed_sd;
   speed_sd=0;
  }
  EA=1;
  TR0=1;
}

 


 void cesu()
 {
    
 speed=speed*2;
 bai=speed/100;
 shi=speed%100/10;
    ge=speed%10;
  
 
    display(0x03,bai);
    display(0x04,shi);
    display(0x05,ge);
 }

 


 /*********************************************************************************

   主函数
*********************************************************************************/
 
  void main()   //主函数
 {    init0();
   while(1)
   {
     if(con==0)
       cesu();
   }
 
 }

 

 

 

 

显示是通过1602显示的   显示程序是正确的所以没贴    0.5S更新一次数据      测试的时候显示数据变的很快 稳定不了  请大家帮我看看有什么问题没?  很急.....还有问一下  一般的那种5V直流电机当加5V电压时转速为多少???    哪位大哥有做过本题目的请教下你们的方法  有没有什么更好的方法.......

 

 

 


 

此帖出自单片机论坛

最新回复

首先你要验证一下你的程序对不对,方法很简单,用一定的频率去遮住对管记下次数然后看和单片机处理的结果对吗?如果采集的数据是对的话,可以以一定的频率采集,然后采集回来的数据进行虑波处理,然后把处理后的数据更新显示……  详情 回复 发表于 2011-12-20 16:49
点赞 关注
 

回复
举报

535

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
首先你要验证一下你的程序对不对,方法很简单,用一定的频率去遮住对管记下次数然后看和单片机处理的结果对吗?如果采集的数据是对的话,可以以一定的频率采集,然后采集回来的数据进行虑波处理,然后把处理后的数据更新显示……
此帖出自单片机论坛
 
 

回复

90

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

回复 沙发 小小白 的帖子

我做过了 , 脉冲经滤波,放大,整形出来后我用示波器看过 脉冲整形出来很好 幅度也够......我单写了个计数的程序 验证了这一块没问题的 我之前第一次写的程序显示没什么问题 显示数据也很稳定 就是计数跟脉冲数不一致 拿第一次写的程序测出来5V的直流电机每秒的转速能达到200多转 肯定有问题了 个人感觉不可能这么快 下面是第一次的程序:
void init0() //定时器0,外部中断0的初始化
{
TMOD=0x01; //设置定时器T0工作在方式1下
TH0=(65536-50000)/256; //置初值
TL0=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //开定时器T1中断
EX0=1; //开外部中断
IT0=1; //设置外部中断为下降沿触发
TR0=1; //开定时器

}


void INT0_0() interrupt 0 //外部中断0的中断函数
{
speed++;


}


void T0_time() interrupt 1 //定时器T0的中断函数
{
EA=0;
TR0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if(time==20)
{
time=0;
t1=1;
}
EA=1;
TR0=1;
}




void cesu()
{
if(t1==1)
{ t1=0;
speed=speed*2;
bai=speed/100;
shi=speed%100/10;
ge=speed%10;
speed=0;


display(0x03,bai);
display(0x04,shi);
display(0x05,ge);
}
}



/*********************************************************************************

主函数
*********************************************************************************/

void main() //主函数
{ init();
init0();
while(1)
{

if(con==0)
{cesu();}
}

}

 

 

 

 

一时间很想不明白,,,,呵呵     请指教......

此帖出自单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表