Bài giảng Thiết kế hệ thống nhúng - Chương 2: Cấu trúc phần cứng hệ thống nhúng - Bài 3: Bộ xử lý chức năng đơn tiêu chuẩn - Thiết bị ngoại vi
Giới thiệu
• Bộ xử lý chức năng đơn
– Thực hiện các nhiệm vụ tính toán nhất định
– Bộ xử lý chức năng đơn chuyên biệt
• Thiết kế cho một nhiệm vụ duy nhất
– Bộ xử lý chức năng đơn “tiêu chuẩn"
• “Off-the-shelf” -- Thiết kế trƣớc cho một nhiệm vụ chung
• VD: ngoại vi
• Truyền thông nối tiếp
• ADC3
Timers, counters, watchdog timers
• Bộ định thời - Timer: dùng đo khoảng thời
gian
– Để phát ra các sự kiện đầu ra định thời
• VD: giữ cho đèn xanh sáng 10 s
– Để đo các sự kiện đầu vào
• VD: đo tốc độ xe
• Dựa trên việc đếm xung đồng hồ
• VD: giả sử chu kỳ Clk là 10 ns
• Và chúng ta đếm đƣợc 20,000 Clk
• Nhƣ vậy, 200 microsec đã trôi qua
• Bộ đếm 16-bit sẽ đếm tới 65,535*10 ns = 655.35
microsec., độ phân giải = 10 ns
• Top: biểu thị đạt đến số đếm cực đại, quay lại
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Tóm tắt nội dung tài liệu: Bài giảng Thiết kế hệ thống nhúng - Chương 2: Cấu trúc phần cứng hệ thống nhúng - Bài 3: Bộ xử lý chức năng đơn tiêu chuẩn - Thiết bị ngoại vi
CHƢƠNGEmbedded 2: Systems CẤU TRÚC Design: PHẦN A Unified CỨNG Hardware/SoftwareHỆ THỐNG NHÚNG Introduction Bài 3: Bộ xử lý chức năng đơn tiêu chuẩn - Thiết bị ngoại vi 1 Giới thiệu • Bộ xử lý chức năng đơn – Thực hiện các nhiệm vụ tính toán nhất định – Bộ xử lý chức năng đơn chuyên biệt • Thiết kế cho một nhiệm vụ duy nhất – Bộ xử lý chức năng đơn “tiêu chuẩn" • “Off-the-shelf” -- Thiết kế trƣớc cho một nhiệm vụ chung • VD: ngoại vi • Truyền thông nối tiếp • ADC 2 Timers, counters, watchdog timers • Bộ định thời - Timer: dùng đo khoảng thời gian – Để phát ra các sự kiện đầu ra định thời • VD: giữ cho đèn xanh sáng 10 s timer – Để đo các sự kiện đầu vào 16-bit up Clk 16 Cnt • VD: đo tốc độ xe counter • Dựa trên việc đếm xung đồng hồ Top • VD: giả sử chu kỳ Clk là 10 ns Reset • Và chúng ta đếm đƣợc 20,000 Clk • Nhƣ vậy, 200 microsec đã trôi qua • Bộ đếm 16-bit sẽ đếm tới 65,535*10 ns = 655.35 microsec., độ phân giải = 10 ns • Top: biểu thị đạt đến số đếm cực đại, quay lại 3 Bộ đếm - Counters • Counter: giống một timer, nhƣng Timer/counter đếm xung trên một tín hiệu đầu vào Clk 2x1 16-bit up 16 Cnt thay vì xung clk mux counter – VD: đếm số ôtô chạy qua một cảm biến Cnt_in Top – Đôi khi ta có thể cấu hình thiết bị nhƣ Reset một timer hoặc counter Mode 4 Cấu trúc timer khác • Timer theo khoảng 16/32-bit timer Bộ đếm tiến 16- – Biểu thị khi khoảng thời gian Clk Cnt1 Timer với một giá trị bit 16 yêu cầu trôi qua đếm đặt trước Top1 – Chúng ta đặt giá trị đếm cuối Bộ đếm tiến 16- Clk Cnt cùng cho giá trị yêu cầu bit 16 Bộ đếm tiến 16- Cnt2 • Số xung clk = khoảng bit 16 thời gian yêu cầu / chu Reset Top2 kỳ đồng hồ = • Bộ đếm ghép Top Timer với bộ chia Clk Bộ chia Bộ đếm tiến 16- • Bộ chia bit – Chia xung đồng hồ Giá trị đặt trƣớc – Tăng khoảng thời gian, giảm độ phân giải Mode 5 Ví dụ: Timer tác động Nút tác Đàn hiển /* main.c */ thị động #define MS_INIT 63535 LCD time: 100 ms void main(void){ int count_milliseconds = 0; configure timer mode • Đo khoảng thời gian giữa trạng thái đèn set Cnt to MS_INIT sáng và ngƣời dùng bấm nút wait a random amount of time turn on indicator light – Timer 16-bit, chu kỳ clk là 83.33 ns, counter start timer tăng sau mỗi 6 chu kỳ đồng hồ while (user has not pushed reaction button){ if(Top) { – Độ phân giải = 6*83.33=0.5 microsec. stop timer set Cnt to MS_INIT start timer – Khoảng tg = 65535*0.5 microsec = 32.77 reset Top millisec count_milliseconds++; } } – Muốn chƣơng trình đếm millisec., vì vậy turn light off khởi đầu bộ đếm 65535 – 1000/0.5 = 63535 printf(“time: %i ms“, count_milliseconds); } 6 Watchdog timer • Phải reset timer sau mỗi khoảng thời gian osc clk overflow overflow to system reset prescaler scalereg timereg X, nếu không timer sẽ or phát ra một tín hiệu interrupt • Sử dụng thông thƣờng: checkreg xác định lỗi, hoặc tự reset /* main.c */ watchdog_reset_routine(){ • Sử dụng khác: /* checkreg is set so we can load value into main(){ timereg. Zero is loaded into scalereg and timeouts wait until card inserted 11070 is loaded into timereg */ call watchdog_reset_routine – VD: máy ATM checkreg = 1 – 16-bit timer, độ phân while(transaction in progress){ scalereg = 0 giải 2 ms if(button pressed){ timereg = 11070 perform corresponding action } – Giá trị timereg = call watchdog_reset_routine 2*(216-1)–X = 131070– } void interrupt_service_routine(){ X eject card /* if watchdog_reset_routine not called every reset screen – Nếu 2 phút, X = < 2 minutes, interrupt_service_routine is } 120,000 ms. called */ } 7 Truyền thông nối tiếp dùng UARTs • UART: Universal embedded Asynchronous Receiver device 1 1 0 1 0 1 Transmitter 0 1 – Lấy dữ liệu song song và truyền nối tiếp 1 0 0 1 1 0 1 1 1 0 0 1 1 0 1 1 – Nhận dữ liệu nối tiếp và truyền song song Sending UART Receiving UART start bit end bit • Chẵn lẻ: Thêm bít cho các data kiểm tra đơn giản • Bit bắt đầu, bit kết thúc • Baud rate – Độ thay đổi tín hiệu trên giây – Tốc độ bit thƣờng cao hơn 1 0 0 1 1 0 1 1 Baud rate 8 Điều xung PWM • Phát xung với thời gian cao/thấp nhất định pwm_o • Duty cycle: % thời gian cao clk – Xung vuông: 50% duty cycle • Sử dụng thông thƣờng: điều 25% duty cycle – average pwm_o is 1.25V khiển điện áp trung bình cấp cho thiết bị điện pwm_o – Đơn giản hơn bộ biến đổi clk DC-DC hoặc ADC – Điều khiển tốc độ động cơ 50% duty cycle – average pwm_o is 2.5V. DC, đèn • Sử dụng khác: lệnh đƣợc mã pwm_o hóa, phía thu sử dụng timer để clk giải mã 75% duty cycle – average pwm_o is 3.75V. 9 Điều khiển động cơ DC với PWM % of Maximum Input Voltage RPM of DC Motor clk clk_div counter Voltage Applied ( 0 – 254) Điều khiển 0 0 0 độ nhanh chậm của 2 .5 50 1840 8-bit counter < xung đếm pwm_o comparator cycle_high, 3 .7 5 75 6900 pwm_o = 1 counter >= 5 .0 100 9200 cycle_high cycle_high, pwm_o = 0 Mối quan hệ giữa điện áp đặt và tốc độ động cơ DC Cấu trúc bên trong của PWM void main(void){ Chỉ với PWM không thể điều khiển động cơ DC, một cách thực 5V /* controls period */ hiện đƣợc chỉ ra dƣới đây sử dụng PWMP = 0xff; một transistor MJE3055T. /* controls duty cycle */ PWM1 = 0x7f; 5V Từ bộ xử DC lý MOTOR while(1){}; } A B 10 Bộ điều khiển LCD void WriteChar(char c){ E Bus thông tin R/W RS = 1; /* indicate data being sent */ RS DATA_BUS = c; /* send data to LCD */ DB7–DB0 EnableLCD(45); /* toggle the LCD with appropriate delay */ 8 } Vi điều khiển Bộ đk LCD CODES RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Description I/D = 1 cursor moves left DL = 1 8-bit 0 0 0 0 0 0 0 0 0 1 Clears all display, return cursor hom e I/D = 0 cursor moves right DL = 0 4-bit S = 1 with display shift N = 1 2 rows 0 0 0 0 0 0 0 0 1 * Returns cursor home S/C =1 display shift N = 0 1 row Sets cursor m ove direction and/or 0 0 0 0 0 0 0 1 I/D S S/C = 0 cursor movement F = 1 5x10 dots specifies not to shift display ON/OFF of all display(D), cursor R/L = 1 shift to right F = 0 5x7 dots 0 0 0 0 0 0 1 D C B ON/OFF (C), and blink position (B) R/L = 0 shift to left 0 0 0 0 0 1 S/C R/L * * M ove cursor and shifts display Sets interface data length, num ber of 0 0 0 0 1 DL N F * * display lines, and character font 1 0 W R IT E D A T A W rites Data 11 Bộ điều khiển phím bấm N1 N2 N3 k_pressed N4 M1 M2 M3 M4 4 key_code key_code Bộ điều khiển phím bấm N=4, M=4 12 Bộ điều khiển động cơ bƣớc S e q u e n c e A B A’ B’ • Động cơ bƣớc: quay một góc cố 1 + + - - định khi cung cấp một tín hiệu 2 - + + - 3 - - + + “bƣớc” 4 + - - + – Ngƣợc lại, động cơ DC chỉ quay 5 + + - - khi có công suất đặt vào Vd 1 16 Vm A’ 2 MC3479P 15 B A 3 14 B’ • Hoạt động quay đạt đƣợc bằng 4 13 GND GND 5 12 cách cung cấp một tuần tự điện Bias’/Set 6 11 Phase A’ Clk 7 10 CW’/CCW áp cho các cuộn dây O|C 8 9 Full’/Half Step • Bộ điều khiển sẽ thực hiện chức Red A White A’ năng này Yellow B Black B’ 13 Động cơ bƣớc với bộ điều khiển (driver) /* main.c */ void main(void){ Bộ điều khiển sbit clk=P1^1; */turn the motor forward */ MC3479P sbit cw=P1^0; cw=0; /* set direction */ 8051 void delay(void){ clk=0; /* pulse clock */ CW’/CCW delay(); P1.0 int i, j; 10 CLK clk=1; P1.1 for (i=0; i<1000; i++) 7 for ( j=0; j<50; j++) i = i + 0; /*turn the motor backwards */ 2 A’ B 15 } cw=1; /* set direction */ 3 A B’ 14 clk=0; /* pulse clock */ delay(); clk=1; } Các chân đầu ra của bộ điều khiển động cơ bƣớc Động cơ không cung cấp đủ dòng để điều khiển động cơ. +V bƣớc Để khuêchs đại dong, cần có một bộ đệm. Một 1K Q1 cách thực hiện đƣợc chỉ ra trên hình bên phải. Q1 là một transitor NPN MJE3055T và Q2 là một A B transistor PNP MJE2955T. A kết nối tới VĐK Q2 8051 và B kết nối tới động cơ bƣớc. 1K 14 Động cơ bƣớc không bộ điều khiển (driver) 8051 /*main.c*/ /* counter clockwise movement */ sbit notA=P2^0; if(dir==0){ P2.4 GND/ +V sbit isA=P2^1; for(y=0; y<=step; y++){ sbit notB=P2^2; for(z=19; z>=0; z - 4){ P2.3 sbit isB=P2^3; isA=lookup[z]; P2.2 sbit dir=P2^4; isB=lookup[z-1]; P2.1 notA=lookup[z -2]; P2.0 void delay(){ notB=lookup[z-3]; int a, b; delay( ); for(a=0; a<5000; a++) } Động for(b=0; b<10000; b++) } cơ bƣớc a=a+0; } } } void main( ){ void move(int dir, int steps) { int z; Một cách để thực hiện bộ đệm nhƣ chỉ ra bên dƣới. Bản int y, z; int lookup[20] = { thân 8051 không thể điều khiển động cơ bƣớc, vì vậy một /* clockwise movement */ 1, 1, 0, 0, vài transistors đƣợc thêm vào để tăng dòng cho động cơ if(dir == 1){ 0, 1, 1, 0, bƣớc. Q1 là MJE3055T NPN Q3 là MJE2955T PNP. A for(y=0; y<=steps; y++){ 0, 0, 1, 1, kết nối với 8051 và B kết nối với động cơ bƣớc. for(z=0; z<=19; z+4){ 1, 0, 0, 1, isA=lookup[z]; 1, 1, 0, 0 }; +V isB=lookup[z+1]; while(1){ 1K notA=lookup[z+2]; /*move forward, 15 degrees (2 steps) */ Q1 notB=lookup[z+3]; move(1, 2); +V B delay(); /* move backwards, 7.5 degrees (1step)*/ 1K } move(0, 1); A Q2 } } 330 } } 15 ADC Vmax = 7.5V 1111 4 4 7.0V 1110 6.5V 1101 3 3 6.0V 1100 5.5V 1011 2 2 5.0V 1010 4.5V 1001 1 1 4.0V analog input(V) 1000 analog output(V) 3.5V 0111 3.0V 0110 time time t1 t2 t3 t1 t2 t3 t4 2.5V 0101 t4 2.0V 0100 0100 1000 0110 0101 0100 1000 0110 0101 1.5V 0011 Digital output Digital input 1.0V 0010 0.5V 0001 0V 0000 Tỷ lệ Tương tự sang số Số sang tương tự 16 DAC dùng xấp xỉ nối tiếp Cho một tín hiệu tƣơng tự đầu vào điện áp từ 0 đến 15 volts, và một bộ mã hóa số 8-bit, tính toán mã cho giá trị 5 volts. 5/15 = d/(28-1) d= 85 Encoding: 01010101 Phương pháp xấp xỉ nối tiếp ½(Vmax – Vmin) = 7.5 volts 0 0 0 0 0 0 0 0 ½(5.63 + 4.69) = 5.16 volts 0 1 0 1 0 0 0 0 Vmax = 7.5 volts. Vmax = 5.16 volts. ½(7.5 + 0) = 3.75 volts 0 1 0 0 0 0 0 0 ½(5.16 + 4.69) = 4.93 volts 0 1 0 1 0 1 0 0 Vmin = 3.75 volts. Vmin = 4.93 volts. ½(7.5 + 3.75) = 5.63 volts 0 1 0 0 0 0 0 0 ½(5.16 + 4.93) = 5.05 volts 0 1 0 1 0 1 0 0 Vmax = 5.63 volts Vmax = 5.05 volts. ½(5.63 + 3.75) = 4.69 volts 0 1 0 1 0 0 0 0 ½(5.05 + 4.93) = 4.99 volts 0 1 0 1 0 1 0 1 Vmin = 4.69 volts. 17
File đính kèm:
- bai_giang_thiet_ke_he_thong_nhung_chuong_2_cau_truc_phan_cun.pdf