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.
17File đính kèm:
bai_giang_thiet_ke_he_thong_nhung_chuong_2_cau_truc_phan_cun.pdf

