Thiết kế mạch điều khiển động cơ

Một phần của tài liệu thiet ke che tao bo dieu khien pid so (Trang 90)

6. Bố cục của đề tài

4.4.Thiết kế mạch điều khiển động cơ

4.4.1. Khối nguồn (15V)

Hình 4.2: Sơ đồ mạch nguyên lý khối nguồn

Trong mạch sử dụng 1 modul nguồn 15V cung cấp cho mạch lực và phần ứng động cơ.

- Mạch nguồn với điện áp đầu vào xoay chiều 18-24V lấy từ biến áp, qua chỉnh lƣu 2 nửa chu kỳ bằng cầu diode, thu đƣợc điện áp 1 chiều 18-24V. Sau khi thu đƣợc điện áp 18- 24V ta lắp thêm IC ổn áp LM7815 mắc song song để thu đƣợc điện áp đầu ra 15V. Trƣớc IC ổn áp ta mắc thêm trở để giới hạn dòng cho áp LM7815 và transistor.Transistor này có nhiệm vụ kích dòng đầu ra khi tải có dòng lớn. Ở đầu ra của IC ổn áp ta mắc thêm tụ lọc nguồn dùng để san phẳng điện áp đầu ra sau chỉnh lƣu.

91

4.4.2. Thiết kế mạch điều khiển

Hình 4.3: Sơ đồ nguyên lý mạch điều khiển

Mạch điều khiển đƣợc cấp nguồn riêng 5V từ cổng USB đồng thời cũng là cổng giao tiếp truyền nhận dữ liệu với máy tính.

- Mạch điều khiển bao gồm các khối tạo dao động cho chíp xử lý trung tâm là pic 18F4550, các khối kết nối với mạch lực và nhận tín hiệu từ ecoder. Ngoài ra mạch điều khiển còn đƣợc trang bị thêm các khối điều khiển bằng tay là các biến trở đƣợc kết nối với đầu vào ADC của chíp, và các nút bấm dự phòng cho việc phát triển thêm các thiết bị cần điều khiển về sau.

92

4.4.3. Thiết kế mạch lực

- Opto couplerPC817 (hay còn gọi là cách ly quang): Là linh kiện tích hợp có cấu tạo gồm 1 led và 1 photo diot hay 1 photo transistor. Khi có dòng nhỏ đi qua 2 đầu của led trong opto làm cho led phát sáng. Đƣợc sử dụng để cách ly áp giữa hai khối vi xử lý và khối công suất nhằm bảo vệ khối vi xử lý, đồng thời tránh nhiễu cho động cơ. Vì đôi khi động cơ chạy quá dòng thì dòng trả về lớn làm chết linh kiện ở mạch điều khiển, nếu không có cách ly quang thì dòng điện lớn sẽ theo đƣờng mạch đến tiêu diệt vi điều khiển và toàn bộ những linh kiện khác. Ngõ ra của Opto (chân 3 và 4) đƣợc dẫn khi ngõ vào (chân 1) ở mức 1 (tƣơng đƣơng điện áp 5V).

- Relay 6S1 (12V): Dùng đảo chiều quay động cơ

Dòng đóng ngắt là 12v-5A để đảo chiều là phù hợp. Do điện trở cuộn dây relay là 2,5Ω điện áp đóng ngắt relay là 12v và dòng tối đa để đóng ngắt relay là 5A, chọn R=100 Ω. Vì vậy theo nguyên lý dòng điều khiển phải đƣợc khuếch đại trƣớc khi tới điều khiển relay để đảm bảo dòng kích relay trong trƣờng hợp đó có thể dùng transistor hoặc 1 con IC…thông thƣờng ta dùng ULN2803.

- MOSFET IRF 540: Mạch công suất sử dụng transistor hiệu ứng trƣờng MOSFET IRF 540 có khả năng cung cấp dòng lớn lên đến 22A, điều khiển bằng áp trên ngõ vào G. Mạch kích đƣợc lựa chọn là đẩy kéo (PUSH PULL) cho đáp ứng xung tốt.

Tính chọn Mosfet:

Công suất tiêu tán trên mosfet bao gồm hai thành phần: Công suất tiêu tán khi mosfet dẫn và công suất chuyển mạch.

𝑃𝑡𝑡 = 𝑃𝑑 + 𝑃𝑠𝑤

Công suất tiêu tán khi mosfet dẫn đƣợc tính theo công thức:

𝑃𝑑 = 𝐼2. 𝑅𝐷𝑆𝑜𝑛.𝑇𝑜𝑛 𝑇

Theo dataseet của IRF 540:

𝑅𝐷𝑆𝑜𝑛𝑀𝑎𝑥 = 5Ω (𝑇𝑗 = 1500𝐶), 𝐼𝑚𝑎𝑥 = 2,5𝐴, 𝑇𝑜𝑛

𝑇 𝑚𝑎𝑥 = 1

𝑃𝑑𝑚𝑎𝑥 = 52. 2,5 = 62,5𝑊

Tổn hao trong quá trình chuyển từ off sang on:

𝐸1 = 𝜈𝑑𝑠 𝑡 . 𝑖𝑑𝑠 𝑡 . 𝑑𝑡 = 𝐼𝐷𝑆(𝑉𝐷𝑆 −𝑉𝐷𝑆 𝑡𝑟 𝑡𝑟 𝑡𝑟 𝑡). 𝑑𝑡 =1 2𝑉𝑐𝑐. 𝐼𝐷𝑆. 𝑡𝑟

93 𝐸2 = 𝜈𝑑𝑠 𝑡 . 𝑖𝑑𝑠 𝑡 . 𝑑𝑡 = 𝑡𝑟 1 2𝑉𝑐𝑐. 𝐼𝐷𝑆. 𝑡𝑓 𝑃𝑠𝑤 =1 2𝑉𝑐𝑐. 𝐼𝐷𝑆. 𝑡𝑟 + 𝑡𝑓 . 𝑓𝑠𝑤

Tần số điều xung đƣợc sử dụng ở đây là 24KHz, trong phần mềm sử dụng 2000 mức điều xung, tuy nhiên, ta chỉ cần mạch đáp ứng 100 mức điều xung ( vì thời gian đáp ứng càng nhanh thì giá trị dòng đỉnh nạp tụ ngõ vào của mosfet càng lớn, ta không muốn dòng đỉnh này quá lớn). Thời gian chia mức điều xung này là: 1/(24.1000.100)=0,417𝜇s= 417ns. Tổng thời gian nạp và xả tụ ngõ vào tại cực G phải nhỏ hơn giá trị này. Ta chọn

𝑡𝑟 + 𝑡𝑓 = 200𝑛𝑠.

𝑃𝑠𝑤 = 30.5.200. 10−9. 24. 103 = 0,72𝑊

Trong đó 𝑓𝑠𝑤 là tần số chuyển mạch Công suất tổng cộng lớn nhất: (adsbygoogle = window.adsbygoogle || []).push({});

𝑃𝑡𝑡 = 𝑃𝑑 + 𝑃𝑠𝑤 = 62,5 + 0,72 = 63,2𝑊

Vậy MOSFET IRF 540 có các thông số: 𝑉𝐷𝑆𝑆 = 100𝑉, 𝐼𝐷𝑆 = 33𝐴, 𝑃𝑚𝑎𝑥 = 130𝑊

thỏa mãn các yêu cầu đề ra.

-TIP41:Tip41và điện trở công suất đƣợc sử dụng trong mạch nhằm mục đích thay đổi công suất tải. Khi điện áp phát ra từ máy phát tốc sẽ đƣợc tiêu tán trên thành phần điện trở, việc thay đổi công suất chính là thay đổi dòng ngắn mạch đặt lên thành phần điện trở.Ở đây ta chọn Tip41 với Uce = 40v, Ic = 6A, R = 0.47–5w. Đủ đáp ứng với điện áp phát ra từ máy phát là 12V , I = 0.6A.

94

95

4.4.4. Thiết kế giao diện điều khiển Labview

96

Hình 4.6: Giao diện điều khiển Front panel

4.4.5. Lƣu đồ thuật toán

Begin Start

Thiết lập giao tiếp USB Tạo khối chức năng giao

tiếp

Xử lý các ngắt

Đọc các giá trị I/O, ADC

Xử lý truyền thông Truyền lên máy các giá

trị, PIN IN, ADC Nhận gía trị điều khiển:

PWM, I/O Xuất tín hiệu PWM End Không có lệnh kết nối Xác nhận kết nối S Đ S Đ

97

4.5. Kết quả đạt đƣợc

Hình 4.7: Đặc tính điều khiển tốc độ khi không tải

98

99

Hình 4.10: Sơ đồ mạch in toàn bộ mạch

100

Chƣơng V: Kết luận và kiến nghị

5.1. Kết luận

Sau khi nghiên, cứu hoàn thành đề tài: “ Thiết kế, chế tạo mô hình điều khiển động cơ điện một chiều sử dụng bộ điều khiển PID số” cho sinh viên ngành Điện trƣờng ĐHSP kỹ thuật Hƣng Yên đề tài đã thực hiện đúng các mục tiêu và nội dung đăng ký, đề tài cũng đạt đƣợc các vấn đề nhƣ sau:

 Nghiên cứu cơ sở lý thuyết về động cơ điện một chiều, bộ điều khiển PID số và các phƣơng pháp thiết kế bộ điều khiển.

 Kết hợp phần mềm Eagle chế tạo mạch lực và mạch điều khiển điều khiển động cơ DC. (adsbygoogle = window.adsbygoogle || []).push({});

 Sử dụng phần mềm Labview dùng để khảo sát, mô phỏng, khiết kế và kết nối với máy tính quá cổng USB.

5.2. Kiến nghị

Bên cạnh những vấn đề đạt đƣợc trong quá trình xây dựng đề tài, việc hoạch toán kinh phí chƣa sát thực đã khiến chúng tôi không thể phát triển đề tài một cách trọn vẹn nhƣ mong muốn. Vì thế, chúng tôi đề nghị hƣớng phát triển tiếp theo của đề tài nhƣ sau:

 Điều khiển động cơ bằng phƣơng pháp điều khiển hiện đại mờ PID hoặc bộ điều khiển ứng dụng mạng Noron.

 Mở rộng đối tƣợng điều khiển là các loại động cơ khác nhau, lò nhiệt, bình mức...  Phát triển hệ thống điều khiển và giám sát động cơ qua web.

101

TÀI LIỆU THAM KHẢO

1. Bùi Quốc Khánh, Nguyễn Văn Liễn và Nguyễn Thị Hiền - Truyền động điện - NXB KHKT, 2006.

2. Lại Khắc Lãi, Nguyễn Nhƣ Hiền – Giáo trình điều khiển số - NXB KHKT, 2007

3. Bùi Quốc Khánh, Nguyễn Văn Liễn, Phạm Quốc Hải, Dƣơng Văn Nghi – Điều chỉnh tự động truyền động điện - NXB khoa học kỹ thuật.

4. Nguyễn Bá Hải –Giáo trình lập trình Labview – ĐHSP kỹ thuật TP HCM 5. Nguyễn Văn Hòa –Cơ sở lý thuyết điều khiển – NXB khoa học kỹ thuật. 6. Phạm Công Ngô –Lý thuyết điều khiển tự động - NXB khoa học kỹ thuật. 7. Nguyễn Ngọc Phƣơng –Điều khiển tự động – NXB giáo dục.

102

PHỤ LỤC Chƣơng trình điều khiển

//========================================================= #include <18F4550.h> // Definición de registros internos del PIC18F2550.

#DEVICE ADC=10 // CAD a 10 bits, justificación a a la derecha. #fuses

MCLR,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV 1,VREGEN,NOPBADEN

#use delay(clock=48000000)

//========================================================= // Incluimos librerías utilizadas por la aplicación.

#include <pic18_usb.h> // Drivers's USB del PIC18F2550.

#include <main.h> // Definición de funciones y hardware utilizado en el programa. #include <easyHID.h> // Descriptores HID del proyecto.

#include <USB.c> // Funciones del USB. // Usamos fast_io, en los puertos B y C.

#use fast_io(b) #use fast_io(c) #use fast_io(d) void USB_debug()

{

LED_ON(LED_RED); // Enciende el led error y apaga el led USB_OK. LED_OFF(LED_GREEN);

usb_wait_for_enumeration(); // Espera a ser enumerado por el host.

LED_ON(LED_GREEN); // Enciende el led USB_OK y apaga el led USB_ERROR. LED_OFF(LED_RED); } void config_adcon2(void) { #asm movlw 0b10111110 iorwf 0xFC0,1

103 #endasm } int32 count,so_vong,int_count1,x; //#define INTS_PER_SECOND1 19 #define INTS_PER_SECOND1 19 #int_rtcc // Ngat Timer 0

void Timer0_isr() // Dem so vong quay dong co {

count++; }

#INT_TIMER1 // Chuong trinh ngat Timer 1 (adsbygoogle = window.adsbygoogle || []).push({});

void Timer11_isr() { // Ham duoc goi khi TImer1 tran (65535->0) // Xap xi 19 lan / giay

// int_count1 = INTS_PER_SECOND1;

so_vong = (count*255 + get_timer0())*60*19; count = 0;

set_timer0(0); }

//======================================================

void main(void) // Funciosn Principal. {

// Variables globales.

int8 recebe[USB_EP1_RX_SIZE]; // Declaramos la variable recebe de 32 bytes. int8 envia[USB_EP1_TX_SIZE]; // Declaramos la variable envía de 32 bytes. int8 valorPWM1_H=0; // Valor del semiperiodo alto del PWM1. int8 valorPWM2_H=0; // Valor del semiperiodo alto del PWM2. int8 valorPWM1_L=0; // Valor del semiperiodo bajo del PWM1. int8 valorPWM2_L=0; // Valor del semiperiodo bajo del PWM2. int8 valorPWM1=0; // Variable que contiene el valor del PWM1. int8 valorPWM2=0; // Variable que contiene el valor del PWM2.

int8 valor_adc=0; // Contiene el MSB del valor del ADC // Configuraciones varias.

set_tris_d(0x00); // Nibble bajo salidas, el alto entradas. output_d(0x00); // Inicializamos las salidas a 0.

104 set_tris_c(0b00111000); // RC0,RC1,RC2,RC6,RC7,como salidas. Las demás

// set_tris_b(0b11111111); // RC4,RC5, como entradas.

setup_timer_2(T2_DIV_BY_16, 255, 16);

setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM);

setup_adc_ports(AN0_TO_AN7); // Configura canales usados por el ADC. setup_adc(ADC_CLOCK_DIV_64); // Asigna la velocidad: relog\64.

config_ADCON2(); // Configuramos el ADCON2. int_count1 = INTS_PER_SECOND1;//19 lan 1 giay

setup_timer_0 (RTCC_DIV_1|RTCC_EXT_H_TO_L); // Timer0 is Counter set_timer0(0);

set_timer1(0);

setup_timer_1(T1_INTERNAL | T1_DIV_BY_4); // Timer1 is Timer enable_interrupts(INT_RTCC);

enable_interrupts(INT_TIMER1); //enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); count = 0;

so_vong = 0;// khoi tao gia tri

LED_OFF(PWM1); // Apagamos ambos canales PWM. LED_OFF(PWM2);

usb_init(); // Inicializamos el stack USB.

usb_task(); // Habilita el periferico usb y las interrupciones.

USB_debug(); // Nos muestra el estado de conección del USB. while (TRUE) // Bucle infinito.

{

if(usb_enumerated()) // Si el dispositivo está configurado... {

set_pwm1_duty(valorPWM1); set_pwm2_duty(valorPWM2); }

// Leemos el estado de los pulsadores.

105 if(input_state(SW2)==0x01){envia[1]=0x01;}else{envia[1]=0x00;} if(input_state(SW3)==0x01){envia[2]=0x01;}else{envia[2]=0x00;} if(input_state(SW4)==0x01){envia[3]=0x01;}else{envia[3]=0x00;} if(input_state(SW5)==0x01){envia[4]=0x01;}else{envia[4]=0x00;} if(input_state(SW6)==0x01){envia[5]=0x01;}else{envia[5]=0x00;} if(input_state(SW7)==0x01){envia[6]=0x01;}else{envia[6]=0x00;} if(input_state(SW8)==0x01){envia[7]=0x01;}else{envia[7]=0x00;} // Leemos 2 canales analógicos del PIC. (adsbygoogle = window.adsbygoogle || []).push({});

set_adc_channel(0); // Selecionamos o canal e começamos a ler. delay_us(10); // Esperamos um tempo para estabilizar os dados lidos. valor_adc = (read_adc()/4);

envia[8]=valor_adc; // Enviamos os dados. set_adc_channel(1); // Selecionamos o canal e começamos a ler.

delay_us(10); // Esperamos um tempo para estabilizar os dados lidos. valor_adc = (read_adc()/4);

envia[9]=valor_adc; // Enviamos os dados. set_adc_channel(2); // Selecionamos o canal e começamos a ler.

delay_us(10); // Esperamos um tempo para estabilizar os dados lidos. valor_adc = (read_adc()/4);

envia[10]=valor_adc; // Enviamos os dados.

set_adc_channel(3); // Selecionamos o canal e começamos a ler. delay_us(10); // Esperamos um tempo para estabilizar os dados lidos. valor_adc = (read_adc()/4);

envia[11]=valor_adc; // Enviamos os dados.

set_adc_channel(4); // Selecionamos o canal e começamos a ler.

delay_us(10); // Esperamos um tempo para estabilizar os dados lidos. valor_adc = (read_adc()/4);

envia[12]=valor_adc; // Enviamos os dados.

106 delay_us(10); // Esperamos um tempo para estabilizar os dados lidos.

valor_adc = (read_adc()/4);

envia[13]=valor_adc; // Enviamos os dados. set_adc_channel(6); // Selecionamos o canal e começamos a ler.

delay_us(10); // Esperamos um tempo para estabilizar os dados lidos.

valor_adc = (read_adc()/4);

envia[14]=valor_adc; // Enviamos os dados. set_adc_channel(7); // Selecionamos o canal e começamos a ler.

delay_us(10); // Esperamos um tempo para estabilizar os dados lidos. valor_adc = (read_adc()/4);

envia[15]=valor_adc; // Enviamos os dados. envia[16]=0; envia[17]=0; envia[18]=0; envia[19]=0; // su ly so lon envia[16]=so_vong/1000; envia[17]=(so_vong- envia[16]*1000)/100; envia[18]=(so_vong-envia[16]*1000-envia[17]*100)/10; envia[19]=so_vong-envia[16]*1000-envia[17]*100-10*envia[18];

usb_put_packet(1, envia, USB_CONFIG_HID_TX_SIZE, USB_DTS_TOGGLE); // Enviamos el paquete de datos por USB.

if (usb_kbhit(1)) // Si hay un paquete de datos del host.. en el buffer lo tomamos y guardamos en la variable data.

{

usb_get_packet(1, recebe, USB_CONFIG_HID_RX_SIZE); // En el buffer lo tomamos del EP1 y lo guardamos en la variable recebe.... if(recebe[0]==ATIVA_SAIDAS)

{ // Si recebe comando de control de salidas... output_d(recebe[1])

107 if(recebe[2]==PWM_CONTROL1) // Si recibimos el comando de control PWM1..

{valorPWM1=recebe[3];} // Tomamos el dato y lo procesamos.

if(recebe[4]==PWM_CONTROL2) // Si recibimos el comando de control PWM2..

{valorPWM2=recebe[5];} // Tomamos el dato y lo procesamos. }

} }

(adsbygoogle = window.adsbygoogle || []).push({});

Một phần của tài liệu thiet ke che tao bo dieu khien pid so (Trang 90)