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ƢƠ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
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
Cnt
Top
16
counter
• VD: đo tốc độ xe
• Dựa trên việc đếm xung đồng hồ
Reset
• 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ộ đ
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
thay vì xu
– VD: đếm số ôtô chạy qua một cảm biến
Clk
2x1
16-bit up
counter
Cnt
Top
16
Cnt_in
Reset
– Đôi khi ta có thể cấu hình thiết bị nhƣ
một timer hoặc counter
Mode
4
Cấu trúc timer khác
16/32-bit timer
• Timer theo khoảng
Bộ đếm tiến 16-
Clk
– Biểu thị khi khoảng thời gian
yêu cầu trôi qua
Cnt1
16
bit
Timer với một giá trị
đếm đặt trước
Top1
– Chúng ta đặt giá trị đếm cuối
cùng cho giá trị yêu cầu
Bộ đếm tiến 16-
Clk
Cnt
16
bit
đếm tiến 16-
Cnt2
Top2
16
• Số xu
thời gian yêu cầu / chu
kỳ đồng hồ
bit
Reset
Top
=
Timer với bộ chia
• Bộ đếm ghép
• Bộ chia
Bộ chia
Bộ đếm tiến 16-
Clk
bit
– Chia xung
– 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
/* main.c */
động
Đàn hiển
thị
#define MS_INIT
void main(void){
int count_milliseconds = 0;
63535
LCD
time: 100 ms
configure timer mode
set Cnt to MS_INIT
• Đo khoảng thời gian giữa trạng thái đèn
sáng và ngƣ
ount of time
turn on indicator light
start timer
– Timer 16-bit, chu kỳ clk là 83.33 ns, counter
while (user has not pushed reaction button){
tăng sau mỗi 6 chu kỳ đồng hồ
if(Top) {
stop timer
set Cnt to MS_INIT
start timer
reset Top
– Độ phân giải = 6*83.33=0.5 microsec.
– Khoảng tg = 65535*0.5 microsec = 32.77
nds++;
millisec
}
}
– Muốn chƣơng trình đếm millisec., vì vậy
turn light off
printf(“time: %i ms“, count_milliseconds);
khởi đầu bộ đếm 65535 – 1000/0.5 = 63535
}
6
Watchdog timer
• Phải reset timer sau
mỗi khoảng thời gian
X, nếu không timer sẽ
phát ra một tín hiệu
• Sử dụng thông thƣờng:
xác định lỗi, hoặc tự
reset
osc
clk
overflow
overflow
to system reset
or
prescaler
scalereg
timereg
interrupt
checkreg
main(){
wait until card inserted
call watchdog_reset_routine
utine(){
/* checkreg is set so we can load value into
timereg. Zero is loaded into scalereg and
11070 is loaded into timereg */
• Sử dụng khác:
timeouts
– VD: máy ATM
checkreg = 1
scalereg = 0
timereg = 11070
}
while(transaction in progress){
if(button pressed){
– 16-bit timer, độ phân
giải 2 ms
perform corresponding action
call watchdog_reset_routine
– Giá trị timereg =
2*(216-1)–X
X
ce_routine(){
reset screen
}
/* if watchdog_reset_routine not called every
< 2 minutes, interrupt_service_routine is
called */
}
– Nếu 2 phút, X =
120,000 ms.
7
Truyền thông nối tiếp dùng UARTs
• UART: Universal
embedded
device
Asynchronous Receiver
Transmitter
0
1
1
1
0
1
1
0
– Lấy dữ liệu song song và
truyền nối tiếp
0 1 1 0 1 1
– Nhận dữ liệ
truyền song song
Sending UART
start bit
Receiving UART
end bit
data
• Chẵn lẻ: Thêm bít cho các
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
1
0
0
1
1
0
1
1
– Tốc độ bit thƣờng cao hơn
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
25% duty cycle – average pwm_o is 1.25V
50% duty cycle – average pwm_o is 2.5V.
75% duty cycle – average pwm_o is 3.75V.
• Sử dụng thông thƣờng: điều
khiển điện áp t
cho thiết bị điện
pwm_o
clk
– Đơn giản hơn bộ biến đổi
DC-DC hoặc ADC
– Điều khiển tốc độ động cơ
DC, đèn
clk
• Sử dụng khác:
hóa, phía thu sử dụng timer để
giải mã
9
Điều khiển động cơ DC với PWM
% o f M a x im u m
In p u t V o lta g e
R P M o f D C M o to r
counter
( 0 – 254)
clk_div
clk
V o lta g e A p p lie d
Điều khiển
độ nhanh
chậm của
xung đếm
0
0
0
2 .5
3 .7 5
5 .0
5 0
7 5
1 8 4 0
6 9 0 0
9 2 0 0
8-bit
comparator
counter <
pwm_o
cycle_high,
pwm_o = 1
counter >=
cycle_high,
1 0 0
đặ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
hiện đƣợc chỉ ra dƣới đây sử dụng
một transistor MJE3055T.
5V
/* controls period */
PWMP = 0xff;
/* controls duty cycle */
PWM1 = 0x7f;
DC
lý
MOTOR
while(1){};
}
A
B
10
Bộ điều khiển LCD
void WriteChar(char c){
Bus thông tin
E
R/W
RS
RS = 1;
DATA_BUS = c;
EnableLCD(45);
/* indicate data being sent */
/* send data to LCD */
/* toggle the LCD with appropriate delay */
DB7–DB0
}
8
Vi điều khiển
Bộ đk
LCD
C O D E S
R S
R /W
D B 7
D B 6
D B 5
D B 4
D B 3
D B 2
D B 1
D B 0
D e sc r ip tion
I/D = 1 c u rso r m o v e s le ft
I/D = 0 c u rso r m o v e s r ig h t
S = 1 w ith d isp la y s h ift
S /C = 1 d isp la y s h ift
D L = 1 8 -b it
D L = 0 4 -b it
N = 1 2 ro w s
N = 0 1 ro w
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
0
1
*
S
*
*
C le a r s a ll d isp la y, r e tu rn c u r so r h o m e
R e tu rn s c u r so r h o m e
0
0
0
0
1
0
0
0
1
S e ts c u r so r m o v e d ir e c tion a n d /or
sp e c ifie s n o t to sh ift d isp la y
0
0
1
I/D
*
S /C = 0 c u rso r m o v e m e n t
R /L = 1 sh ift to rig h t
F = 1 5 x 1 0 d o ts
F =
O N /O F F o f a ll d isp la y(D ), c u r so r
O N /O F F (C ), a n d b lin k p o sitio n (B )
R /L = 0 sh ift to le ft
1
S /C
N
R /L
F
M o v e c u r so r a n d sh ifts d isp la y
S e ts in ter fa c e d a ta le n g th , n u m b e r o f
d isp la y lin e s, a n d ch a ra c ter fo n t
D L
*
W R IT E D A T A
W r ite s D a ta
11
Bộ điều khiển phím bấm
N1
N2
N3
N4
k_pressed
M3
M4
4
key_code
key_code
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ố
định khi cung cấp một tín hiệu
“bƣớc”
1
2
3
4
5
+
+
-
-
-
+
+
-
+
+
-
+
-
– Ngƣợc lại, động cơ DC chỉ quay
khi có
A’
A
2
3
4
5
6
7
8
16
15
14
13
12
11
10
9
Vm
B
MC3479P
B’
• Hoạt động quay đạt đƣợc bằng
cách cung cấp một tuần tự điện
áp cho các cuộn dây
GND
GND
Bias’/Set
Clk
Phase A’
CW’/CCW
Full’/Half Step
O|C
• Bộ điều
năng này
Red
White
Yellow
A
A’
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
MC3479P
sbit clk=P1^1;
sbit cw=P1^0;
*/turn the motor forward */
cw=0;
clk=0;
delay();
clk=1;
/* set direction */
/* pulse clock */
8051
void delay(void){
int i, j;
for (i=0; i<1000; i++)
for ( j=0; j<50; j++)
CW’/CCW
P1.0
P1.1
10
7
CLK
rn the motor backwards */
1;
clk=0;
delay();
clk=1;
/* set direction */
/* pulse clock */
B 15
2 A’
B’ 14
3 A
}
Các chân đầu ra của bộ điều khiển động cơ bƣớc
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
transistor PNP MJE2955T. A kết nối tới VĐK
8051 và B kết nối tới động cơ bƣớc.
Động cơ
bƣớc
+ V
1 K
Q 1
Q 2
A
B
1 K
14
Động cơ bƣớc không bộ điều khiển (driver)
8051
/*main.c*/
/* counter clockwise movement */
if(dir==0){
sbit notA=P2^0;
sbit isA=P2^1;
sbit notB=P2^2;
sbit isB=P2^3;
sbit dir=P2^4;
P2.4
GND/ +V
for(y=0; y<=step; y++){
for(z=19; z>=0; z - 4){
P2.3
P2.2
P2.1
P2.0
isA=lookup[z];
isB=lookup[z-1];
notA=lookup[z -2];
notB=lookup[z-3];
void delay(){
int a, b;
delay( );
for(a=0; a<5000; a++)
}
}
}
void main( ){
void move(int dir, int steps) {
int y, z;
/* clockwise movement */
if(dir == 1){
int z;
int lookup[20] = {
1, 1, 0, 0,
0, 1, 1, 0,
0, 0, 1, 1,
1, 0, 0, 1,
1, 1, 0, 0 };
orward, 15 degrees (2 steps) */
move(1, 2);
/* move backwards, 7.5 degrees (1step)*/
move(0, 1);
Một cách để thực hiện bộ đệm nhƣ chỉ ra bên dƣới. Bản
thân 8051 không thể điều khiển động cơ bƣớc, vì vậy một
vài transistors đƣợc thêm vào để tăng dòng cho động cơ
bƣớc. Q1 là MJE3055T NPN Q3 là MJE2955T PNP. A
kết nối với 8051 và B kết nối với động cơ bƣớc.
for(y=0; y<=steps; y++){
for(z=0; z<=19; z+4){
isA=lookup[z];
notB=lookup[z+3];
delay();
1K
Q1
B
+V
1K
}
A
Q2
}
}
}
330
}
15
ADC
Vmax = 7.5V
7.0V
1111
1110
1101
1100
1011
1010
100
1000
0111
0110
0101
0100
0011
0010
000
0000
4
3
2
1
4
3
2
1
6.5V
6.0V
5.5V
5.0V
4.5V
4.0V
3.5V
time
time
3.0V
2.5V
2.0V
1.5V
1.0V
0.5V
0V
t1
t2
t3
t1
t2
t3
t4
t4
0100 1000 0110 0101
Digital output
0100 1000 0110 0101
Digital input
Tương tự sang số
Số sang tương tự
Tỷ lệ
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
Vmax = 7.5 volts.
0
0
0
1
1
1
0
0
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
0
0
0
1
1
1
1
0
0
0
0
0
1
1
1
0
0
0
0
0
0
0
1
½(7.5 + 0) = 3.75 volts
Vmin = 3.75 volts.
½(5.16 + 4.69) = 4.93 volts
Vmin = 4.93 volts.
½(7.5 + 3.75) = 5.63 volts
Vmax = 5.63 volts
½(5.16 + 4.93) = 5.05 volts
½(5.63 + 3.75) = 4.69 volts
Vmin = 4.69 volts.
½(5.05 + 4.93) = 4.99 volts
17
Bạn đang xem 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", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
- bai_giang_thiet_ke_he_thong_nhung_chuong_2_cau_truc_phan_cun.pdf