⑴ 如何用單片機實現對四個步進電機的速度控制呢
推薦你使用表控,型號TPC4-4TD就可以滿足你的要求。
表控可以同時控制4個步進電機,對於你說的速度控制講解如下:
上圖是表控的表格設置界面,省去了麻煩的編程,輕松實現步進電機控制。
圖中,第2行工作模式設置為「脈沖」模式,游標在脈沖模式的第2行時,脈沖頻率項及脈沖個數輸入項分別顯示脈沖個數的單位,數據輸入框顯示為綠色。脈沖輸出單位為:百萬、十萬、萬、千、百、十、個,脈沖頻率的單位為赫茲。示例中頻率設置為500赫茲,脈沖個數為1101616個脈沖(一百一十萬一千六百一十六)。
⑵ 基於PIC單片機的無刷直流電機控制器的設計 畢業設計怎麼做
摘要
I
Abstract
II
第1章
緒論
1
1.1
課題背景及意義
1
1.1.1課題背景
1
1.1.2課題意義
2
1.2
無刷電機功率驅動發展
3
1.3
課題主要研究內容
4
第2章
無刷直流電動機的工作過程
5
2.1
無刷直流電動機基本組成
5
2.1.1電動機本體
5
2.1.2
轉子位置感測器
6
2.1.3電子換向電路
7
2.2
無刷直流電動機的工作原理
8
2.3
無刷直流電動機的數學模型
9
2.3.1電壓平衡方程
9
2.3.2轉矩方程
10
2.3.3傳遞函數
10
2.4
無刷直流電機的調速方法和機械特性
11
2.4.1電勢和調速方法
11
2.4.2電磁轉矩
12
2.4.3機械特性
13
2.4無刷直流電機雙閉環系統
13
2.4.1雙閉環控制系統組成
13
2.4.2雙閉環控制系統動態數學模型
14
第3章
調速系統方案確定
16
3.1無刷電機樣機參數
16
3.2主控單元
16
3.2.1
PIC單片機簡介
16
3.2.2
PIC單片機的結構
16
3.2.2
PIC單片機的特點
18
3.3
系統的組成
19
第4章
基於單片機的調速系統硬體設計
20
4.1
供電電源設計
20
4.2
檢測電路設計
21
4.2.1位置檢測
21
4.2.2整形電路
22
4.2.3
正反轉控制
23
4.2.4電流檢測電路
24
4.3
主功率和驅動電路
25
4.3.1主功率電路
25
4.3.2功率驅動電路
27
4.4
過流過壓保護電路
30
4.4.1過流保護電路
30
4.4.2過壓、欠壓保護電路
30
4.5
鍵盤與顯示電路
31
4.5.1鍵盤電路
31
4.5.2顯示電路
32
第5章
基於單片機的調速系統軟體設計
34
結論
36
參考文獻
37
致謝
39
有具體的思路和內容可以給你瀏覽一下...........
⑶ 如何用單片機控制直流電機
通過與單片機相連的按鍵控制直流電機停啟的電路如下圖所示,通過P3.6口按鍵觸發啟動直流電機,P3.7口的按鍵觸發停止直流電機的運行。由圖可知,當P1.0輸出高電平「1」時,NPN型三極體導通,直流電機得電轉動;當P1.0輸出低電平「0」時,NPN型三極體截止,直流電機停止轉動。
通過單片機產生PWM波控制直流電機程序
#include"reg52.h"
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[10]={0x3f,0x06,0x5b,
0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰數碼管顯示碼(0-9)
sbitxiaoshudian=P0^7;
sbitwei1=P2^4;//數碼管位選定義
sbitwei2=P2^5;
sbitwei3=P2^6;
sbitwei4=P2^7;
sbitbeep=P2^3;//蜂鳴器控制端
sbitmotor=P1^0;//電機控制
sbits1_jiasu=P1^4;//加速按鍵
sbits2_jiansu=P1^5;//減速按鍵
sbits3_jiting=P1^6;//停止/開始按鍵
uintpulse_count;//INT0接收到的脈沖數
uintnum=0;//num相當於占空比調節的精度
ucharspeed[3];//四位速度值存儲
floatbianhuasu;//當前速度(理論計算值)
floatreallyspeed;//實際測得的速度
floatvv_min=0.0;vv_max=250.0;
floatvi_Ref=60.0;//給定值
floatvi_PreError,vi_PreDerror;
uintpwm=100;//相當於占空比標志變數
intsample_time=0;//采樣標志
floatv_kp=1.2,v_ki=0.6,v_kd=0.2;//比例,積分,微分常數
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=20;y>0;y--);
}
voidtime_init()
{
ET1=1;//允許定時器T1中斷
ET0=1;//允許定時器T0中斷
TMOD=0x15;//定時器0計數,模式1;定時器1定時,模式1
TH1=(65536-100)/256;//定時器1值,負責PID中斷,0.1ms定時
TL1=(65536-100)%6;
TR0=1;//開定時器
TR1=1;
IP=0X08;//定時器1為高優級
EA=1;//開總中斷
}
voidkeyscan()
{
floatj;
if(s1_jiasu==0)//加速
{
delay(20);
if(s1_jiasu==0)
vi_Ref+=10;
j=vi_Ref;
}
while(s1_jiasu==0);
if(s2_jiansu==0)//減速
{
delay(20);
if(s2_jiansu==0)
vi_Ref-=10;
j=vi_Ref;
}
while(s2_jiansu==0);
if(s3_jiting==0)
{
delay(20);
motor=0;
P1=0X00;
P3=0X00;
P0=0x00;
}
while(s3_jiting==0);
}
floatv_PIDCalc(floatvi_Ref,floatvi_SpeedBack)
{
registerfloaterror1,d_error,dd_error;
error1=vi_Ref-vi_SpeedBack;//偏差的計算
d_error=error1-vi_PreError;//誤差的偏差
dd_error=d_error-vi_PreDerror;//誤差變化率
vi_PreError=error1;//存儲當前偏差
vi_PreDerror=d_error;
bianhuasu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);
return(bianhuasu);
}
voidv_Display()
{
uintsu;
su=(int)(reallyspeed*10);//乘以10之後強制轉化成整型
speed[3]=su/1000;//百位
speed[2]=(su00)/100;//十位
speed[1]=(su0)/10;//個位
speed[0]=su;//小數點後一位
wei1=0;//第一位打開
P0=table[speed[3]];
delay(5);
wei1=1;//第一位關閉
wei2=0;
P0=table[speed[2]];
delay(5);
wei2=1;
wei3=0;
P0=table[speed[1]];
xiaoshudian=1;
delay(5);
wei3=1;
wei4=0;
P0=table[speed[0]];
delay(5);
wei4=1;
}
voidBEEP()
{
if((reallyspeed)>=vi_Ref+5||(reallyspeed
{
beep=~beep;
delay(4);
}
}
voidmain()
{
time_init();
motor=0;
while(1)
{
v_Display();
BEEP();
}
if(s3_jiting==0)//對按鍵3進行掃描,增強急停效果
{
delay(20);
motor=0;
P1=0X00;
P3=0X00;
P0=0x00;
}
while(s3_jiting==0);
}
voidtimer0()interrupt1
{
}
voidtimer1()interrupt3
{
TH1=(65536-100)/256;//1ms定時
TL1=(65536-100)%6;
sample_time++;
if(sample_time==5000)//采樣時間0.1ms*5000=0.5s
{
TR0=0;//關閉定時器0
sample_time=0;
pulse_count=TH0*255+TL0;//保存當前脈沖數
keyscan();//掃描按鍵
reallyspeed=pulse_count/(4*0.6);//計算速度
pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);
if(pwm
if(pwm>100)pwm=100;
TH0=TL0=0;
TR0=1;//開啟定時器0
}
num++;
if(num==pwm)//此處的num值,就是占空比
{
motor=0;
}
if(num==100)//100相當於占空比調節的精度
{
num=0;
motor=1;
}
}
⑷ 單片機是怎樣控制電機的
單片機只輸出信號,經過隔離電路,再經過功率開關電路驅動電機。
控制普通的三項非同步電機可以單片機輸出信號經三極體後驅動一個小功率繼電器,由繼電器來驅動交流接觸器,進而控制電機,也可以單片機信號經三極體放大後直接驅動功率繼電器。 方法有很多很多。至於驅動伺服,單片機埠的信號經過光耦隔離後可以直接驅動,伺服驅動器本身需要的驅動信號都是弱電信號。
單片機注意事項
一般在單片機的數據手冊(Datasheet)中都會提到該單片機需要的復位信號的要求。一般復位信號的寬度應為。復位電平的寬度和幅度都應滿足晶元的要求,並且要求保持穩定。還有特別重要的一點就是復位電平應與電源上電在同一時刻發生,即晶元一上電,復位信號就已產生。
不然,由於沒有經過復位,單片機中的寄存器的值為隨機值,上電時就會按PC寄存器中的隨機內容開始運行程序,這樣很容易進行誤操作或進入死機狀態。
⑸ 步進電機單片機控制系統
由於不知道怎麼發圖片,沒有圖片。如果想要你採用我的回答,你發EMAIL到[email protected]我回復你。同時再給你1-2篇關於步進電機驅動的論文和資料。希望對你有所幫助
基於L297/L298晶元步進電機的單片機控制
1 引言
步進電動機是一種將電脈沖信號轉換成角位移或線位移的精密執行元件,由於步進電機具有控制方便、體積小等特點,所以在數控系統、自動生產線、自動化儀表、繪圖機和計算機外圍設備中得到廣泛應用。微電子學的迅速發展和微型計算機的普及與應用,為步進電動機的應用開辟了廣闊前景,使得以往用硬體電路構成的龐大復雜的控制器得以用軟體實現,既降低了硬體成本又提高了控制的靈活性,可靠性及多功能性。市場上有很多現成的步進電機控制機構,但價格都偏高。應用SGS公司推出的L297和L298兩晶元可方便的組成步進電機驅動器,並結合AT89C52單片機進行控制,即可以實現用相對便宜的價格組成一個性能不錯的步進電機驅動電路。
2 工作原理
由於步進電機是一種將電脈沖信號轉換成直線或角位移的執行元件,它不能直接接到交直流電源上,而必須使用專用設備-步進電機控制驅動器 典型步進電機控制系統如圖1所示:控制器可以發出脈沖頻率從幾赫茲到幾十千赫茲可以連續變化的脈沖信號,它為環形分配器提供脈沖序列。環形分配器的主要功能是把來自控制環節的脈沖序列按一定的規律分配後,經過功率放大器的放大加到步進電機驅動電源的各項輸人端,以驅動步進電機的轉動。環形分配器主要有兩大類:一類是用計算機軟體設計的方法實現環分器要求的功能,通常稱軟環形分配器。另一類是用硬體構成的環形分配器,通常稱為硬環形分配器。功率放大器主要對環形分配器的較小輸出信號進行放大.以達到驅動步進電機目的。
圖1 典型步進電機控制框圖
3 硬體組成
文中所控制的步進電機是四相單極式35BY48HJ120減速步進電動機。本文所設計的步進電機控制驅動器的框圖如圖2所示。它由AT89C52單片機、光電耦和器、集成晶元L297和L298組成。AT89C52是美國ATMEL的低電壓、高性能8位CMOS單片機。片內置8K位元組可重復擦寫的
Flash閃速存儲器。256位元組RAM。3個16位定時器.可編程串列UART通道。對完成步進電機的簡單控制已足以勝任。
圖2 本文提出的步進電機控制驅動器框圖
L297是步進電動機控制器(包括環形分配器)。L298是雙H橋式驅動器。它們所組成的微處理器至雙橋式步進電動機的介面如圖3所示。這種方式結合的優點是,需要的元件很少.從而使得裝配成本低,可靠性高和占空間少。並且通過軟體開發。可以簡化和減輕微型計算機的負擔。另外,L297和L298都是獨立的晶元.所以應用是十分靈活的。
L297晶元是一種硬體環分集成晶元.它可產生四相驅動信號,用於計算機控制的兩相雙極或四相單極步進電機 它的心臟部分是一組解碼器它能產生各種所需的相序.這一部分是由兩種輸入模式控制,方向控制(CW/CCW) 和HALF/FULL 以及步進式時鍾CLOCK.它將解碼器從一階梯推進至另一階梯。解碼器有四個輸出點連接到輸出邏輯部分,提供抑制和斬波功能所需的相序。因此L297能產生三種相序信號,對應於三種不同的工作方式:即半步方式(HALF STEP);基本步距(FULL STEP,整步)一相激勵方式;基本步距兩相激勵方式。脈沖分配器內部是一個3bit可逆計數器,加上一些組合邏輯.產生每周期8步格雷碼時序信號,這也就是半步工作方式的時序信號。此時HALF/FULL信號為高電。若HALF/FULL取低電平,得到基本步距工作方式。即雙四拍全階梯工作方式。
L297另一個重要組成是由兩個PWM 斬波器來控制相繞組電流,實現恆流斬波控制以獲得良好的矩頻特性。每個斬波器由一個比較器、一個RS觸發器和外接采樣電阻組成,並設有一個公用振盪器,向兩個斬波器提供觸發脈沖信號。圖3中,頻率f是由外接16腳的RC網路決定的, 當R>10kΩ 時,f=1/0.69RC。當時鍾振盪器脈沖使觸發器置1,電機繞組相電流上升,采樣電阻的R 上電壓上升到基準電壓Uref時,比
較器翻轉,使觸發器復位,功率晶體管關斷,電流下降,等待下一個振盪脈沖的到來。這樣,觸發器輸出的是恆頻PWM信號,調制L297的輸出信號,繞組相電流峰值由Uref確定。L297的CONTROL端的輸入決定斬波器對相位線A、B、C、D或抑制線INH1和INH2起作用。CONTROL為高電平時,對A、B、C、D有控製作用;而為低電平時,則對INH1和INH2起控製作用,從而可對電動機轉向和轉矩進行控制。
L298晶元是一種高壓、大電流雙全橋式驅動器,其設計是為接受標准TTL邏輯電平信號和驅動電感負載的,例如繼電器、圓筒形線圈、直流電動機和步進電動機 具有兩抑制輸入來使器件不受輸入信號影響。每橋的三級管的射極是連接在一起的,相應外接線端可用來連接外設感測電阻。可安置另一輸入電源,使邏輯能在低電壓下工作。L298晶元是具有15個引出腳的多瓦數直插式封裝的集成晶元。
圖3中.AT89C52通過串口經MAX232電平轉換之後與微機相連.接受上位機指令。向L297發出時鍾信號、正反轉信號、復位信號及使能控制等信號。電路中,電阻R13,R15用來調節斬波器電路的參考電壓,該電壓將與通過管腳13,14所反饋的電位的大小比較,來確定是否進行斬波控制,以達到控制電機繞組電流峰值、保護步進電機的目的
由於L297內部帶有斬波恆流電路,繞組相電流峰值由Uref確定。當採用兩片L297通過L298分別驅動步進電機的兩繞組,且通過兩個D/A轉換器改變每相繞組的Uref時,即組成了步進電機細分驅動電路。另外,為了有效地抑制電磁干擾,提高系統的可靠性,在單片機與步進電動機驅動迴路中利用兩個16引腳光電耦合器件TLP521-4組成如圖3所示的隔離電路。其作用是切斷了單片機與步進電動機驅動迴路之間電的直接聯系,實現了單片機與驅動迴路系統地線的分別聯接.防止處於大電流感性負載下工作的驅動電路產生的干擾信號以及電網負載突變產生的干擾信號通過線路串入單片機,影響單片機的正常工作。
4 軟體組成
在該電路中,將P1.0口設為電機開始按鈕,P1.1,P1.2,P1.3為速度選擇按鈕。速度由低到高,P1.4為電機停止按鈕。並設三檔速度的最高速度依次為500pps、1000pps、2000pps 。RXD,TXD 已由MAX232電平轉換接出串口。此外,步進電機其啟動,停止的頻率較低,一般在100-250Hz之間,而最高運行頻率要求較高。通常為1-3kHz,為使其在啟動、運行和停止整個過程中,既不會失步,又能夠盡快精確地達到目標位置,運行速度都要有一個加速一恆速減速的過程。這里採用常用的離散辦法來逼近理想的近似梯形的升降速曲線,如圖5所示。即利用定時器中斷方式來不斷改變定時器裝載值的大小.
本例中.為計算方便,把各離散點的速度所需的裝載值用公式轉化為各自所需的定時時間固化在系統的ROM 中,這里用TH0=(65536-time)/256,TL0=(65536-time)%256來計算裝載值,time表示各階梯所需定時時間。系統在運行中用查表法查出所需的時間,從而大幅度減少佔用CPU的時間,提高系統的相應速度。因此.該程序主要由控制主程序、加減速子程序組成,主程序框圖如圖4所示。
5 結論
本文創新點在於提出應用單片機和L297、L298集成電路構成步進電機控制驅動器。使之具有元件少.可靠性高、占空間少、裝配成本低等優點。通過軟體開發,可以簡化和減輕微型計算機的負擔。另外。在上面提出的在加減速程序中定時器的裝載值用式子計算不精確,這兩條賦值要執行不少的時間.具體做的時候.可直接把初值計算出來或把除號用相加來計算.以達到精確的目的。
⑹ 單片機控制步進電機
這是我自己做過的。源碼都給你了
#include<reg52.h>
#include<intrins.h>
#include<absacc.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
uint count; //當前計數值
uint distance;
bit intt=1;
unsigned char cont=0;
unsigned char co=0;
uchar buf;
//uchar m,lm,cm;
/**************針腳定義************/
sbit rect_wave=P2^0; //晶振控制信號
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P1^2;
sbit CLR=P1^3;
sbit DATA=P1^4;
sbit CLK=P1^5;
sbit d=P2^1;
sbit cp=P2^2;
sbit dir=P2^3;
/***********************************/
/**************函數聲明************/
void time0over(void); //定時器計時程序
void clrlcd(void); //clr LCD
void c_send(unsigned char y); //發命令
void reset(void); // reset LCD
void d_send(unsigned char x); //發數據
void pos(unsigned char pos); //設定顯示位置
void l_delay(unsigned int t); //長延時
void trans(j);
void ret(void); //初始化系統
void retcont(void); //定時器復位
void math(void); //計算測量距離
/***************************/
void init(void)
{ TH1=0xf3;
TL1=0xf3;
PCON=0x80;
TR1=1;
SCON=0x50; /*串口初始化設置,波特率4800BPS*/
}
//*******************************//
void send(uchar dat) /*發送子程序*/
{ //uchar i;
/*發送一個數據*/
SBUF=dat;
while(TI==0);
TI=0;
}
/***********************************/
void turn (void) //電機轉動控制
{
unsigned char x;
cont++;
cp=~cp;
l_delay(50);
cp=~cp;
co++;
if(co == 3)
{d=~d;
}
if(co == 4)
{d=~d;
co=0;
}
if (cont == 200) //判斷是否進行反轉復位
{dir=~dir;
cont=0;
for(x=0;x < 200;x++)
{cp=~cp;
l_delay(5);
cp=~cp;
co++;
if(co == 3)
{d=~d;
}
if(co == 4)
{d=~d;
co=0;
}
}
dir=~dir;
cont=0;
}
}
/**************子程序**********************/
void int0 () interrupt 0 //中斷0服務程序
{
EX0=0; //關閉中斷
TR0=0; //關閉定時器
TF0=0; //標志位清零
rect_wave=0; //停止發送超聲波
intt=0;
}
void work(void)
{
if(!intt)
{
intt=1;
if (distance < 400)
{
buf=distance;
send(buf);
turn();
math();} //計算所測得的距離
l_delay(5); //延時
retcont(); //定時器復位
rect_wave=1;
count=0;
}
}
void math(void) //計算所測得的距離
{ uchar m,lm,cm;
cm=distance%10; //取距離的最低位
distance=distance/10; //取距離的次高位
lm=distance%10;
distance=distance/10; //取距離的最高位
m=distance%10;
clrlcd(); //輸出計算結果
pos(0);
d_send('d');
d_send('i');
d_send('s');
d_send('=');
//pos(4);
d_send(m+0x30);
d_send(lm+0x30);
d_send(cm+0x30);
d_send('c');
d_send('m');
l_delay(500);
}
void time0over(void) //定時器計時程序
{ TF0=0;
count++;
distance=count;
}
/*
void trans(j)
{
switch(j)
{
case 0: d_send('0');break;
case 1: d_send('1');break;
case 2: d_send('2');break;
case 3: d_send('3');break;
case 4: d_send('4');break;
case 5: d_send('5');break;
case 6: d_send('6');break;
case 7: d_send('7');break;
case 8: d_send('8');break;
case 9: d_send('9');break;
}
}
*/
delay() //延時
{
int i;
for(i=0;i<1000;i++);
}
void l_delay(unsigned int t) //延時
{
unsigned int p;
unsigned int j;
for(j=0;j<t;j++)
{
for(p=0;p<1000;p++);
}
}
void reset(void) // reset LCD
{
delay();
c_send(0x38);
c_send(0x01);
c_send(0x06);
c_send(0x0c);
c_send(0x80);
}
void clrlcd(void) // clr LCD
{
delay();
c_send(0x01);
}
void pos(unsigned char pos) //設定顯示位置
{
c_send(pos | 0x80);
}
void c_send(unsigned char y) //發命令
{
unsigned char i;
EN=1;
RS=0;
RW=0;
for(i=0;i<8;i++)
{
if(_crol_(y,i)&0x80)
DATA=1;
else
DATA=0;
CLK=0;
CLK=1;
}
EN=0;
delay();
}
void d_send(unsigned char x) //發數據
{
unsigned char i;
EN=1;
RS=1;
RW=0;
for(i=0;i<8;i++)
{
if(_crol_(x,i)&0x80)
DATA=1;
else
DATA=0;
CLK=0;
CLK=1;
}
EN=0;
delay();
}
void ret(void) //初始化計數器
{ TMOD=0x22; //設置定時器計數器1為工作方式2
TH0=0xc6; //設置計數初值高位元組
TL0=0xc6; //設置計數初值低位元組
count=0;
IE=0x00; //禁止中斷
TF0=0; //溢出標志位清零
TR0=1; //打開定時器1
rect_wave=1;
EA=1; //打開中斷
IP=0x01; //外部中斷0為高中斷優先順序
IT0=0; //外部中斷低電平觸發シ?
EX0=1;
}
void retcont(void)
{ TF0=0; //溢出標志位清零
TR0=1; //打開定時器1
EA=1; //打開中斷
IP=0x01; //外部中斷0為高中斷優先順序
IT0=0; //外部中斷下降沿觸發
EX0=1;
rect_wave=1;
}
/**************主程序************/
void main(void)
{ rect_wave=0;
reset();
l_delay(10);
ret();
init();
math();
for(;;)
{
if(TF0)
{
time0over();
}
work();
}
}
⑺ 基於MCS-51系列單片機AT89C51,設計一個步進電機控制器
由於步進電機是一種將電脈沖信號轉換成直線或角位移的執行元件,它不能直接接到交直流電源上,而必須使用專業設備----步進電機控制驅動器,典型步進電機控制系統如圖1所示:控制器可以發出脈沖頻率從幾赫茲到幾千赫茲可以連續變化的脈沖信號,它為環形分配器提供脈沖序列,環形分配器的主要功能是把來自控制環節的脈沖序列按一定的規律分配後,經過功率放大器的放大加到步進電機驅動電源的各項輸入端,以驅動步進電機的轉動,環形分配器主要有兩大類:一類是用計算機軟體設計的方法實現環形分配器要求的功能,通常稱軟環形分配器。另一類是用硬體構成的環形分配器,通常稱硬環形分配器。功率放大器主要對環形分配器的較小輸出信號進行放大,以達到驅動步進電機的目的,步進電機的基本控制包括轉向控制和速度控制兩個方面。從結構上看,步進電機分為三相單三拍、三相雙三拍和三相六拍3種,其基本原理如下:
http://wenku..com/link?url=_X1AbHnS-_AXJSOeGwziD56L7zztQEm_
⑻ 如何利用51系列單片機控制電機
小功率電機,玩具車上的,可用單片機接三極體來驅動。