Ⅰ 51單片機控制電機轉速
前天幫別人做了一個,還可以顯示當前速度,和設置的速度, 4X4鍵盤(16個按鍵),設置速度可直接輸入,有正轉,反轉,啟動,停止,和加速,減速功能Ⅱ 51單片機怎麼控制大功率的直流電機,麻煩給下電路圖,謝啦。主要是驅動那怎麼設計
看了這么多回答的,還是我給你一個答案吧!
答案見插圖。解釋如下:
1:你說的大功率直流電機,用三極體肯定驅動不了,必須要大功率的MOSFET或者IGBT去驅動,IGBT或者MOSFET可以買Infineon的。主電路結構最好採用H橋電路,可以雙極性正反調速。
2:H橋的上管可以用IR2110來驅動,這個晶元自己提供了一個自舉功能,上管MOSFET(或IGBT)的源極電壓是浮動的,自舉電路可以保證上管的柵源之間的電壓在開啟電壓閾值之上。
3:你想要用51單片機實現調速,只需要用51單片機的P0~P3口產生兩組互相反相的PWM波(注意兩組之間要有死區),輸出到IR2110的HIN和LIN。至於程序,就很簡單了,不用我多說,你懂的。呵呵……
Ⅲ 51單片機直流電機調速問題
if(K1=0) 使用錯誤,應該是if(K1==0)
滿意請採納
Ⅳ 51單片機控制直流電機。(c語言控制)
有3種方案:
第一種,通過PWM脈寬調制輸出方法控制轉速,控制占空比的大小可以實現調速!
第二種,通過AD轉換的方法控制直流電機的電壓
第三種,用xtr115程式控制電流源來控制直流電機(類似第二種方法)
如果以上的驅動能力不夠的話再加上一個電壓跟隨器!
程序方面就是一個寄存器的配置問題了,你查一下單片機的技術手冊上面都有介紹的,祝你成功
Ⅳ 基於51單片機直流電機調速測速模擬原理
基於51單片機直流電機調速測速模擬原理是以STC90C52RC單片機為主控晶元,利用PWM的原理,通過按鍵對直流電機進行調速,實現正反轉;採用霍爾感測器對直流電機的轉動進行計數,並通過主控晶元將採集到的計數值轉化為直流電機的當前速度值;利用LCD1602顯示模塊將計算得到的值進行實時顯示。
Ⅵ 51單片機直流電機調速
第一:你這個不是電機調速的,用外部中斷是測速的呀。
下面是我寫的.PID部分的代碼就不給了,想加的話,自己找可以了
#include <AT89X52.H>
#include "common.h"
#define _WHEEL_C_
#define Left_moto_pwm P1_5
#define Right_moto_pwm P1_4
#define Left_moto_go {IN1=0,IN2=1;}
#define Left_moto_back {IN1=1,IN2=0;}
#define Right_moto_go {IN3=1,IN4=0;}
#define Right_moto_back {IN3=0,IN4=1;}
sbit IN1=P1^0;
sbit IN2=P1^1;
sbit IN3=P1^2;
sbit IN4=P1^3;
unsigned char pwm_val_left=0;
unsigned char push_val_left=0;
unsigned char pwm_val_right=0;
unsigned char push_val_right=0;
float L_Count=0,R_Count=0;
unsigned int TimerNum=0,SYS_TimeNum=0;
float Save_L_Distance=0,Save_R_Distance=0,Left_Speed=0,Right_Speed=0;
unsigned char Left_point=0,Right_point=0;
unsigned char sys_1ms=0,sys_1s=0,TurnFlag=0;
//初始化PWM調速函數
void Init_Wheel()
{
TMOD = 0x01;
TH0 = 0x0FF;
TL0 = 0x0A4;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Init_WheelSpeedInter()
{
IT0=1; //INT0下降沿中斷
EX0=1; //允許INT1中斷
IT1=1; //INT1下降沿中斷
EX1=1; //允許INT1中斷
EA=1;
}
//得到上一次0.5秒的行駛距離
float GetLeftWheelMileage()
{
return Save_L_Distance;
}
//得到上一次0.25秒的行駛距離
float GetRightWheelMileage()
{
return Save_R_Distance;
}
void Inter_Left(void) interrupt 0
{
L_Count++;
}
void Inter_Right(void) interrupt 2
{
R_Count++;
}
//小車向前函數
void Wheel_Run(char left_val,char right_val)
{
push_val_left=left_val;
push_val_right=right_val;
Left_moto_go ;
Right_moto_go ;
}
//小車後退函數
void Wheel_Back(char left_val,char right_val)
{
push_val_left=left_val;
push_val_right=right_val;
Left_moto_back;
Right_moto_back;
}
//小車停止函數
void Wheel_Stop(void)
{
Wheel_Run(0,0);
}
//左輪PWM調速函數
void pwm_out_left_moto(void)
{
if(pwm_val_left>200)
{
pwm_val_left=0;
}else
{
if(pwm_val_left<=push_val_left)
{
Left_moto_pwm=1;
}
else
{
Left_moto_pwm=0;
}
}
}
//右輪調速函數
void pwm_out_right_moto(void)
{
if(pwm_val_right>200)
{
pwm_val_right=0;
}else
{
if(pwm_val_right<=push_val_right)
{
Right_moto_pwm=1;
}
else
Right_moto_pwm=0;
}
}
//PWM調速中斷(TIMER0--工作方式1)
void Wheel_Interrupt(void) interrupt 1
{
TH0 = 0x0FF;
TL0 = 0x0A4;
TimerNum++;
if(TimerNum>=2500)
{
//左右輪速度cm/s
Left_Speed=4*L_Count;
Right_Speed=4*R_Count;
//左右輪0.25秒行駛距離
Save_L_Distance+=L_Count;
Save_R_Distance+=R_Count;
//數據發送到串口圖示
DataScope_Get_Channel_Data(L_Count, 1 ); //將數據 1.0 寫入通道 1
DataScope_Get_Channel_Data(R_Count, 2 ); //將數據 2.0 寫入通道 2
Send_Count = DataScope_Data_Generate(2); //生成10個通道的 格式化幀數據,返回幀數據長度
for( DateNum = 0 ; DateNum < Send_Count; DateNum++) //循環發送,直到發送完畢
{
SendByte(DataScope_OutPut_Buffer[DateNum]);
}
TimerNum=0;
L_Count=0;
R_Count=0;
}
pwm_val_left++;
pwm_val_right++;
pwm_out_left_moto();
pwm_out_right_moto();
}
Ⅶ 怎麼用C51單片機控制直流電機詳細解說下,謝謝~~~~
PWM是用來控制變頻器以達到控制交流電機的目的。而要控制直流電動機,如果小功率的電機最簡單的就是用DA加功率放大器或者IGBT直接驅動;如果是大功率電機就需要用單片機加DA加直流電機調速模塊控制。C51單片機如果沒有DA,另加DA,根據控制精度選擇DA位數。
Ⅷ 用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