Ⅰ 用51單片機測電機的轉速,,,,,謝謝各位。。
用一個轉速感測器或者編碼器,利用單片機引腳的脈沖沿捕獲中斷,1個計數器用於記錄2相鄰脈沖捕獲時間間隔,一個計數器用於記錄脈沖數。
然後計算1s時間內脈沖的個數就是頻率啦,再通過換算的電機轉速;
Ⅱ 基於51單片機直流電機調速測速模擬原理
基於51單片機直流電機調速測速模擬原理是以STC90C52RC單片機為主控晶元,利用PWM的原理,通過按鍵對直流電機進行調速,實現正反轉;採用霍爾感測器對直流電機的轉動進行計數,並通過主控晶元將採集到的計數值轉化為直流電機的當前速度值;利用LCD1602顯示模塊將計算得到的值進行實時顯示。
Ⅲ 用51單片機控制直流電動機並測量轉速
我這個是用pwm+adc做的
ADC EQU 35H
CLOCK BIT P2.4 ;定義ADC0808時鍾位
ST BIT P2.5
EOC BIT P2.6
OE BIT P2.7
PWM BIT P3.7
ORG 00H
SJMP START
ORG 0BH
LJMP INT_T0
START: MOV TMOD,#02H ;
MOV TH0,#20
MOV TL0,#00H
MOV IE,#82H
SETB TR0
WAIT: CLR ST
SETB ST
CLR ST ;啟動AD轉換
JNB EOC,$ ;等待轉換結束
SETB OE
MOV ADC,P1 ;讀取AD轉換結果
CLR OE
SETB PWM ;PWM輸出
MOV A,ADC
LCALL DELAY
CLR PWM
MOV A,#255
SUBB A,ADC
LCALL DELAY
SJMP WAIT
INT_T0: CPL CLOCK ;提供ADC0808時鍾信號
RETI
DELAY: MOV R6,#1
D1: DJNZ R6,D1
DJNZ ACC,D1
RET
END
Ⅳ 如何用C51單片機外部中斷測量電機轉速
使用計時器,在產生一個中斷的時候讀取計時器的數值,在下次中斷的時候再次讀取計時器數值,這兩個時間的差就是轉一圈的時間,從而計算出速度。也可以多轉幾圈計算其平均值。
Ⅳ 求51單片機風扇轉速監控程序 C語言
給你個我寫的基於89c52的單片機測頻率的程序,你參考下
#include<reg52.h>
#include<intrins.h>
#include<stdlib.h>
#defineucharunsignedchar
#defineuintunsignedint
#defineLCD_dataP0
sbitLCD_RS=P2^0;
sbitLCD_RW=P2^1;
sbitLCD_EN=P2^2;
sbitLCD_PSB=P2^3;
bitflag=0;
uintnum1=0,num2=0,count=0;
voiddisplay();
voiddelayms(uintx)
{
uinti,j;
for(j=0;j<x;j++)
for(i=0;i<110;i++)
;
}
voidwrite_cmd(ucharcmd) //12864寫命令函數
{
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
P0=cmd;
delayms(5);
LCD_EN=1;
delayms(5);
LCD_EN=0;
}
voidwrite_dat(uchardat) //12864寫數據函數
{
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delayms(5);
LCD_EN=1;
delayms(5);
LCD_EN=0;
}
voidlcd_pos(ucharX,ucharY) //12864寫位置函數
{
ucharpos;
if(X==0)
X=0x80;
elseif(X==1)
X=0x90;
elseif(X==2)
X=0x88;
elseif(X==3)
X=0x98;
pos=X+Y;
write_cmd(pos);
}
voidlcd_init() //12864初始化函數
{
LCD_PSB=1;
write_cmd(0x30);
delayms(5);
write_cmd(0x0c);
delayms(5);
write_cmd(0x01);
delayms(5);
}
voidTime2_Init(void) //T2定時器自動重裝初值定時1s
{
EA=1;
ET2=1;
TR2=1;
RCAP2L=(65535-46083)%256;
RCAP2H=(65535-46083)/256;
}
voiddisplay() //12864顯示函數
{
lcd_pos(0,0);
write_dat(num1/1000+'0');
write_dat(num1/100%10+'0');
write_dat(num1/10%10+'0');
write_dat(num1%10+'0');
lcd_pos(1,0);
write_dat(num2/1000+'0');
write_dat(num2/100%10+'0');
write_dat(num2/10%10+'0');
write_dat(num2%10+'0');
}
main()
{
lcd_init();
Time2_Init();
TMOD=0x55;
TR0=1;
TR1=1;
while(1)
{
TH0=0;
TL0=0;
TH1=0;
TL1=0;
flag=0;
while(!flag);
num1=TH0<<8|TL0; //num1為T0在1s內統計的下降沿次數,輸入引腳為P3.4
num2=TH1<<8|TL1; //num2為T1在1s內統計的下降沿次數,輸入引腳為P3.5
display();
}
}
voidTime2(void)interrupt5 //T2定時器中斷1s
{
TF2=0;
count++;
if(count==20)
{
flag=1;
count=0;
}
}
Ⅵ 51單片機步進電機試驗五(正轉一圈 反轉一圈)轉角由30度改為180度,請幫忙改下
/***********************************************************************************
* 標題褲兄: 步進電機試驗五(正轉一圈 反轉一圈) *
* *
* 通過本常式了解步進馬達使用及驅動程序編寫 *
*; 單雙八拍工作方式: *
*; A-AB-B-BC-C-CD-D-DA (即一個脈沖,轉 3.75 度) *
* *
* 請學員一定要消化掉本常式 *
*
**************************************************************************************/
#include "reg52.h"
void delay(unsigned int t);
//Motor
sbit F1 = P1^0;
sbit F2 = P1^1;
sbit F3 = P1^2;
sbit F4 = P1^3;
unsigned char code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反轉
unsigned char code FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正轉
unsigned int K;
/**********************************************************************
* *
* 步進電機驅動 *
* *
***********************************************************************/
void motor_ffw()
{
unsigned char i;
unsigned int j;
for (j=0; j<12; j++) //轉1*n圈
{
for (i=0; i<48; i++) //一個周期轉30度// 8*3.75=30度 轉180就將8修改為48
{
if(K==1) P1 = FFW[i]&0x1f; //取數據則純森
if(K==2) P1 = FFZ[i]&0x1f;
delay(5); //調節轉速
}
}
}
/孫畝******************************************************
*
* 延時程序
*
********************************************************/
void delay(unsigned int t)
{
unsigned int k;
while(t--)
{
for(k=0; k<=80; k++)
{ }
}
}
main()
{
while(1)
{
K=1;
motor_ffw();
K=2;
motor_ffw();
}
}
Ⅶ 如何用51單片機測量發動機轉速 要求只用一個定時器 晶振頻率33MHZ
如果有個輪子的話,可以配一個紅外對管。用對管數輪子轉一圈的時間,在知道輪子的周長的情況下,是可以算出來的。
Ⅷ 用51單片機通過霍爾元件AH44E檢測直流電機轉速的c程序
你好!
無需復雜計算。
霍爾感測器用於電機轉速測量,根據需要可在電機轉軸上均勻安裝N個(N=1、2、3、4...)磁鋼,N較大時,可直接用一個導磁材料製作的齒輪盤替代。
在T時間內對霍爾感測器的輸出脈沖進行計數,當T超過設定值(如0.5S)時,記錄計數值k。
轉速n=60*k/(NT)。
希望對你有所幫助,望採納。
Ⅸ 基於51單片機轉速測量的程序,望高手幫我解釋一下。
#include <reg51.h>
#include <INTRINS.H>
#define FOSC 11.0592
unsigned int speed;
unsigned char key;
unsigned char led_table[10]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xff,0xf6};
long speed_count,speed_count1;
unsigned char speed_check;
unsigned int second_flag;
unsigned char speed_table[4];
unsigned char speed_table1[10];
//定時器頻率1000Hz
void timer1_init(void)
{
EA=0;
TMOD=0x10;
//TH1=1000*FOSC/12/256;
//TL1=(unsigned int)(1000*FOSC/12)%256;
TH1=254;
TL1=51;
TR1=1;
TCON|=0X04; //外部中斷下降觸發
EX1=1; //允許外部中斷
ET1=1;
EA=1;
}
void int1_routine(void) interrupt 2
{
speed_count++;
P1^=0X02;
}
void timer1_routine(void) interrupt 3
//void timer1_routine(void)
{
TH1=254;
//TH1=0xf0;
TL1=51;
//speed_count++;
second_flag++;
}
void main(void)
{
unsigned int i,j,k;
// unsigned char sum;
unsigned speed_table[3];
long time_id;
timer1_init();
speed=0;
P2=0x0f;
P0=0xf0;
P3=0x08;
key=0;
P1=0x00;
speed_check=0;
while(1)
{
//P1^=0XFE;
j=1;
//speed=1234;
speed_table[0]=speed/1000;
speed_table[1]=speed%1000/100;
speed_table[2]=speed%100/10;
speed_table[3]=speed%10;
for(i=0;i<4;i++)
{
P2=j^0xff;
j<<=1;
P0=(led_table[speed_table[i]])&0xfe;
for(k=0;k<250;k++) ;
}
//speed=speed_count;
if(second_flag>=1000) /*中斷1000次進入 */
{
second_flag=0;
time_id++;
speed_table1[time_id%10]=speed_count;/*外部中斷量轉存(是很聰明的方法學習了)*/
speed_count=0;
speed=(speed_table1[0]+speed_table1[1]+speed_table1[2]+speed_table1[3]+speed_table1[4]+speed_table1[5]+speed_table1[6]+speed_table1[7]+speed_table1[8]+speed_table1[9])*6; /*(10X6)10秒的外部中斷量乘以6就是轉速了*/
//speed=speed/2+(speed_table[0]+speed_table[1]+speed_table[2])*6;
}
}
}
Ⅹ 51單片機轉速表
用霍爾感測器採集轉速,然後用單片機的某一個引腳老接收高低電平信號,可以根據兩個相鄰的相同的電平之間的時間來求出轉動的頻率,再用LED來顯示,其實很簡單。多注意思考,多動手,自己寫程序,相信自己。