導航:首頁 > 操作系統 > 電機單片機調速

電機單片機調速

發布時間:2024-12-21 05:16:46

A. 51單片機實現直流電機PWM調速,為什麼要用定時器

直流電機的PWM調速,就是改變在一個周期里的通電時間,和斷電時間的比,即占空比,而通電時間+斷電時間=一個周期,這都是用時間來決定的,當然要用定時器。

B. 基於單片機的pwm小功率直流電機調速

直流調速器就是調節直流電動機速度的設備,上端和交流電源連接,下端和直流電動機連接,直流調速器將交流電轉化成兩路輸出直流電源,一路輸入給直流電機礪磁(定子),一路輸入給直流電機電樞(轉子),直流調速器通過控制電樞直流電壓來調節直流電動機轉速。同時直流電動機給調速器一個反饋電流,調速器根據反饋電流來判斷直流電機的轉速情況,必要時修正電樞電壓輸出,以此來再次調節電機的轉速。

直流電機的調速方案一般有下列3種方式:

1、改變電樞電壓;
2、改變激磁繞組電壓;
3、改變電樞迴路電阻。

使用單片機來控制直流電機的變速,一般採用調節電樞電壓的方式,通過單片機控制PWM1,PWM2,產生可變的脈沖,這樣電機上的電壓也為寬度可變的脈沖電壓。根據公式

U=aVCC

其中:U為電樞電壓;a為脈沖的占空比(0<a<1);VCC直流電壓源,這里為5V。

電動機的電樞電壓受單片機輸出脈沖控制,實現了利用脈沖寬度調制技術(PWM)進行直流電機的變速。

因為在H橋電路中,只有PWM1與PWM2電平互為相反時電機才能驅動,也就是PWM1與PWM2同為高電平或同為低電平時,都不能工作,所以上圖中的實際脈沖寬度為B,

我們把PWM波的周期定為1ms,占空比分100級可調(每級級差為10%),這樣定時器T0每0.01ms產生一次定時中斷,每100次後進入下一個PWM波的周期。上圖中,占空比是60%,即輸出脈沖的為0.6ms,斷開脈沖為0.4ms,這樣電樞電壓為5*60%=3V。

我們討論的是可以正轉反轉的,如果只按一個方向轉,我們就只要把PWM1置為高電平或低電平,只改變另一個PWM2電平的脈沖變化即可,,如下圖(Q4導通,Q3閉合,電機只能順時針調整轉動速度)

C語言代碼:

#include<AT89X52.h>
#define uchar unsigned char
#define uint unsigned int

sbit K5=P1^4;
sbit K6=P1^5;
sbit PWM1=P1^0;
sbit PWM2=P1^1;
sbit FMQ=P3^6;

uchar ZKB1,ZKB2;

void delaynms(uint aa)
{
uchar bb;
while(aa--)
{
for(bb=0;bb<115;bb++) //1ms基準延時程序
{
;
}
}

}

void delay500us(void)
{
int j;
for(j=0;j<57;j++)
{
;
}
}

void beep(void)
{
uchar t;
for(t=0;t<100;t++)
{
delay500us();
FMQ=!FMQ; //產生脈沖
}
FMQ=1; //關閉蜂鳴器
delaynms(300);
}

void main(void)
{
TR0=0; //關閉定時器0
TMOD=0x01; //定時器0,工作方式1
TH0=(65526-100)/256;
TL0=(65526-100)%256; //100us即0.01ms中斷一次
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器T0
ZKB1=50; //占空比初值設定
ZKB2=50; //占空比初值設定
while(1)
{
if(!K5)
{
delaynms(15); //消抖
if(!K5) //確定按鍵按下
{
beep();
ZKB1++; //增加ZKB1
ZKB2=100-ZKB1; //相應的ZKB2就減少
}
}
if(!K6)
{
delaynms(15); //消抖
if(!K6) //確定按鍵按下
{
beep();
ZKB1--; //減少ZKB1
ZKB2=100-ZKB1; //相應的ZKB2增加
}
}
if(ZKB1>99)
ZKB1=1;
if(ZKB1<1)
ZKB1=99;

}
}

void time0(void) interrupt 1
{
static uchar N=0;
TH0=(65526-100)/256;
TL0=(65526-100)%256;
N++;
if(N>100)
N=0;
if(N<=ZKB1)
PWM1=0;
else
PWM1=1;
if(N<=ZKB2)
PWM2=0;
else
PWM2=1;

}

//顯現:電機轉速到最高後,也就是N為1或99時,再按一下,就變到99或1,
//電機反方向旋轉以最高速度

C. 基於單片機的直流電機PWM調速控制(要單片機的代碼)快啊

; PWM 控制 LED 燈漸亮漸滅程序 *
; 利用定時器控制產生占空比可變的 PWM 波 *
; 按K1,PWM值增加,則占空比減小,LED 燈漸暗。 *
; 按K2,PWM值減小,則占空比增加,LED 燈漸亮。 *
;當PWM值增加到最大值或減小到最小值時,蜂鳴器將報警 *
;資源:p0口,8路指示燈。p1.4,p1.5亮度控制按鍵(埠按鍵)p3.7小喇叭報警 *

;----
PWM EQU 7FH ;PWM賦初始值
OUT EQU P0 ;8個LED燈的介面
INCKEY EQU P1.4 ;K1,PWM值增加鍵。
DECKEY EQU P1.5 ;K2,PWM值減小鍵。
BEEP EQU P3.7
;----
ORG 0000H
SJMP START
ORG 000BH
SJMP INTT0
ORG 001BH
SJMP INTT1
ORG 0030H
;----
;主程序
;定時器0工作在模式1,定時器1工作在模式2。
;----
START:
MOV SP,#30H
MOV TMOD,#21H
MOV TH1,PWM ;脈寬調節
MOV TL1,#00H
MOV TH0,#0FCH ;1ms延時常數
MOV TL0,#066H ;頻率調節
SETB EA
SETB ET0
SETB ET1
SETB TR0
LOOP: MOV A,PWM ;
JB INCKEY,LOOP1 ;增加鍵是否按下?
CALL DELAY ;延時去抖動
JB INCKEY,LOOP1
CJNE A,#0FFH,PWMINC ;是否到最大值?
CALL BEEP_BL ;是,蜂鳴器報警。
SJMP LOOP
PWMINC:
INC PWM ;調節脈寬(脈寬減小)
SJMP LOOP

LOOP1: JB DECKEY,LOOP2 ;減小鍵是否按下?
CALL DELAY ;延時去抖動
JB DECKEY,LOOP2
CJNE A,#02H,PWMDEC ;是否到最小值?
CALL BEEP_BL ;是,蜂鳴器報警。
SJMP LOOP
PWMDEC:
DEC PWM ;調節脈寬(脈寬增加)
LOOP2: SJMP LOOP
;----
;T0中斷服務子程序 (頻率)
;控制定時器1中斷
;----
INTT0:
CLR TR1
MOV TH0,#0FCH ;1ms延時常數
MOV TL0,#066H ;頻率調節
MOV TH1,PWM
SETB TR1
MOV OUT,#00H ;啟動輸出
RETI
;----
;T1中斷服務子程序 (脈寬)
;控制PWM脈沖寬度
;----
INTT1:
CLR TR1 ;脈寬調節結束
MOV OUT,#0FFH ;結束輸出
RETI
;----
;10ms延時子程序
;----
DELAY:
MOV R6,#50
DELAY1:
MOV R7,#100
DJNZ R7,$
DJNZ R6,DELAY1
RET
;----
;蜂鳴器響一聲子程序
;---
BEEP_BL:
MOV R6,#100
BL1: CALL BL2
CPL BEEP
DJNZ R6,BL1
MOV R5,#25
CALL DELAY2
RET
BL2: MOV R7,#180
BL3: NOP
DJNZ R7,BL3
RET
DELAY2: ;延時R5×10MS
MOV R6,#50
BL4: MOV R7,#100
BL5: DJNZ R7,BL5
DJNZ R6,BL4
DJNZ R5,DELAY2
RET
;---
END

D. 用單片機對直流電機調速的程序

#include<reg52.h> unsigned char pwm_val_right =0;//
變數定義
unsigned char push_val_right=0;//
右電機占空比
N/10
bit Right_moto_stop=1;
unsigned
int
time=0;
sbit k1=P3^5;
sbit k2=P3^4;
sbit Right_moto_pwm=P1^2;
sbit IN1=P1^0;
sbit IN2=P1^1;
/************************************************************************/
void delay(unsigned int k)
//
延時函數
{
unsigned int x,y;
for(x=0;x<k;x++)
for(y=0;y<2000;y++);
}
/************************************************************************/
void
run() //前進函數
{
push_val_right =10;
//PWM
調節參數
1-10
1為最慢,
10是最快
改這個值可
以改變其速度
IN1=0;
IN2=1;
}
/************************************************************************/
void
run_1() //前進函數
{
push_val_right =3;
//PWM
調節參數1-10
1為最慢,10是最快
改這個值可以改變其速度

IN1=0;
IN2=1;
}
/************************************************************************/
/*

PWM調制電機轉速

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

右電機調速

*/

void pwm_out_right_moto(void)
{
if(Right_moto_stop)

{

if(pwm_val_right<=push_val_right)

Right_moto_pwm=1;

else

Right_moto_pwm=0;

if(pwm_val_right>=10)
pwm_val_right=0;
}

else

Right_moto_pwm=0;
}
void main(void)
{

TMOD=0X01;

TH0= 0XF8;

//1ms
定時

TL0= 0X30;
TR0= 1;
ET0= 1;
EA = 1;
while(1)

{

//
此處函數自己寫

}
}
/***************************************************/
/*TIMER0
中斷服務子函數產生
PWM
信號
*/
/***************************************************/
void timer0() interrupt 1
using 2
{
TH0=0XF8;
//1Ms定時
TL0=0X30;
time++;
pwm_val_right++;
pwm_out_right_moto();

E. 基於單片機的直流電機PWM調速控制(要單片機的代碼)快啊

; PWM控制直流電機速度程序 *; 利用定時器生成可變占空比的PWM波 *; 按下K1鍵,PWM值增加,占空比減小,電機速度降低。 *; 按下K2鍵,PWM值減小,占空比增加,電機速度提高。 *; 當PWM值達到最大或最小時,蜂鳴器發出報警聲。 *; 資源:P0口,直流電機介面。P1.4,P1.5速度控制按鍵(埠按鍵)P3.7小喇叭報警 *; --------------------------------- PWM EQU 7FH ; PWM的初始值 OUT EQU P0 ; 直流電機介面 INCKEY EQU P1.4 ; K1,增加PWM值鍵 DECKEY EQU P1.5 ; K2,減少PWM值鍵 BEEP EQU P3.7; ----------------- ORG 0000H SJMP START ORG 000BH SJMP INTT0 ORG 001BH SJMP INTT1 ORG 0030H; ------------------; 主程序; 定時器0工作在模式1,定時器1工作在模式2。; ------------------START: MOV SP,#30H MOV TMOD,#21H MOV TH1,PWM ; 脈寬調節 MOV TL1,#00H MOV TH0,#0FCH ; 1ms延時常數 MOV TL0,#066H ; 頻率調節 SETB EA SETB ET0 SETB ET1 SETB TR0 LOOP: MOV A,PWM ; 讀取PWM值 JB INCKEY,LOOP1 ; 增加鍵是否按下? CALL DELAY ; 延時去抖動 JB INCKEY,LOOP1 JNB DECKEY,LOOP2 ; 減少鍵是否按下? CALL DELAY ; 延時去抖動 JNB DECKEY,LOOP2 CJNE A,#0FFH,PWMINC ; 是否達到最大值? CALL BEEP_BL ; 是,蜂鳴器報警 SJMP LOOPPWMINC: INC PWM ; 調節脈寬(脈寬減小) SJMP LOOPLOOP1: JB DECKEY,LOOP2 ; 減少鍵是否按下? CALL DELAY ; 延時去抖動 JB DECKEY,LOOP2 CJNE A,#02H,PWMDEC ; 是否達到最小值? CALL BEEP_BL ; 是,蜂鳴器報警 SJMP LOOPPWMDEC: DEC PWM ; 調節脈寬(脈寬增加) LOOP2: SJMP LOOP; ------------------; T0中斷服務子程序 (頻率); 控制定時器1中斷; ------------------INTT0: CLR TR1 MOV TH0,#0FCH ; 1ms延時常數 MOV TL0,#066H ; 頻率調節 MOV TH1,PWM SETB TR1 MOV OUT,#00H ; 啟動輸出 RETI; ------------------; T1中斷服務子程序 (脈寬); 控制PWM脈沖寬度; ------------------INTT1: CLR TR1 ; 脈寬調節結束 MOV OUT,#0FFH ; 結束輸出 RETI; ------------------; 10ms延時子程序; ------------------DELAY: MOV R6,#50 DELAY1: MOV R7,#100 DJNZ R7,$ DJNZ R6,DELAY1 RET; ------------------; 蜂鳴器響一聲子程序; ----------------BEEP_BL: MOV R6,#100 BL1: CALL BL2 CPL BEEP DJNZ R6,BL1 MOV R5,#25 CALL DELAY2 RET BL2: MOV R7,#180 BL3: NOP DJNZ R7,BL3 RET DELAY2: ; 延時R5×10MS MOV R6,#50 BL4: MOV R7,#100 BL5: DJNZ R7,BL5 DJNZ R6,BL4 DJNZ R5,DELAY2 RET; ------------------ END

閱讀全文

與電機單片機調速相關的資料

熱點內容
真實賽車3安卓如何登錄 瀏覽:733
解壓壓縮包要誰的密碼 瀏覽:746
微信看漲跌源碼 瀏覽:70
android全局service 瀏覽:291
飛豬app關注怎麼取消 瀏覽:437
snmp4j源碼 瀏覽:247
如何利用肉雞搭建ftp伺服器 瀏覽:454
用戶名已加密怎麼辦 瀏覽:140
js怎麼樣上傳到文件到伺服器地址 瀏覽:581
省錢吖app裡面的錢怎麼套出來 瀏覽:596
ove轉pdf 瀏覽:309
八字油槽編程 瀏覽:247
遙望app怎麼重新注冊 瀏覽:410
石墨文檔導出到手機的哪個文件夾 瀏覽:506
scratch編程校本教材 瀏覽:97
如何把多個文件夾一起解壓 瀏覽:916
兒童編程免費教學20節課 瀏覽:124
java判斷時間格式 瀏覽:908
分析程序員招聘分析程序員 瀏覽:127
soul蘋果會員為什麼比安卓貴 瀏覽:864