Ⅰ 單片機中pwm產生的三角波用來控制電機正反轉及調速的原理
中央對齊模式就是三角波了
Ⅱ 用過單片機pwm控制電機的進,怎樣控制電機正反轉,說下原理即可
不是這樣的,驅動是指的電機驅動電路,不是指的就連到電機上的某個引線,看下這個原理圖可能你會理解什麼是驅動電路。
Ⅲ 基於單片機的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,
//電機反方向旋轉以最高速度
Ⅳ 單片機控制PWM直流電機(通過L298晶元)正反轉、加減速
/* =======直流電機的PWM速度控製程序======== */
/* 晶振採用11.0592M,產生的PWM的頻率約為91Hz */
#include<reg51.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sbit en1=P2^0; /* L298的Enable A */
sbit en2=P2^1; /* L298的Enable B */
sbit s1=P2^2; /* L298的Input 1 */
sbit s2=P2^3; /* L298的Input 2 */
sbit s3=P2^4; /* L298的Input 3 */
sbit s4=P2^5; /* L298的Input 4 */
uchar t=0; /* 中斷計數器 */
uchar m1=0; /* 電機1速度值 */
uchar m2=0; /* 電機2速度值 */
uchar tmp1,tmp2; /* 電機當前速度值 */
/* 電機控制函數 index-電機號(1,2); speed-電機速度(-100—100) */
void motor(uchar index, char speed)
{
if(speed>=-100 && speed<=100)
{
if(index==1) /* 電機1的處理 */
{
m1=abs(speed); /* 取速度的絕對值 */
if(speed<0) /* 速度值為負則反轉 */
{
s1=0;
s2=1;
}
else /* 不為負數則正轉 */
{
s1=1;
s2=0;
}
}
if(index==2) /* 電機2的處理 */
{
m2=abs(speed); /* 電機2的速度控制 */
if(speed<0) /* 電機2的方向控制 */
{
s3=0;
s4=1;
}
else
{
s3=1;
s4=0;
}
}
}
}
void delay(uint j) /* 簡易延時函數 */
{
for(j;j>0;j--);
}
void main()
{
char i;
TMOD=0x02; /* 設定T0的工作模式為2 */
TH0=0x9B; /* 裝入定時器的初值 */
TL0=0x9B;
EA=1; /* 開中斷 */
ET0=1; /* 定時器0允許中斷 */
TR0=1; /* 啟動定時器0 */
while(1) /* 電機實際控制演示 */
{
for(i=0;i<=100;i++) /* 正轉加速 */
{
motor(1,i);
motor(2,i);
delay(5000);
}
for(i=100;i>0;i--) /* 正轉減速 */
{
motor(1,i);
motor(2,i);
delay(5000);
}
for(i=0;i<=100;i++) /* 反轉加速 */
{
motor(1,-i);
motor(2,-i);
delay(5000);
}
for(i=100;i>0;i--) /* 反轉減速 */
{
motor(1,-i);
motor(2,-i);
delay(5000);
}
}
}
void timer0() interrupt 1 /* T0中斷服務程序 */
{
if(t==0) /* 1個PWM周期完成後才會接受新數值 */
{
tmp1=m1;
tmp2=m2;
}
if(t<tmp1) en1=1; else en1=0; /* 產生電機1的PWM信號 */
if(t<tmp2) en2=1; else en2=0; /* 產生電機2的PWM信號 */
t++;
if(t>=100) t=0; /* 1個PWM信號由100次中斷產生 */
}
本人也是在網上找到的,測試過,正確的,能實現,這段時間也在弄這,希望能幫助你
Ⅳ 51單片機PWM怎麼正反轉呢幫我看下代碼怎麼改,謝謝
unsigned char bdata Bits;
sbit bit = Bits^0;//定義1個位變數
unsigned char T5S;定義1個5秒計時變數
void main(void)
{
bit = 0;//位變數清0
T5S = 0xxx;//賦5秒倒計數初值
egine = 0;關閉電機
agine = 0;
EA=1; //開啟中斷程序(into) //開段序
ET0=1; //開啟T0中斷程序(into) //中程
TR0=1; //打開T0中斷
while(1)
{
if(!ET0)//如果5秒計時結束
{
delay()//調用1個1秒的循環延時,電機停1秒
T5S = 0xxx;//重新賦初值
ET0 = 1;//重新開放T0中斷
}
}
}
void into(void) interrupt 1
{
T5S--;
if(!T5S){bit = ~bit;ET0 = 0;}//取反位變數,關閉T0中斷
whole--;
last--;
if(whole==0)
{whole=7;
last=2;
if(!bit)//判斷位變數決定電機轉動方向
{
egine =1;//電機正轉
agine = 0;
}
else
(
agine = 1;//電極反轉
egine =0;
}
}
else
{if(last==0)
{
egine =0;
agine = 0;
}
}
TH0 = 0x0FF;
TL0 = 0x9C;
}
delay()//1秒延時子程序
{
.........
}
以上修改的程序供參考,5秒和1秒的定時參數涉及單片機時鍾頻率,你自己解決,希望能幫到你。
Ⅵ 用單片機來控制直流電動機的正反轉、加減速的程序如何寫啊
正反轉就是電流流向改變就可以.加減速度主要是電動機電壓大小控制就可以了.具體的要有硬體才可以實現的.
Ⅶ 51單片機電機正反轉控製程序
正轉:PWM1高電平,PWM2低電平;
反轉:PWM1低電平,PWM2高電平;
Ⅷ 51單片機pwm直流電機怎麼實現調速和正反轉
如果要正反轉控制,驅動電路做個全橋的,控制占空比。50%的話就停止了!
Ⅸ 51單片機實現pwm對電機調速
可以用一個定時器實現,也可以用兩個定時器實現
一個定時器實現辦法,如定時器定時50US中斷一次,中斷100次是5ms,即PWM的周期
每次中斷,變數a加1,並且a與另一變數b比較,如果a<b,讓某一管腳輸出高電平,如果a>=b,則讓其輸出低電平,a等於100時清0,這樣占空比是b/100,改變b的值,就可以改變占空比
缺點定時器定時時間不能太短,例如10us中斷程序根本執行不完,若占空比調節精度要求較高,如要求百分之一,則a需大於100,這樣PWM波的周期就比較大,頻率比較低
兩個定時器,如一個定時器0定時100us,另外一個定時器1定時小於100us,如b
us
定時器0中斷時輸出高電平,並打開定時器1,定時器1負責置低電平
這樣,就可以產生周期100us,占空比是b/100的方波
頻率可以比用一個定時器高一些