打印

如何确定电机转速测量范围?求助!

[复制链接]
1749|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
harjol|  楼主 | 2013-5-26 11:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在书上看到的红外线转速仪的程序,想知道如何确定转速测量的范围。求高手相助!
//ICC-AVR application builder : 2007-9-20 10:30:53
// Target : m16
// Crystal: 8.0000Mhz
#include <iom16v.h>
#include <macros.h>
#include "head.h"
#define uchar unsigned char
#define uint unsigned int
#define xtal 8
extern void WaitForEnable(void);
extern void LcdWriteData(uchar W);
extern void LcdWriteCommand(uchar CMD,uchar Attribc);
extern void InitLcd(void);
extern void Display(uchar dd);
extern void DisplayOneChar(uchar x,uchar y,uchar Wdata);
extern void ePutstr(uchar x,uchar y,uchar const *ptr);
  
uchar Start=0,WorkFlag;
uint WorkTime,DisTime,Counter;
uint DisVal;
uint cnt;
uchar Flag,IntFlag,JS=0;
uint tx,cx;
uint disx[4];
uchar DisFlag=1,EndFlag,BeginFlag=0;
const uchar cs0[]={"ShangHai"};//欢迎界面
const uchar cs1[]={"-Tester-"};//欢迎界面
const uchar cs2[]={"Testing-"};//测试界面
const uchar dsp[]={"RPM:    "};//测试界面
//TIMER2 initialize - prescale:64
// WGM: Normal
// desired value: 1mSec
// actual value:  1.000mSec (0.0%)
void timer2_init(void)
{
TCCR2 = 0x00; //stop
ASSR  = 0x00; //set async mode
TCNT2 = 0x83; //setup
OCR2  = 0x7D;
TCCR2 = 0x04; //start
}
void port_init(void)
{
PORTA = 0x00;
DDRA  = 0xFF;
PORTB = 0x00;
DDRB  = 0xFF;
PORTC = 0x00; //m103 output only
DDRC  = 0x00;
PORTD = 0xFF;
DDRD = 0xFF;
DDRD  = 0x63;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer2_init();
MCUCR = 0x01;
GICR  = 0x40;
TIMSK = 0x40; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
/**********************欢迎界面********************/
void display1(void)
{
LcdWriteCommand(0x01,1); //清屏,检测忙信号
ePutstr(0,0,cs0);
ePutstr(0,1,cs1);
}
void display2(void)
{
LcdWriteCommand(0x01,1); //清屏,检测忙信号
ePutstr(0,0,cs2);
ePutstr(0,1,dsp);
}
//****************************************
void Delay_1ms(void)  //1mS延时子函数
{ uint i;
for(i=1;i<(uint)(xtal*124);i++)
    ;
}
//=============================================
void Delay_nms(uint n)  //n*1mS延时子函数
{
uint i=0;
   while(i<n)
   {Delay_1ms();WDR();
    i++;
   }
}
/**********************主函数*****************************/
void main(void)
{ uchar temp;
    float count,time,x;
Delay_nms(400);
init_devices();
InitLcd();
display1();    //显示Test界面
Delay_nms(2000);
display2();     //显示Work状态
DisFlag=1;
      
/********************************************/
  while(1)               //无限循环
  {  WDR();
      
      if(DisFlag==1)//如果显示标志为1
      {
      time=(float)tx;count=(float)cx;
      x=count/time;x=x*30000;DisVal=(uint)x;//数学计算
      
      disx[3]=(DisVal/1000)%10;disx[2]=(DisVal/100)%10;
      disx[1]=(DisVal%100)/10;disx[0]=DisVal%10;
      DisplayOneChar(4,1,disx[3]+0x30);//显示数据
      DisplayOneChar(5,1,disx[2]+0x30);
      DisplayOneChar(6,1,disx[1]+0x30);
      DisplayOneChar(7,1,disx[0]+0x30);
      DisFlag=0;WorkTime=0;DisTime=0;EndFlag=0;
      Start=0;cnt=0;
   }
   else    //否则进行取样
   {     
   do{temp=PIND&0x04;WDR();JS=1;//等待下降沿后下一次测试
       if(Counter>1500){Counter=0;JS=0;DisFlag=1;cx=0;goto END;}
     }
    while(temp==0x04);
      BeginFlag=1;Start=1;GICR=0x40;//重开INT0
   END:;   
   }
  }
}     
#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void)
{
TCNT2 = 0x83; //reload counter value
SEI();
if(BeginFlag==1)
  {
   DisTime++;
   if(DisTime>1300){DisFlag=1;DisTime=0;BeginFlag=0;} //开显示
  }
   if(Start==1){WorkTime++;}
   if(WorkTime==1000){EndFlag=1;}
   if(JS==1)Counter++;
   
}
#pragma interrupt_handler int0_isr:2
void int0_isr(void)
{
uchar y;
SEI();
//external interupt on INT0
  y=PIND&0x04;
  JS=0;Counter=0;
  if((Start==1)&&(y==0x00))cnt++;
  //**********************
  if((Start==1)&&(y==0x04))
  {  
     cnt++;
     if(EndFlag==1){tx=WorkTime;cx=cnt;EndFlag=0;
      Start=0;GICR=0x00;}//关闭INT0中断
  }

}

相关帖子

沙发
zhangmangui| | 2013-5-26 13:40 | 只看该作者
你的意思是如何测试电机转速是吧  在电机选择的时候可以考虑带光电编码器的  也可以在电机上自己安装   也可以用霍尔传感器

使用特权

评论回复
板凳
harjol|  楼主 | 2013-5-26 13:43 | 只看该作者
zhangmangui 发表于 2013-5-26 13:40
你的意思是如何测试电机转速是吧  在电机选择的时候可以考虑带光电编码器的  也可以在电机上自己安装   也 ...

我用的是光电传感器,就是想知道这个能测量到的转速是否有上限值,存不存在转速太快捕捉不到的问题。

使用特权

评论回复
地板
zhangmangui| | 2013-5-26 14:02 | 只看该作者
harjol 发表于 2013-5-26 13:43
我用的是光电传感器,就是想知道这个能测量到的转速是否有上限值,存不存在转速太快捕捉不到的问题。 ...

我说的光电编码器里面其实就是一个光电开关   我曾经用过一个编码器  转一圈可以输出15000个脉冲   所以具体范围我不太清楚  但是我们使用的一般速度是达不到他的上限的

使用特权

评论回复
5
dirtwillfly| | 2013-5-26 19:44 | 只看该作者
本帖最后由 dirtwillfly 于 2013-5-26 19:45 编辑
harjol 发表于 2013-5-26 13:43
我用的是光电传感器,就是想知道这个能测量到的转速是否有上限值,存不存在转速太快捕捉不到的问题。 ...

一般都能测量到吧。常见的电机一般在几百或者几千转/每分钟。
模型电机能到几万转/分钟。

使用特权

评论回复
6
tyw| | 2013-5-26 19:56 | 只看该作者
本帖最后由 tyw 于 2013-5-26 19:58 编辑

能不能测,看你的cpu能否来得及响应及处理.
电机转速越高,光电编码器的输出脉宽就越窄,你自已可以计算一下,假定光电编码器每转输出100个脉冲,那么当转速为1000转/分时,脉宽就出来了,当转速为10000转/分时,脉宽缩小10倍,在这个脉宽条件下,你的系统能响应吗?中断响应来得及,那么中断服务来得及运算处理吗?

使用特权

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

本版积分规则

2

主题

9

帖子

0

粉丝