Trong công nghiệp, động cơ điện một chiều đợc sử dụng ở những nơi yêu cầu moment mở máy lớn hoặc yêu cầu thay đổi tốc độ trong phạm vi rộng.
Một phần quan trọng của động cơ điện một chiều là bộ phận chỉnh lu, nó có nhiệm vụ là đổi chiều dòng điện trong cuộn rotor trong khi chuyển động quay của rotor là liên tục.Thông thờng bộ phận này là bộ phận gồm có một bộ cổ góp và một bộ chổi than tiếp xúc với cổ góp. Đây cũng chính là nhợc điểm chính của động cơ điện một chiều: cổ góp làm cho cấu tạo phức tạp, đắt tiền, kém tin cậy và nguy hiểm trong môi trờng dễ nổ, khi sử dụng phải có nguồn điện một chiều kèm theo hoặc bộ chỉnh lu.
Một trong những phơng pháp để điều khiển mô tơ là sử dụng mạch điều chế độ rộng xung (PWM circuit – Pulse With Modulation).
Mạch điều khiển mô tơ bằng phơng pháp PWM hoạt động dựa theo nguyên tắc cấp nguồn cho mô tơ bằng chuỗi xung đóng mở với tốc độ nhanh. Nguồn DC đợc chuyển đổi thành tín hiệu xung vuông (chỉ gồm hai mức 0 volt và xấp xỉ điện áp hoạt động). Tín hiệu xung vuông này đợc cấp cho môtơ. Nếu tần số chuyển mạch đủ lớn môtơ sẽ chạy với một tốc độ đều đặn phụ thuộc vào momen của trục quay.
Với phơng pháp PWM, điều chỉnh tốc độ của môtơ thông qua việc điều chế độ rộng của xung, tức là thời gian “đầy xung” (“on”) của chuỗi xung vuông cấp cho môtơ. Việc điều chỉnh này sẽ tác động đến công suất trung bình cấp cho môtơ và do đó sẽ thay đổi tốc độ của môtơ cần điều khiển.
Hình 5.5: Biểu đồ xung PWM
Ta ký hiệu chu kỳ làm việc(Dyty cyle) của chuỗi xung là D Khi đó biên độ điện áp của chuỗi xung là Umax
giá trị hiệu dụng của chuỗi xung vuông là u = Umax.D
Nếu giả sử nguồn phát xung phát ra các chuỗi xung có độ rộng xung lần lợt nh hình:5.5 trên thì điện áp hiệu dụng đo đợc trên tải lần lợt sẽ là:
u1 = 24.20% = 4.8V ⇒ D= 20% u2 = 24.50% = 12V ⇒ D = 50% u3 = 24.80% = 19.2V ⇒ D = 80%
Trên hình 5.5, với dãy xung điều khiển trên cùng, xung ON có độ rộng nhỏ nên động cơ chạy chậm. Nếu độ rộng xung ON càng lớn (nh dãy xung thứ 2 và thứ 3) động cơ DC chạy càng nhanh.
24V 0 24V 24V 0 0 20% Duty Cycle 50% Duty Cycle 80% Duty Cycle
5.3.1 Tạo xung bằng phần cứng:
Tạo xung bằng phần cứng thì cần dùng các vi mạch IC, Tranzitor… để thực hiện các khối chức năng trong bộ tạo xung PWM. Nh các khối tạo điện áp điều khiển, khối tạo xung răng ca, khối so sánh…
Tuy nhiên phơng pháp này hiện nay ít đợc sử dụng trong các khối tạo xung PWM do nhợc điểm của nó nh rất phức tạp để tạo các khối PWM phức tạp, không linh hoạt, thông thờng thay đổi tốc độ bằng tay, tốc độ chỉnh khó chính xác (phải canh chỉnh và đánh dấu vị trí điều chỉnh t ơng ứng với tốc độ mong muốn).
5.3.2.Tạo xung bằng phần mềm:
Việc tạo xung theo phơng pháp này đợc thực hiện thông qua sự kết hợp giữa chíp của vi xử lý (phần cứng) và chơng trình điều khiển phần mềm (Assembly hoặc C) .Trong luận văn này ngôn ngữ C đợc chọn lựa do các u điểm của nó nh:
- C là ngôn ngữ thông dụng.
- C l ngôn ngữ rất hiệu quả và đà ợc a chuộng nhất để viết các phần mềm hệ thống nhúng và các ứng dụng điều khiển động cơ.
- Ngôn ngữ C có cấu trúc chặt chẽ, gọn, có các toán tử mạnh.
- Ngôn ngữ C rất thích hợp cho điều khiển thời gian thực và tốc độ thực hiện.
Trong luận văn này chíp vi xử lý đợc xử dụng là AVR Atmega8 Chơng trình Code mẫu để tạo PWM sử dụng AVR Atmega8 là:
void pwm_timer1(void) {
TCCR1A|=(1<<COM1A1)|(1<<COM1A0);//set on compare match //set to mode 8bit PWM phase and frequency correct 1Khz
TCCR1A|=(0<<WGM11)|(0<<WGM10); TCCR1B|=(1<<WGM13)|(0<<WGM12); ICR1=0x5e;
//set prescaler=64 , 8Mhz/64
TCCR1B|=(0<<CS12)|(1<<CS11)|(1<<CS10); }
Chơng trình con này có chức năng tạo xung PWM sử dụng chức năng Output compare của vi xử lý AVR Atmega8 tần số xung đợc tạo ra là f=1KHz, chu kỳ làm việc (Duty Cycle) D= 0.001s.
Tần số xung f và chu kỳ làm việc D đợc thay đổi linh hoạt, dễ dàng nhờ các bít nằm trong các thanh nghi TCCR1A, TCCR1B.
5.4. Lu đồ giải thuật chơng trình điều khiển vị trí tốc độ bằng PID rời–
rạc.
Bắt đầu
Khởi tạo trạng thái ban đầu cho hệ thống điều khiển
Đặt tốc độ/vị trí mong muốn bằng chiết áp
Khởi tạo và thiết lập đồng hồ hệ thống qua ngắt Time 0 với chu kỳ Ts
Nút khởi động hệ thống
Đọc vị trí /tốc độ đặt và giá trị hiện tại của chúng, đồng bộ theo đồng hồ hệ thống chu kỳ Ts
Dừng hệ thống điều khiển Hiển thị thông tin về
dòng, áp, tốc độ… lên màn hình LCD theo một tần số xác định Kết thúc S Đ
Vị trí/ tốc độ hiện tại ≥ giá trị đặt theo tần số Ts
Tính toán lượng điều khiển tương ứng (Control Offort) cho đối tư ợng theo luật PID dựa trên các dữ
liệu về vị trí, tốc độ, dòng, áp…
theo tần số đồng hồ hệ thống Ts để tăng tốc độ
Phát xung PWM dựa trên lượng điều khiển (Control Offort) được tính toán ở trên treo tần số Ts
Đ
Tính toán lượng điều khiển tương ứng (Control Offort) cho đối tư ợng theo luật PID dựa trên các dữ liệu về tốc độ, dòng, áp theo tần …
số đồng hồ hệ thống Ts để giảm tốc độ
S
Hình 5.6 Lu đồ giải thuật chơng trình điều khiển vị trí – tốc độ bằng PID rời rạc.
Dừng động cơ
Dừng (điều khiển vị trí )
5.5. Mô tả hệ thống thử nghiệm và kết quả thí nghiệm
Mô hình bố trí thiết bị hệ thống điều khiển vị trí, tốc độ động cơ điện một chiều đợc mô tả nh hình 5.6 dới đây.
Hình 5.7 Sơ đồ bố trí thiết bị của mô hình
Chức năng các nút:
- Nút bấm 1: dùng để bật, tắt động cơ. - Nút ấn 2 : Chọn chiều quay của động cơ.
- Nút ấn 3: Chọn các chế độ điều khiển và hiện thị của LCD: + Chế độ hiển thị và điều khiển tốc độ
+ Chế độ hiển thị và điều khiển PID + Chế độ hiển thị và điều khiển vị trí. - Ba triết áp: đặt vị trí và tốc độ
Nguyên lý làm việc và điều khiển:
Bật nguồn cấp điện cho toàn mạch, màn hình LCD hiển thị tốc độ đặt, để điều chỉnh tốc độ ta vặn chiết áp khi đặt xong ấn nút ấn 1 động cơ chạy theo tốc độ đặt. LCD I D P 1 3 2 Encoder Triết áp đặt vị trí và tốc độ Các nút bấm Chọn chế độ Các biến trở điều chỉnh PID Motor đĩa chia độ Dây nối
Để điều khiển chiều quay động cơ ta ấn nút 2 động cơ quay theo chiều ng ợc lại.
Để hiển thị dòng điện động cơ ta ấn nút 3.
Để điều chỉnh PID ta ấn nút 3 lần nữa màn hình hiển thị thông số của PID. Muốn chỉnh lại thông số của PID ta chỉnh 3 biến trở.
Để điều khiển vị trí ta ấn nút ấn 3 lần nữa màn hình LCD hiển thị giá trị đặt vị trí, muốn đặt vị trí ta điều chỉnh chiết áp.
Kết quả thí nghiệm:
Sau khi nghiên cứu, phân tích và tổng hợp hệ thống trên cơ sở lý thuyết, sử dụng phần mềm Matlab tìm đợc các tham số của bộ điều khiển. Trên cơ sở đó tác giả đã xây dựng một mô hình cụ thể cho một hệ thống điều khiển động cơ điện một chiều. Qua kết quả thực nghiệm trên hệ thống đã đạt đợc các yêu cầu sau:
Phần thực nghiệm hệ thống đã minh chứng khả năng làm việc, khả năng điều khiển hệ thống khi sử dụng vi xử lý kết hợp với thuật toán PID số phần mềm và hệ vi xử lý đạt kết quả tốt. Hệ thống có khả năng điều khiển và ổn định tốc độ, vị trí với sai số nhỏ so với tính toán trên lý thuyết.
Kết luận
Với đề tài "Điều khiển số vị trí, tốc độ động cơ điện một chiều dùng vi xử lý " trong nội dung của luận văn đã giải quyết đợc một số vấn đề cơ bản và thu đợc kết quả nh sau:
1. Nghiên cứu xây dựng cơ sở lý thuyết cho hệ thống điều khiển số tốc độ, vị trí dùng vi xử lý. Mô phỏng và kiểm nghiệm hệ thống truyền động điện bằng phần mềm Matlab.
2. Từ cơ sở lý thuyết của hệ thống nghiên cứu, thiết kế mạch điều khiển, mạch động lực điều chỉnh tốc độ, vị trí động cơ điện một chiều dùng vi xử lý ATMEGA8
3. Nghiên cứu khảo sát hệ vi xử lý và phần mềm điều khiển. Xây dựng phần mềm điều khiển hệ thống thông qua hệ vi xử lý có tính thân thuộc cao, dễ điều khiển, hệ thống hoạt động ổn định.
4. Nghiên cứu thiết kế, lắp đặt hoàn chỉnh hệ thống (phần điện và phần cơ khí) đa hệ thống vào làm việc.
5. Qua kết quả thực nghiệm trên hệ thống đã đạt đợc các yêu cầu sau: - Quá trình quá độ của hệ thống đảm bảo đợc yêu cầu cho phép. Thời gian quá độ τqđ = 0.2 ữ 0.3 giây.
- Khi hệ thống làm việc ở chế độ xác lập tải không thay đổi thì hệ thống làm việc ổn định trong khoảng cho phép. Độ sai lệch tốc độ ∆ω < 2%.
6. Phần thực nghiệm hệ thống đã minh chứng khả năng làm việc, khả năng truyền động của hệ thống thông qua phần mềm và hệ vi xử lý đạt kết quả yêu cầu. Hệ thống có khả năng ổn định tốc độ và vị trí, các tín hiệu đ ợc hiển thị trên màn hình LCD.
7. Sản phẩm nghiên cứu đề tài gồm: Báo cáo Luận văn, mô hình thí nghiệm đáp ứng yêu cầu
Tài liệu tham khảo
1. Điều chỉnh tự động truyền động điện (Phạm Quốc Khánh, Phạm Quốc Hải, Nguyễn Văn Liễn, Dơng văn Nghi – Nhà xuất bản khoa học kỹ thuật)
2. Matlab và Simulink ( Nguyễn Phùng Quang – Nhà xuất bản khoa học và kỹ thuật, 2004).
3. Điện tử công xuất (Trần Trọng Minh – nhà xuất bản giáo dục, 2002).
4. Vi điều khiển với lập trình C (Ngô Diên Tập – Nhà xuất bản khoa học kỹ thuật)
5. Điều khiển số máy điện ( Lê Văn Doanh – Nhà xuất bản khoa học & kỹ thuật, 2001)
6. Điều khiển số ( Nguyễn Phùng Quang – Nhà xuất bản khoa học kỹ thuật, 2008)
7. Phân tích tổng hợp hệ thống điều khiển tự động truyền động điện (Trịnh Đình Đề, Võ trí An – nhà xuất bản khoa học kỹ thuât,1983)
Phụ lục
Chơng trình điều khiển hệ thống dùng ngôn ngữ C
#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <avr/wdt.h> #include "timming.h" #include "LCD_Lib.h"
#define PWMMAX1250 // max 2byte
extern volatile unsigned int encoder, encoderpos; volatile unsigned char screen=0;
volatile unsigned char dc_onoff=0, cworccw=0; volatile unsigned int currentmeasure=0;
volatile unsigned int speedmeasure=0, speedset=0;
volatile unsigned int Kpset=0.23, Kiset=0.001, Kdset=0.001; signed int e[10]={0};
volatile unsigned int posset=20; static int current_angle=0;
static long error_integral_angle=0; static int last_error_angle=0;
static int error_angle=0; void initIO(void) { //DC Motor: DC0 - PB1 // DC1 - PB2 //LCD:Data/Add PD4...PD7 // RS - PB6 // RW - PB7 // E - PB5
// BackLight - PB3 //Relay: PB0
//Keyboard: PC0 - PC1 - PC2 //Encoder: PD2 - PD3
DDRB = 0xFF;
PORTB = 0x08;//0000 1000 DC OFF RELAY OFF BACKLIGHT OFF PORTC = 0xFF; DDRC = 0x00; // PORTC = 0x00; // PORTD = 0xFF; DDRD = 0xF0; // PORTD = 0xF0; } void initADC(void) { ADCSRA = 0x8E; ADMUX |= 0x40|3; ADCSRA |= 0x40; } void init(void) { _delay_ms(200); initTimer0(); initIO(); LCDinit(); initADC(); initInterrupt(); wdt_enable(WDTO_2S);
sei(); }
void PowerSwitch(unsigned char Power) {
if (Power)
PORTB |= 0x01;// Chuyen che do nguon nuoi 12V else
PORTB &= 0xFE;// chuyen che do nguon nuoi 5V }
void DC_Control(unsigned char Power, signed int Velocity) { PowerSwitch(Power); if (Velocity>0) { TCCR1A = 0x22; OCR1B=Velocity; } else if (Velocity<0) { Velocity*=(-1); TCCR1A = 0x82; OCR1A=Velocity; } else TCCR1A = 0x02; }
signed int PIDcal(void) {
unsigned char i=0;
for (i=2; i>0; i--) {
e[i]=e[i-1]; sum+=e[i]; }
e[0]=(signed int)speedmeasure-(signed int)speedset; pid=Kpset*e[0]; pid+=Kiset*sum; pid+=Kdset*(e[0]-e[1]); if (pid>PWMMAX) pid=PWMMAX; if (pid<-PWMMAX) pid=-PWMMAX; e[1]=e[0]; return pid; } void Poscontrol(void) {
signed int pid_pos; long er_tam;
error_integral_angle=0; last_error_angle=0; error_angle=0;
tpwm_pos=220; // van toc dat ban dau encoderpos=0; while (dc_onoff) { current_angle = encoderpos*3.6; if ( current_angle < posset) {
error_angle= posset-current_angle;//tinh sai so //p
pid_pos = error_angle * Kpset; //i
error_integral_angle += error_angle;//tinh tich phan //gioi han tich phan
if(error_integral_angle>500) { error_integral_angle=500; } else if(error_integral_angle<-500) { error_integral_angle=-500; }
pid_pos += error_integral_angle * Kiset; //d
er_tam = error_angle - last_error_angle;//hieu sai so //gioi han sai so
if(er_tam>500) { er_tam=500; } else if(er_tam<-500) { er_tam=-500; }
pid_pos += er_tam * Kdset;
if(pid_pos > PWMMAX) pid_pos=PWMMAX; if(pid_pos < -PWMMAX) pid_pos = -PWMMAX; last_error_angle=error_angle;
tpwm_pos += pid_pos;
if (tpwm_pos <0) tpid = 0;
if (cworccw) // quay thuan DC_Control(0, tpwm_pos); else // quay nguoc DC_Control(0, -tpwm_pos); }
else {
DC_Control(0, 0); //dung motor encoderpos=0; dc_onoff=0; break; } } } void Speedcontrol(void) {
signed int tpid=0; if (dc_onoff)
{
tpid += PIDcal();
if (tpid > PWMMAX) tpid = PWMMAX; if (cworccw) // quay thuan
DC_Control(1, tpid);
else // quay nguoc DC_Control(1, -tpid);
}
else // dung motor DC_Control(1, 0);
}
int main(void) {
unsigned char i=0; init();
WriteArr(" Please wait...",0,0); for(i=0;i<50;i++) { LCDGotoXY(3,1); LCDprogressBar(i,50,10); } LCDclr(); LCDBackLight(LCDBLOFF); _delay_ms(500); while(1) { switch(screen) { case 0://Speed WriteArr("SpSet SpMea <>",0,0); WriteArr(" rps rps ",0,1); DisplayNumber(speedset,0,1); DisplayNumber(speedmeasure,7,1); break; case 1://Current WriteArr("Current: mA",0,0); DisplayNumber(currentmeasure,9,0); WriteArr(" ",0,1); break; case 2://PID
WriteArr("Px10 Ix10 Dx10",0,0); WriteArr(" ",0,1); DisplayNumber(Kpset*10,0,1); DisplayNumber(Kiset*10,6,1); DisplayNumber(Kdset*10,12,1); break; case 3://Position WriteArr("Position: deg",0,0); DisplayNumber(posset,10,0); WriteArr(" ",0,1); break; }
if (cworccw) // hien thi quay thuan LCDDisplayChar('>',15,1);
else // hien thi quay nguoc LCDDisplayChar('<',14,1);
if (screen==3) // Dieu khien vi tri Poscontrol();
else // dieu khien toc do Speedcontrol();
} return 0; }