Tải bản đầy đủ (.doc) (23 trang)

Thiết kế bộ PID dùng vi điều khiển

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (277.72 KB, 23 trang )

Mục lục
Phần 1:Khái quát
 1.1: Động cơ một chiều
 1.2:PWM
 1.3:PID số
 1.4:Encoder
Phần 2:Mạch phần cứng
Phần 3:Tính toán PID
Phần 4:Giải thuật lập trình
Phn 1
Khỏi quỏt
1.1: ng c mt chiu
Khái niệm chung
Điều khiển tốc độ l một yêu cầu cần thiết tất yếu của các máy sản xuất.
Ta biết rằng hầu hết các máy sản xuất đòi hỏi có nhiều tốc độ, tùy theo
từng công việc, điều kiện lm việc m ta lựa chọn các tốc độ khác nhau
để tối u hoá quá trình sản xuất. Muốn có c các tốc độ khác nhau
trên máy ta có thể thay đổi cấu trúc cơ học của máy nh tỉ số truyền
hoặc thay đổi tốc độ của chính động cơ truyền động. ở đây em chỉ khảo
sát theo phng pháp thay đổi tốc độ động cơ truyền động.
Tốc độ lm việc của động cơ do ngi điều khiển quy định c gọi l
tốc độ đặt. Trong quá trình lm việc, tốc độ động cơ có thể bị thay đổi vì
tốc độ của động cơ phụ thuộc rất nhiều vo các thông số nguồn, mạch v
tải nên khi các thông số thay đổi thì tốc độ của động cơ sẽ bị thay đổi
theo. Tình trạng đó gây ra sai số về tốc độ v có thể không cho phép. Để
khắc phục ngi ta dùng những phng pháp ổn định tốc độ.
Độ ổn định tốc độ còn ảnh hnh quan trọng đến giải điều chỉnh (phạm
vi điều chỉnh tốc độ) v khả năng quá tải của động cơ. Độ ổn định cng
cao thì giải điều chỉnh cng có khả năng mở rộng v mômen quá tải
cng lớn.
Có rất nhiều phng pháp để điều chỉnh tốc độ động cơ :


Điều chỉnh tham số.
Điều chỉnh điện áp nguồn.
Điều chỉnh cấu trúc sơ đồ.
Cấu tạo
Động cơ điện một chiều có thể phân thành hai phần chính : phần tĩnh và
phần động.
Phần tĩnh hay stato.Đây là đứng yên của máy , bao gồm các bộ
phận chính sau:
Cực từ chính :
là bộ phận sinh ra từ trờng gồm có lõi sắt cực từ và dây quấn kích từ lồng
ngoài lõi sắt cực từ . Lõi sắt cực từ làm bằng những lá thép kỹ thuật điện
hay thép cacbon dày 0,5 đến 1mm ép lại và tán chặt . Trong động cơ điện
nhỏ có thể dùng thép khối . Cực từ đợc gắn chặt vào vỏ máy nhờ các
bulông . Dây quấn kích từ đợc quấn bằng dây đồng bọc cách điện và mỗi
cuộn dây đều đợc bọc cách điện kỹ thành một khối tẩm sơn cách điện tr-
ớc khi đặt trên các cực từ . Các cuộn dây kích từ đợc đặt trên các cực từ
này đợc nối tiếp với nhau.
Cực từ phụ :
Cực từ phụ đợc đặt trên các cực từ chính và dùng để cải thiện đổi chiều .
Lõi thép của cực từ phụ thờng làm bằng thép khối và trên thân cực từ phụ
có đặt dây quấn mà cấu rạo giống nh dây quấn cực từ chính. Cực từ phụ
đợc gắn vào vỏ máy nhờ những bulông.
Gông từ :
Gông từ dùng làm mạch từ nối liền các cực từ, đồng thời làm vỏ máy.
Trong động cơ điện nhỏ và vừa thờng dùng thép dày uốn và hàn lại.
Trong máy điện lớn thờng dùng thép đúc. Có khi trong động cơ điện nhỏ
dùng gang làm vỏ máy.
Các bộ phận khác.
Bao gồm:
- Náp máy : Để bảo vệ máy khỏi những vật ngoài rơi vào làm h hỏng

dây quấn và an toàn cho ngời khỏi chạm vào điện. Trong máy điện nhỏ
và vừa nắp máy còn có tác dụng làm giá đỡ ổ bi. Trong trờng hợp này
nắp máy thờng làm bằng gang.
- Cơ cấu chổi than : để đa dòng điện từ phần quay ra ngoài. Cơ cấu chổi
than bao gồm có chổi than đặt trong hộp chổi than nhờ một lò xo tì chặy
lên cổ góp. Hộp chổi than đợc cố định trên giá chổi than và cách điện với
giá. Giá chổi than có thể quay đợc để điều chỉnh vị trí chổi than cho
đúng chỗ. Sau khi điều chỉnh xong thì dùng vít cố định lại.
Phần quay hay rôto.
Bao gồm những bộ phận chính sau :
Lõi sắt phần ứng :
Dùng để dẫn từ. Thờng dùng những tấm thép kỹ thuật điện dày 0,5mm
phủ cách điện mỏng ở hai mặt rồi ép chặt lại để giảm tổn hao do dòng
điện xoáy gây nên. Trên lá thép có dập hình dạng rãnh để sau khi ép lại
thì dặt dây quấn vào.
Trong những động cơ trung bình trở lên ngời ta còn dập những lỗ
thông gió để khi ép lạ thành lõi sắt có thể tạo đợc những lỗ thông gió dọc
trục.
Trong những động cơ điện lớn hơn thì lõi sắt thờng chia thành những
đoạn nhỏ, giữa những đoạn ấy có để một khe hở gọi là khe hở thông gió.
Khi máy làm việc gió thổi qua các khe hở làm nguội dây quấn và lõi sắt.
Trong động cơ điện một chiều nhỏ, lõi sắt phần ứng đợc ép trực tiếp
vào trục. Trong động cơ điện lớn, giữa trục và lõi sắt có đặt giá rôto.
Dùng giá rôto có thể tiết kiệm thép kỹ thuật điện và giảm nhẹ trọng lợng
rôto.
Dây quấn phần ứng.
Dây quấn phần ứng là phần phát sinh ra suất điện động và có dòng
điện chạy qua. Dây quấn phần ứng thờng làm bằng dây đồng có bọc cách
điện. Trong máy điện nhỏ có công suất dới vài kw thờng dùng dây có tiết
diện tròn. Trong máy điện vừa và lớn thờng dùng dây tiết diện chữ nhật.

Dây quấn đợc cách điện cẩn thận với rãnh của lõi thép.
Để tránh khi quay bị văng ra do lực li tâm, ở miệng rãnh có dùng nêm
để đè chặt hoặc đai chặt dây quấn. Nêm có làm bằng tre, gỗ hay bakelit.
Cổ góp :
Dùng để đổi chiều dòng điẹn xoay chiều thành một chiều. Cổ góp gồm
nhiều phiến đồng có đợc mạ cách điện với nhau bằng lớp mica dày từ 0,4
đến 1,2mm và hợp thành một hình trục tròn. Hai đầu trục tròn dùng hai
hình ốp hình chữ V ép chặt lại. Giữa vành ốp và trụ tròn cũng cách điện
bằng mica. Đuôi vành góp có cao lên một ít để hàn các đầu dây của các
phần tử dây quấn và các phiến góp đợc dễ dàng.
Các bộ phận khác.
- Cánh quạt : dùng để quạt gió làm nguội máy. Máy điện một chiều th-
ờng chế tạo theo kiểu bảo vệ. ở hai đầu nắp máy có lỗ thông gió. Cánh
quạt lắp trên trục máy , khi động cơ quay cánh quạt hút gió từ ngoài vào
động cơ. Gió đi qua vành góp, cực từ lõi sắt và dây quấn rồi qua quạt gió
ra ngoài làm nguội máy.
- Trục máy : trên đó đặt lõi sắt phần ứng, cổ góp, cánh quạt và ổ bi.
Trục máy thờng làm bằng thép cacbon tốt.
1.2:PWM
1 ) PWM l gỡ?
Trc khi tỡm hiu sõu chỳng ta hóy tỡm hiu nh ngha ca PWM l
gỡ? Nh vy Phng phỏp iu ch PWM cú tờn ting anh l Pulse
Width Modulation là phương pháp điều chỉnh điện áp ra tải hay nói cách
khác là phương pháp điều chế dựa trên sự thay đổi độ rộng của chuỗi
xung vuông dẫm đếm sự thay đổi điện áp ra
Các PWM khi biến đổi thì có cùng 1 tần số và khác nhau về độ rộng của
sườn dương hay hoặc là sườn âm
Phần 2:Mạch phần cứng
Orcad:
V C C

R 2
4 . 7 k
12
3
4
5
6
7
8
9
T 1
T 0
P C 7
T 3
T 2
P C 6
T 5
T 4
P C 5
T 6
P C 2
P C 4
T 7
P C 0
P C 1
S W 2
L i g h t
S W 3
L i g h t
S W 4

L i g h t
S W 5
L i g h t
S W 6
L i g h t
S W 1 0
L i g h t
S W 7
L i g h t
S W 1 1
L i g h t
S W 8
L i g h t
S W 9
L i g h t
C 1 2
1 0 3
C 4
1 0 3
C 1 3
1 0 3
s t a r t
C 5
1 0 3
C 6
1 0 3
R E S E T
C 7
1 0 3
C 8

1 0 3
C 9
1 0 3
C 1 0
1 0 3
C 1 1
1 0 3
R 2 2
4 . 7 k
R 1 9
4 . 7 k
R 2 0
4 . 7 k
R 2 1
4 . 7 k
J 2
L C D
1
2
3
4
5
6
7
8
9
1 0
1 1
1 2
1 3

1 4
1 5
1 6
V C C
R 5
1 k
s t a r t
U 2
A T m e g a 1 6
P B 1 ( T 1 )
2
P B 0 ( X C K / T 0 )
1
P B 2 ( I N T 2 / A I N 0 ) )
3
P B 3 ( O C 0 / A I N 1 )
4
P B 4 ( S S )
5
P B 5 ( M O S I )
6
P B 6 ( M I S O )
7
P B 7 ( S C K )
8
R S T
9
V C C
1 0
G N D 1

1 1
X T A L 1
1 2
X T A L 2
1 3
P D 0 ( R X D )
1 4
P D 1 ( T X D )
1 5
P D 2 ( I N T 0 )
1 6
P D 3 ( I N T 1 )
1 7
P D 4 ( O C 1 B )
1 8
P D 5 ( O C 1 A )
1 9
P D 6 ( I C P 1 )
2 0
P D 7 ( O C 2 )
2 1
P C 0 ( S C L )
2 2
P C 1 ( S D A )
2 3
P C 2 ( T C K )
2 4
P C 3 ( T M S )
2 5
P C 4 ( T D 0 )

2 6
P C 5 ( T D I )
2 7
P C 6 ( T 0 S C 1 )
2 8
P C 7 ( T 0 S C 2 )
2 9
A V C C
3 0
G N D 2
3 1
A R E F
3 2
P A 7 ( A D C 7 )
3 3
P A 6 ( A D C 6 )
3 4
P A 5 ( A D C 5 )
3 5
P A 4 ( A D C 4 )
3 6
P A 3 ( A D C 3 )
3 7
P A 2 ( A D C 2 )
3 8
P A 1 ( A D C 1 )
3 9
P A 0 ( A D C 0 )
4 0
V C C

P C 6
P C 7
P C 4
P C 5
P C 0
P C 1
P C 2
S C K
M I S O
M O S I
M O S I
J 3
H E A D E R 5 X 2
2
4
6
8
1 0
1
3
5
7
9
S C K
M I S O
V C C
R E S E T
R E S E T
R 7
1 0 k

Y 1
1 6 M H z
X 2
C 1
2 2 p F
X 1
C 2
2 2 p F
J 7
V D K
1
2
X 1
X 2
V C C
D 2
L E D
C 3
1 0 0 n F
R 1 7
4 . 7 k
V C C
V C C
J 6
N G U O N
1
2
V C C
J 8
E N C O D E R

1
V C C
T 0
T 3
T 2
T 1
T 5
T 4
T 7
T 6
mạch điều khiển
D 1 7
L E D
D 1 8
L E D
C 1
1 0 0 n F
C 2
1 0 0 n F
J 1 0
N G U O N
1
2
3
4
C 3
1 0 u F / 5 0 V
C 4
4 7 u F / 5 0 V
R 2 3

1 0 k
1 2 V
2 4 V
J 1 1
V D K
1
2
R 4
1 K ( C S )
D 1 9
1 N 4 1 4 8
1 2 V
Q 5
B 5 6 2
Q 6
D 4 6 8
1 2 V
U 3
4 N 3 5
1 6
2
5
4
R 2
3 . 3 K ( C S )
R 3
6 8 0 / 1 W
Q 2
I R F 5 4 0 N / T O ( C S )
D 1

1 N 4 0 0 7 ( C S )
J 1
M O T O R
1
2
2 4 V
R 2 4
4 . 7 k
mạch công suất
protus:
PB0/T0/XCK
1
PB1/T1
2
PB2/AIN0/INT2
3
PB3/AIN1/OC0
4
PB4/SS
5
PB5/MOSI
6
PB6/MISO
7
PB7/SCK
8
RESET
9
XTAL2
12

XTAL1
13
PD0/RXD
14
PD1/TXD
15
PD2/INT0
16
PD3/INT1
17
PD4/OC1B
18
PD5/OC1A
19
PD6/ICP1
20
PD7/OC2
21
PC0/SCL
22
PC1/SDA
23
PC2/TCK
24
PC3/TMS
25
PC4/TDO
26
PC5/TDI
27

PC6/TOSC1
28
PC7/TOSC2
29
PA7/ADC7
33
PA6/ADC6
34
PA5/ADC5
35
PA4/ADC4
36
PA3/ADC3
37
PA2/ADC2
38
PA1/ADC1
39
PA0/ADC0
40
AREF
32
AVCC
30
U1
ATMEGA16
D7
14
D6
13

D5
12
D4
11
D3
10
D2
9
D1
8
D0
7
E
6
RW
5
RS
4
VSS
1
VDD
2
VEE
3
LCD1
LM016L
RV1
10K
Q1
NPN

Q2
IRF540
R1
2k
2
3
4
5
6
7
8
9
1
RP1
RESPACK-8
SW2(COM)
SW1(COM)
SW3(COM)
SW1
SW-SPST
SW2
SW-SPST
SW3
SW-SPST
Phần 3:Tính toán PID
 Tính chọn hệ số Kp, K
I

Ziegler và Nichols đưa ra hai phương pháp thực nghiệm để xác định
tham số bộ điều khiển PID.Phương pháp thứ nhất dùng mô hình xấp xỉ

quán tính bậc nhất có trễ của đối tượng điều khiển:
Ts
ke
sG
sT
delay
+
=

1
)(
Phương pháp thứ hai không cần đến mô hình toán học của đối tượng
nhưng chỉ áp dụng cho một số lớp đối tượng nhất định.
 Sử dụng phương pháp thứ hai
Phướng pháp này thay bộ PID trong hệ kín bằng 1 bộ khuếch đại, sau đó
tăng k cho tới khi hệ nằm ở biên giới ổn định (Tức là hệ kín trở thành
khâu dao động điều hóa).Lúc đó ta có Kgh và chu kì của dao động là
Tgh.Tham số bộ PID chọn theo bảng sau:
 Tính chọn
Ta dựa vào phương pháp thứ 2 của Ziegler-Nichols.
Tham số cho bộ điều khiển PI chọn theo bảng trên ta được:
Tính Kp: Kgh=3 =>Kp=3*0.45=9/5
Tính Ki:vì em lựa chọn thời gian trích mẫu để tính toán sai lệch(erros)
là 25ms nên Tgh=25/1000(s)=>Ki=(25/1000)/1.2=1/48
Phần 4:Giải thuật lập trình
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.4a Advanced
Automatic Program Generator
© Copyright 1998-2009 Pavel Haiduc, HP InfoTech s.r.l.


Project :DIEU KHIEN TOC DO DONG CO DC SU DUNG XUNG AP
Version :
Date : 6/16/2011
Author : Mr.TIEN
Company : Mobile: 0917 54 28 45
Comments:
Chip type : ATmega16
Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#include <delay.h>
#define Pwm_dc OCR1AL
#define C0 PINC.0
#define C1 PINC.1
#define C2 PINC.2
#define C3 PINC.3
#define C4 PINC.4
#define C5 PINC.5
#define C6 PINC.6
#define C7 PINC.7
#define B0 PINB.0
//#define B0 PINB.0
//so xung trong 25ms
int encoder=0;
//bien chay 25lan trong timer0 = 25ms

int t=0,a=0;
//bien tinh toan PID
int erros=0,old_erros=0,Pvari=0,Ivari=0,Dvari=0,Ura=0;
//bien thiet lap so xung/20ms
int sp=0;
bit b=0,lock=0;
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>
// External Interrupt 2 service routine
interrupt [EXT_INT2] void ext_int2_isr(void)
{
// Place your code here
encoder++;
}
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Reinitialize Timer 0 value
TCNT0=0xC0;
// Place your code here
if(lock==1)
{
t++;//tang t
}
}
// Declare your global variables here
void lcd_putnum(unsigned int i)

{
int m=0,n=0;
m=i/10;
n=(i-(m*10));
lcd_putchar(m+48);
lcd_putchar(n+48);
}
//
void set_PID(int set_point)
{
erros=set_point-a; //yytytytytytytytuytururyeiureyrutytutyt
Pvari=(9/5)*erros;//0.45*3
Ivari+=(1/48)*(erros+old_erros);//(25/1000)/1.2
Ura+=Pvari+Ivari;
if(Ura<=0)
{
Ura=1;
}
if(Ura>=255)
{
Ura=254;
}
Pwm_dc=Ura;
old_erros=erros;
}
//
void THIET_LAP_TOC_DO()
{
lcd_clear();
lcd_gotoxy(0,0);

lcd_putsf(" BY Mr.TIEN");
lcd_gotoxy(0,1);
lcd_putsf("THIET LAP TOC DO");
delay_ms(2000);
lcd_gotoxy(0,1);
lcd_putsf(" ");
lcd_gotoxy(0,1);
lcd_putsf("SETPOINT=__/25ms");
//delay_ms(100);
sp=0;
b=0;
//delay_ms(50);
while(b!=1)
{
if(C0==0)
{
sp=6;
b=1;
}
else if(C1==0)
{
sp=9;
b=1;
}
else if(C2==0)
{
sp=12;
b=1;
}
else if(C3==0)

{
sp=15;
b=1;
}
else if(C4==0)
{
sp=18;
b=1;
}
else if(C5==0)
{
sp=21;
b=1;
}
else if(C6==0)
{
sp=24;
b=1;
}
else if(C7==0)
{
sp=27;
b=1;
}
};
lcd_gotoxy(9,1);
lcd_putnum(sp);
delay_ms(50);
}
//

void CHAY_HIEN_THI()
{
lcd_gotoxy(0,0);
lcd_putsf(" OK ");
delay_ms(2000);
lcd_gotoxy(0,0);
lcd_putsf("ENCODER=00/25ms");
lock=1;//bat dau tinh thoi gian
while(lock=1)
{
if(t==25)
{
t=0;//reset t
a=encoder;//gan
encoder=0;
set_PID(sp);
//
lcd_gotoxy(8,0);
lcd_putnum(a);
//
}
}
}
//
FINISH
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port A initialization

// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out
Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0
State0=0
PORTA=0x00;
DDRA=0xFF;
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In
Func1=In Func0=In
// State7=P State6=P State5=P State4=P State3=P State2=P State1=P
State0=P
PORTB=0xFF;
DDRB=0x00;
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In
Func1=In Func0=In
// State7=P State6=P State5=P State4=P State3=P State2=P State1=P
State0=P
PORTC=0xFF;
DDRC=0x00;
// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out
Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0
State0=0
PORTD=0x00;
DDRD=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 62.500 kHz

// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x04;
TCNT0=0xC0;
OCR0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 2000.000 kHz
// Mode: Ph. correct PWM top=00FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA1;
TCCR1B=0x02;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped

// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: On
// INT2 Mode: Falling Edge
GICR|=0x20;
MCUCR=0x00;
MCUCSR=0x00;
GIFR=0x20;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);
// Global enable interrupts
#asm("sei")
lock=0;
Pwm_dc=0;
b=0;
C0=1;

C1=1;
C2=1;
C3=1;
C4=1;
C5=1;
C6=1;
C7=1;
encoder=0;
while (1)
{
// Place your code here
if(B0==0)
{
THIET_LAP_TOC_DO();
CHAY_HIEN_THI();
}
};
}

×