嵌入式系统与结构 第四章 标准单用途处理器 - 外部设备
DESCRIPTION
嵌入式系统与结构 第四章 标准单用途处理器 - 外部设备. 概述. 单目的处理器 执行专用的计算任务 定制单用途处理器 我们为一个专门的任务而设计 标准的 单用途处理器 为一个通用任务而预先设计的 例如:外设 串行发送 模拟 / 数字转换. 基本定时器. 16-bit 向上计数器. Cnt. 16. Clk. Top. Reset. 定时器,计数器,看门狗定时器. 定时器 Timer: 测试时间间隔 产生时间输出事件 例如,保持交通灯为绿灯 10 秒钟 测试输入事件 例如,测试一个汽车的速度 基于对时钟脉冲的计数 - PowerPoint PPT PresentationTRANSCRIPT
1
嵌入式系统与结构
第四章 标准单用途处理器 -外部设备
2
概述 单目的处理器 执行专用的计算任务 定制单用途处理器
我们为一个专门的任务而设计 标准的单用途处理器
为一个通用任务而预先设计的 例如:外设 串行发送 模拟 / 数字转换
3
定时器,计数器,看门狗定时器定时器 Timer: 测试时间间隔
产生时间输出事件 例如,保持交通灯为绿灯 10 秒钟
测试输入事件 例如,测试一个汽车的速度
基于对时钟脉冲的计数 例如,让 Clk 周期为 10 ns 然后计数 20,000 个 Clk 脉冲 那么就是 200 ms 16-bit 计数器能够计数
65,535*10 ns = 655.35 ms., 分辨率为 10 ns
Top: 指示计时到其最大范围的时间,成为“溢出”
16-bit 向上计数器Clk Cnt
基本定时器
Top
Reset
16
4
计数器 CountersCounter: 象一个定时器,但是对通用输入信号进行计数而不是对时钟进行计数
例如,通过一个传感器来计数汽车的通过
常能够配置称定时器或者计数器
16-bit 向上计数器
Clk16
Cnt_in
2x1 mux
模式
定时器 / 计数器
Top
Reset
Cnt
5
其它定时器结构
间隔定时器 可输出信号表示特定
时间间隔已经过去 设置终止计数寄存器
时钟周期数=时间间隔 / 时钟周期
16-bit up counterClk16
终止计数值
=
Top
Reset
有终止计数功能的定时器
Cnt
6
其它定时器结构
Top2
级联计数器
16-bit 向上计数器Clk
16-bit 向上计数器
16
Cnt2
Top1
16/32-bit 定时器
Cnt1
16
7
其它定时器结构带预分频的定时器
16-bit 向上计数器Clk 预分频
模式
预分频器定时器 分频时钟 增加了定
时范围,降低了分辨率
Top
cnt
8
举例 : 反应定时器indicator
light
reaction button
time: 100 msLCD
/* main.c */
#define MS_INIT 63535 void main(void){ int count_milliseconds = 0; configure timer mode set Cnt to MS_INIT
wait a random amount of time turn on indicator light start timer
while (user has not pushed reaction button){ if(Top) { stop timer set Cnt to MS_INIT start timer reset Top count_milliseconds++; } } turn light off printf(“time: %i ms“, count_milliseconds);}
测试按下按钮与灯亮之间的时间 16-bit 定时器 , clk 周期 is 83.33 ns, 计
数器每 6 cycles 增加一次。 分辨力 = 6*83.33=0.5 us. 范围 = 65535*0.5 us = 32.77 ms 希望通过编程来计数 ms 值,这样初始化
计数器到 to 65535 – 1000/0.5 = 63535
9
实例:看门狗定时器实现自动提款机的计时超时功能
Scalereg11 位加计数
checkreg
Timereg16 位加计数
to system resetor
interrupt
Osc12MHz
clk
Prescaler12 分频
overflow overflow
必须每隔 X 个时间单元 reset 定时器 , 同时发出一个信号一般的应用 : 探测失效,自动复位另一个应用 : 超时
例, ATM 机 11-bit 定时器 , 2 ms. 分辨力 timereg = 2*(216-1)–X = 131070–X 对 2 分钟而言, X = 120,000 ms.
10
实例:看门狗定时器实现自动提款机的计时超时功能 ( 2 ) /* main.c */
main(){ wait until card inserted call watchdog_reset_routine while(transaction in progress){ if(button pressed){ perform corresponding action call watchdog_reset_routine }
/* if watchdog_reset_routine not called every < 2 minutes, interrupt_service_routine is called */}
watchdog_reset_routine(){/* 设置 checkreg ,使其值置入 timereg. 在 scalereg 置入 0 ,并在 timereg 中置入 11070 */
checkreg = 1 scalereg = 0 timereg = 11070 }
void interrupt_service_routine(){ eject card reset screen}
11
使用进行串口发送 UARTsembedded
device1 00 1
1 0 11
Sending UART
1 0 0 1 1 0 1 1
Receiving UART
1 0 0 1 1 0 1 1
start bitdata
end bit
1 0 0 1 1 0 1 1
UART: 通用异步收发器 将并行数据串行的发
送 接收串行数据并转换
称并行Parity 奇偶位 : 为简单的错误检查的额外位开始位,停止位波特 Baud 率
每秒的信号变化 位数据率通常更高
12
键盘控制器 N1N2N3N4
M1M2
M3M4
key_code
键盘控制器
k_pressed
key_code
4
N=4, M=4
13
模拟-数字( A/D )转换器
比例关系
Vmax = 7.5V
0V
11111110
0000
0010
0100
0110
1000
1010
1100
0001
0011
0101
0111
1001
1011
1101
0.5V1.0V1.5V2.0V2.5V3.0V
3.5V4.0V4.5V5.0V
5.5V6.0V6.5V7.0V
模数转换
4
3
2
1
t1 t2 t3 t4
0100 1000 0110 0101
timeanalog input (V)
Digital output
数摸转换
4
3
2
1
0100 1000 0110 0101
t1 t2 t3 t4time
analog output (V)
Digital input
14
假设一个模拟输入信号电压范围 0 to 15 V ,并且 8-bit 数字编码,计算 5V电压的正确编码。然后跟踪逐次逼近方法找到正确的电压编码值。
5/15 = d/(28-1)d= 85
逐次逼近方法
例:逐次逼近的模数转换
0 1 0 0 0 0 0 0
编码 : 01010101
½(Vmax – Vmin) = 7.5 voltsVmax = 7.5 volts.
½(7.5 + 0) = 3.75 voltsVmin = 3.75 volts.
0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0½(7.5 + 3.75) = 5.63 voltsVmax = 5.63 volts
½(5.63 + 3.75) = 4.69 voltsVmin = 4.69 volts.
0 1 0 1 0 0 0 0
½(5.63 + 4.69) = 5.16 voltsVmax = 5.16 volts.
0 1 0 1 0 0 0 0
½(5.16 + 4.69) = 4.93 voltsVmin = 4.93 volts.
0 1 0 1 0 1 0 0
½(5.16 + 4.93) = 5.05 voltsVmax = 5.05 volts.
0 1 0 1 0 1 0 0
½(5.05 + 4.93) = 4.99 volts 0 1 0 1 0 1 0 1
15
脉冲宽度调制
clk
pwm_o
25% duty cycle – average pwm_o is 1.25V
clk
pwm_o
50% duty cycle – average pwm_o is 2.5V.
clk
pwm_o
75% duty cycle – average pwm_o is 3.75V.
用指定的高 / 低电平时间产生脉冲占空比 : 高时间的%
方波 : 50% 占空比一般应用 : 控制电子设备的平均电压
比 DC-DC 转换器或者 数字-模拟转换器更简单
DC电机的速度, 调光器灯光
另一应用 : 编码命令,接收机用定时器解码
16
用 PWM 控制一个 DC 电动机
void main(void){
/* 控制周期 */ PWMP = 0xff; /* 控制占空比 */ PWM1 = 0x7f;
while(1){}; }
The PWM 单独不能驱动一个 DC电机,一种实现电机驱动的方法试使用一个 MJE3055T NPN 晶体管。 .
5V
B
A
Internal Structure of PWM
clk_div
cycle_high
counter( 0 – 254)
8-bit comparator
控制计数器递增的速度 counter < cycle_
high,pwm_o = 1counter >= cycle_high, pwm_o = 0
pwm_o
clk输入电压 占空比 DC电机转速
0 0 0
2.5 50 1840
3.75 75 6900
5.0 100 9200
所施加电压与直流电机速度的关系
DC
MOTOR
5V
去处理器
17
LCD 控制器E
R/W
RS
DB7–DB0
LCD 控制器
通信总线
微处理器 r8
CODES
I/D = 1 光标左移 DL = 1 8-bit
I/D = 0 光标右移 DL = 0 4-bit
S = 1 显示移位 N = 1 2 rows
S/C =1 显示移位 N = 0 1 row
S/C = 0 光标移动 t F = 1 5x10 点
R/L = 1 右移 F = 0 5x7 点
R/L = 0 左移
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 描述
0 0 0 0 0 0 0 0 0 1 清除全部显示,光标。。移至左上角
0 0 0 0 0 0 0 0 1 * 光标返回左上角
0 0 0 0 0 0 0 1 I/D S 设置光标移动方向,指定是否移动显示
0 0 0 0 0 0 1 D C B 全部显示的 ON/OFF(D), 光标的 ON/OFF (C), 光标位置闪烁 (B)
0 0 0 0 0 1 S/C R/L * * 光标移动和显示移位
0 0 0 0 1 DL N F * * 设置接口数据长度、显示行数和字符字体
1 0 WRITE DATA 写入数据
18
LCD controller
E
R/W
RS
DB7–DB0
LCD 控制器
通信总线
微处理器 r8
void WriteChar(char c){
RS = 1; /* 指示要发送的数据 */ DATA_BUS = c; /* 发送数据到 LCD */ EnableLCD(45); /* 反转 LCD 并延时 */}
19
步进电机控制器
Red A
White A’Yellow B
Black B’
MC
3479P
1
5
4
3
2
7
8
6
16
15
14
13
12
11
10
9
Vd
A’
A
GND
Bias’/Set
Clk
O|C
Vm
B
B’
GND
Phase A’
CW’/CCW
Full’/Half Step
Sequence A B A’ B’1 + + - -2 - + + -3 - - + +4 + - - +5 + + - -
步进电机 : 当施加一个步进信号后 旋转固定角度
相反, DC电机当电压加上后会连续旋转,电压消失后逐渐停止
按照制定的电压顺序施加到转子上来完成旋转控制器通常简化成这样
20
带有控制器的步进电机
2 A’ 3 A
10 7
B 15B’ 14
MC3479PStepper Motor
Driver 8051
P1.0P1.1
StepperMotor
CLK
CW’/CCW
步进电机驱动器上的输出引脚不能提供足够的电流来驱动步进电机 。需要一个缓冲器来放大电流。一钟可能的缓冲器方案如右图。 Q1 为 MJE3055T NPN 晶体管 and Q2 is an MJE2955T PNP 晶体管。 A被连接到微处理器如 8051, B连接到步进电机上
Q2
1K
1KQ1
+V
A B
void main(void){ */电机正转 */ cw=0; /* set direction */ clk=0; /* pulse clock */ delay(); clk=1;
/*电机反转 */ cw=1; /* set direction */ clk=0; /* pulse clock */ delay(); clk=1; }
/* main.c */
sbit clk=P1^1;sbit cw=P1^0;
void delay(void){ int i, j; for (i=0; i<1000; i++) for ( j=0; j<50; j++) i = i + 0;}
21
不带控制器的步进电机
StepperMotor
8051
GND/ +VP2.4
P2.3P2.2P2.1P2.0
一种缓冲器实现结构 。 Q1为 MJE3055T NPN , Q3 为MJE2955T PNP 。 A被连接到微处理器如 8051, B连接到步进电机上
Q2
+V
1KQ1
1K
+V
A
B
330
/*main.c*/sbit notA=P2^0;sbit isA=P2^1;sbit notB=P2^2;sbit isB=P2^3;sbit dir=P2^4;
void delay(){ int a, b; for(a=0; a<5000; a++) for(b=0; b<10000; b++) a=a+0;}
void move(int dir, int steps) {int y, z; /* clockwise movement */ if(dir == 1){ for(y=0; y<=steps; y++){ for(z=0; z<=19; z+4){ isA=lookup[z]; isB=lookup[z+1]; notA=lookup[z+2]; notB=lookup[z+3]; delay(); } } }
/* counter clockwise movement */ if(dir==0){ for(y=0; y<=step; y++){ for(z=19; z>=0; z - 4){ isA=lookup[z]; isB=lookup[z-1]; notA=lookup[z -2]; notB=lookup[z-3]; delay( ); } } }}void main( ){ 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 }; while(1){ /*move forward, 15 degrees (2 steps) */ move(1, 2); /* move backwards, 7.5 degrees (1step)*/ move(0, 1); }}