Tạo PWM có chu kì: 20000us
Tạo timer 0
Khi bắt đầu cho timer 0 chạy thì bộ đếm của timer sẽ đếm dao động thạch anh, cứ 12 dao động cửa thạch anh thì bộ đếm timer 0 TL0 sẽ đếm tăng 1 , có thể nói timer 0 đếm chu kì máy đối với chế độ 8bit
TL0 là thanh ghi 8 bit nó đếm từ 0 đến 255 . Nếu nó đếm đến 256 thì nó tràn bộ đếm . TL0 lại quay về 0 và cờ ngắt TF0 tự động nạp lại giá trị 1 và ngắt được xảy ra
Timer0 = (255 – TL0) * 1us (2.3)
Như vậy để tạo được timer0 là 200us thì cần phải gán giá trị TL0 =5 5 thì nó đếm từ 55 – 255 tức là 200 lần thì ngắt mới xẩy ra.
Để điều khiển nhanh chậm của động cơ ta phải tạo ra các xung có độ rộng là 1%, 2%.......99%,100%.
Hình 2.11: Độ rộng xung
Như trên ta có độ rộng xung (khoảng thời gian kéo lên 5V) là T1. Xung có độ rộng 10% tức là T1/T=10%......
Hàm khởi tạo timer0
Như đã nói ở trên muốn có giá trị timer0 nào chỉ cần gán cho TL0 để cho thanh ghi đếm sau đó tràn nhưng ở đây do tạo timer là 100us nên ta dùng chế độ 2 8 bit tự nạp
void khoitaotimer0(void)// Ham khoi tao {
EA=0;// Cam ngat toan cuc
TMOD=0x02;// Timer 0 che do 2 8 bit auto reload TH0=0x37;// Gia tri nap lai 55 doi ra so hex
TL0=0x37;// Gia tri khoi tao 55 doi ra so hex ET0=1;// Cho phep ngat timer 0
EA=1;// Cho phep ngat toan cuc
TR0=1;// Chay timer 0 bat dau dem so chu ki may }
Hàm ngắt. bit PWM;
unsigned char dem=0;// Khai bao bien dem de dem tu 1 den 10
unsigned char phantram_PWM =10 ;// Bien chua phan tram xung(0...10) void timer0(void) interrupt 1 //Ngat timer 0
{
TR0=0;// Dung chay timer 0
TF0=0;// Xoa co, o che do co tu duoc xoa dem++;
if(dem>=phantram_PWM) PWM=1;// Neu bien dem >= phan tram xung thi dua gia tri 1 ra chan, xung 5V
else PWM=0;// Neu dem = phan tram xung
if(dem==100) dem=0;// Neu dem du 100 thi gan lai bang 0 de bat dau chu ki TR0=1;// Cho chay timer
}
Do yêu cầu bài toán là điều khiển thuận nghịch nên ta cần phải lưu biến PWM này. Do PWM có chu kì khơng đổi nên do đó ta chỉ cần thay đổi
phantram_PWM là có thể thay đổi được độ rộng xung.
2.2.4 Thiết kế sơ đồ khối bộ điều khiển chùm tia bức xạ
Hình 2.12: Sơ đồ khối bộ điều khiển chùm tia bức xạ
2.2.5 Thiết kế nguồn nuôi DC
Nguồn nuôi là một thành phần không thể thiếu được trong mạch của bộ điều khiển, mạch cung cấp nguồn +5V cho vi điều khiển và nguồn +12V cho động cơ.
Sơ đồ nguyên lý
Biến áp TR1 làm nhiệm vụ hạ áp từ điện áp AC 220V xuống điện áp AC15V. Bộ chỉnh lưu cầu 4 điốt làm nhiệm vụ chỉnh lưu dòng xoay chiều AC 15V thành dòng 1 chiều DC 15V.
2 IC có nhiệm vụ ổn áp cho ra nguồn +5V cấp nguồn nuôi cho vi điều khiển và nguồn +12V cấp cho motor.
Các tụ điện có nhiệm vụ lọc nguồn, giúp điện áp đầu ra phẳng hơn
2.2.6 Thiết kế mạch vi điều khiển
Sơ đồ nguyên lý
Hình 2.14: Sơ đồ mạch vi điều khiển
Nguyên lý hoạt động
Các chân nhận tín hiệu điều khiển từ nút bấm : P1_0; P1_1; P1_2; P1_3; P1_4. Khi nút tương ứng được bấm thì chân vi điều khiển sẽ nhận tín hiệu ở mức thấp (0V) và thực hiện lệnh.
Các chân điều khiển động cơ: P0_1 và P0_2 điều khiển quay thuận; P0_3 và P0_4 điều khiển quay nghịch. Tốc độ động cơ phụ thuộc vào độ rộng xung ra ở các chân từ P0_1 đến P0_3 của vi điều khiển.
Các chân điều khiển đèn led báo trạng thái: P2_2; P2_3; P2_4. Khi tín hiệu chân ra ở mức thấp (0V) đèn sáng, khi tín hiệu chân ra ở mức cao (5V) đèn tắt.
Các chân điều khiển led 7 thanh đôi để hiển thị tốc độ: P3_0; P3_1; P3_2; P3_3; P3_4; P3_5; P3_6. Tốc độ hiển thị ở đây được tính theo phần trăm độ rộng xung trong 1 chu kỳ, tức là phần trăm của tốc độ lớn nhất.
2.2.7 Thiết kế mạch cầu điều khiển Motor
Động cơ được dùng ở đây là loại DC 12V, nên yếu tố quan trọng để điều khiển động cơ quay thuận nghịch, điều chỉnh được tốc độ ở đây là các transistor, vừa đóng vai trị là khóa điện tử - giúp đóng mở dịng, vừa đóng vai trị khuếch đại (do dòng ra của các chân vi điều khiển rất bé, chỉ cỡ vài chục µA). Vì vậy việc lựa chọn loại transistor phù hợp là rất quan trọng. Qua quá trình tìm hiểu và thử nghiệm nhiều loại transistor khác nhau, loại transistor được dùng trong mạch là 2 loại BJT công suất Q1, Q3 và Q2, Q4 và được mắc thành mạch cầu H như trong hình.
Hình 2.15: Mạch cầu điều khiển Motor
Nguyên lý hoạt động
Điện áp cao nhất mà 2 loai BJT này chịu được là 100V và dòng tối đa là 6A. BJT npn Q2, Q4 có thể kích trực tiếp, riêng BJT pnp Q1, Q3 cần dùng thêm 1 BJT loại npn Q0-1, Q0-3 làm “mạch kích”.
Khi điện áp lối vào L1 ở mức thấp, BJT Q0-1 không hoạt động, không tồn tại dịng IC của BJT này, nghĩa là khơng có dịng IB của BJT Q1, Q1 vì thế khơng hoạt động và tương đương một khóa Q1 mở. Khi L1 được ở mức cao, 5V, BJT Q0-1 bão hòa (mạch E chung), dòng IC của Q0-1 xuất hiện và cũng là dịng
IB của BJT Q1. Q1 vì thế cũng bão hịa và tương đương một khóa đóng, tương tự như vậy với L2, R1 và R2. Như vậy, chúng ta có thể dùng các mức điện áp chuẩn 0V và 5V để kích các BJT dùng trong mạch cầu H cho dù điện áp nguồn có thể lên vài chục hay trăm Volt.
Các đường L1, L2, R1 và R2 sẽ được vi điều khiển (89C51) điều khiển. Khi có điện áp lối vào ở L1 và R2 thì sẽ khơng có điện áp lối vào ở L2 và R1, tương ứng Q1 và Q4 đóng, Q2 và Q3 mở, động cơ sẽ quay thuận. Ngược lại động cơ sẽ quay nghịch.
Do BJT có thể được kích ở tốc độ rất cao nên ngoài chức năng đảo chiều, mạch cầu H dùng BJT có thể dùng điều khiển tốc độ motor bằng cách áp tín hiệu PWM vào các đường kích.
4 điốt ở đây được dùng để chống hiện tượng dòng ngược, giúp bảo vệ các BJT.
2.2.8 Viết lưu đồ chương trình
Do u cầu của bài tốn ứng dụng trên thực tế là khi nhấn nút thì động cơ chuyển tác động tương ứng với các chế độ : Stop, thuận , nghịch , tăng , giảm nên ta viết các lưu đồ như sau:
Hình 2.16: Lưu đồ chương trình phục vụ ngắt Chương trình chính Ngơ Tiến Mạnh 52 Phục vụ ngắt Timer 0 Dem++ dem > phantram_PW M PWM=1 Chương trình chính PWM=0 Dem= 100 Dem=0 exit
Hình 2.17: Lưu đồ chương trình chính
2.2.9 Viết chương trình cho vi điều khiển
Có hai loại ngơn ngữ chính được dùng để viết cho vi điều khiển là Assemble và C. Do tính đơn giản, khả năng ứng dụng rộng rãi nên đề tài viết chương trình cho vi điều khiển 89C51 bằng ngơn ngữ C. Dưới đây là chương trình đã được viết dành cho vi điều khiển:
Begin Stop Thuận Nghịch P1 _0 P1_ 1 P1_ 2 P0_2=pwm P0_3=pwm P0_4=0 P0_5=0 Báo hiệu
Khai báo các biến Khởi động Timer0 Khởi tạo Stack
P0_2=0 P0_3=0 P0_4=0 P0_5=0 Báo hiệu P0_2=0 P0_3=0 P0_4=1 P0_5=1 Báo hiệu
exit exit exit
P1 _3 P1 _4 Tăng tốc Giảm tốc Phantram_pwm - - Hiển thị Phantram_pwm ++ Hiển thị exit exit Phục vụ ngắt Timer0
/* Dinh nghia cac nut */ #define stop P1_0 #define thuan P1_1 #define nghich P1_2 #define tang P1_3 #define giam P1_4 bit PWM;
unsigned char dem=0;
unsigned int phantram_PWM=50; /* Ham tao thoi gian tre */
void delay(long time)
{ long n;for(n=0; n<time; n++){;}} /* Hien thi gia tri tang giam toc */ unsigned char
LED[10]={0x40,0xf9,0x24,0x30,0x19,0x12,0x02,0xf8,0x80,0x10}; void hienthi(unsigned char digit1, unsigned char digit2)
{/*Hien thi so thu nhat */P3=LED[digit1];P0_0=1;delay(10);P0_0=0; /*Hien thi so thu hai */P3=LED[digit2];P0_1=1;delay(10);P0_1=0;}
/* Khoi tao Timer 200us */ void khoitaohethong() {//ES=1; EA=0;
TMOD=0x02; // che do 8 bit tu nap TH0=0x37; // nap gia tri 55 ma hex TL0=0x37; EA=1;TR0=1;ET0=1;} /* Ngat tao ra PWM */
void ngat_timer0(void) interrupt 1
{TR0=0;TF0=0;dem++;if(dem>=phantram_PWM)
{PWM=1;} else{PWM=0;}if(dem==100) dem=0; TR0=1;} /* Ham dung dong co */
void stopdc(void)
{P0_2=0; P0_3=0; P0_4=0; P0_5=0; P2_2=0; P2_3=1; P2_4=1;} /* Ham quay thuan */
void quaythuan(void)
{P0_2=PWM; P0_3=PWM; P0_4=0; P0_5=0; P2_3=0; P2_2=1;P2_4=1;} /* Ham quay nghich */
{P0_2=0; P0_3=0; P0_4=1; P0_5=1; P2_4=0; P2_3=1; P2_2=1; } /* Ham dieu khien tang toc */
unsigned char tangtoc(void)
{if(tang==0) {while(tang==0) {;}phantram_PWM--; delay(10); if(phantram_PWM<1) {phantram_PWM=1; }}
return (phantram_PWM); } /* Ham dieu khien giam toc */ unsigned char giamtoc(void)
{if(giam==0) {while(giam==0) {;}phantram_PWM++;delay(10); if(phantram_PWM>100) {phantram_PWM=100; }}
return (phantram_PWM); } /* Lua chon chieu quay */ unsigned char n;
unsigned char chonchedo(void)
{if(stop==0) n=1; if(thuan==0) n=2; if(nghich==0) n=3; switch(n)
{case 0: {break;} case 1: {stopdc();break;}
case 2: {quaythuan();break;} case 3: {quaynghich();break;} }
return (n); }
/* Chuong trinh chinh */ void main() { khoitaohethong(); while(1) { tangtoc(); giamtoc(); chonchedo(); hienthi((100-phantram_PWM)/10,(100-phantram_PWM)%10); } }
Sau khi đã viết được chương trình cho vi điều khiển thì cần chuyển sang dạng file *.hex và dùng mạch nạp để nạp vào vi điều khiển. Đề tài sử dụng loại mạch nạp có sẵn trên thị trường, nạp được hầu hết các dòng chip 8051 của atmel, kết nối với máy tính qua cổng USB
Hình 2.18 Mạch nạp cho vi điều khiển Các chương trình cần có cho kit nạp
PL2303_Prolific_DriverInstaller_v1210
Pl51M
2.2.11Thiết kế bộ cơ khí điều khiển điều khiển chùm tia bức xạ
Bộ cơ khí điều khiển được biễu diễn như dưới hình
Hình 2.19: Minh họa bộ truyền động
Trục quay của motor được truyền qua một hệ các bánh răng truyền động tới giá đỡ của tấm chì.
Motor được nối với mạch điều khiển qua một hệ thống dây dài đảm bảo khoảng cách đến phịng chiếu an tồn.
Cửa sổ lắp vào bộ cơ được gắn 1 tấm chì dày 3mm, kích thước 70 x 100 mm, đảm bảo có thể che chắn hết tia X từ cửa sổ 43 x 57 mm của máy phát.
2.2.12.1 Lắp ráp mạch
Hình 2.20: Mạch đã lắp ráp
Mạch đã được lắp ráp như trên Hình 2.20 theo sơ đồ nguyên lý nguồn nuôi, mạch vi điều khiển, mạch điều khiển motor. Mạch đã chạy được và điều khiển được động cơ, đồng thời đảm bảo các yêu cầu thiết kế ban đầu: quay thuận, quay nghịch, dừng, tăng tốc, giảm tốc, báo trạng thái và hiển thị tốc độ
2.2.12.2 Chế tạo bộ cơ
Hình 2.21 Bộ cơ đã được chế tạo và lắp vào cửa sổ máy phát Bộ cơ đã được chế tạo theo thiết kế đề ra. Cửa sổ lắp vào bộ cơ được gắn 1 tấm chì dày 3mm, kích thước 70 x 100 mm. Bộ cơ được lắp vào cửa sổ máy phát như trên Hình 2.21, đảm bảo che chắn hết chùm tia máy phát.
3.1Khảo sát tốc độ của bộ điều khiển
Bộ điều khiển có chức năng hiển thị tốc độ theo phần trăm độ rộng xung (thời gian có xung mức cao) trong một chu kỳ, tức là phần trăm của tốc độ lớn nhất. Để tiện cho việc chiếu chụp và tính tốn cho bộ điều khiển ta tiến hành đo đạc thực tế, chuyển tốc độ này về vận tốc cửa sổ (mm/s). Kết quả đo được ở bảng sau: