Proteus实现编码器电机转速及方向检测
程序员文章站
2022-06-11 16:02:40
...
原理图
控制编码电机采用的是最简单的开关控制正反电压的输入,滑动变阻器控制电机转速,也可以采用数字IC去控制电机转速以及方向,如L298N电机驱动芯片。
代码
/* 名称:直流电机测速
说明:数码管显示的正反转状态与转速值应与motor encode器件上显示的值基本一致;
测量误差 ≤1RPM 。
*/
#include<reg51.h>
#include<intrins.h>
sbit duan = P2^0;
sbit wei = P2^1;
sbit flag = P3^0; //正反转标志位
unsigned char code mtable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77};
unsigned char code LED_W[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char data mnumber[]={0,0,0,0,0,0}; //显示的符号与速度
unsigned int data mcount=0; //脉冲数
unsigned int data mtime=0;
float cspeed=0; //当前速度
float prespeed=0;
void display(float mspeed);
void main()
{
//**********设置定时器T0工作方式和定时时间**********//
TMOD =0X01; //
TH0 =0X3C;
TL0 =0XB0;
//**************************************************//
ET0=1; //允许T0产生中断
IT0=1; //外部中断0(P3.2)为边沿触发
EX0=1; //允许外部中断0产生中断
TR0=1; //启动T0
EX0=1; //允许外部中断0产生中断
EA=1; //开总中断
while(1)
{
display(cspeed);
}
}
void display(float mspeed)
{
unsigned int temp_speed;
unsigned char i,j=30,mindex;
if ((mspeed>prespeed)||(mspeed<prespeed))
{
prespeed=mspeed;
mspeed=mspeed*10;
temp_speed=mspeed;
mnumber[1]=temp_speed/10000;
mnumber[2]=(temp_speed%10000)/1000;
mnumber[3]=(temp_speed%1000)/100;
mnumber[4]=(temp_speed%100)/10;
mnumber[5]=temp_speed%10;
}
for(i=0;i<6;i++){
P0=0;
duan=1; duan=0;
P0=LED_W[i];
wei=1; wei=0;
if(i>0)
{
mindex=mnumber[i];
P0=mtable[mindex]; //显示数字
if(i==4) P0=mtable[mindex]+0x80; //显示小数点
}
else
{
//**********电机正反转的判断与显示**********//
if(flag==1) //反转-
{
P0=0x40;
}
else P0=0x00; //正转0
//******************************************//
}
duan=1;
duan=0;
while(j--);
}
}
//**********外部中断计脉冲数**********//
void int_0() interrupt 0
{
mcount++;
}
//************************************//
//**********脉冲采样周期定时**********//
void timer0() interrupt 1
{
ET0=0;
mtime++;
if(mtime==20) //定时时间
{
cspeed =(60*mcount)/(24*0.05*mtime); //根据采样周期内产生的脉冲数,计算转速
mcount=0; //cspeed是采用编码器转速公式得出
mtime=0;
}
TH0=0X3C ;
TL0=0xB0 ; //重装初值
ET0=1;
}
//************************************//
上一篇: PHP中if和or运行效率对比