21
1 嵌嵌嵌嵌 嵌嵌嵌 嵌嵌嵌 嵌嵌嵌嵌嵌嵌嵌嵌 - 嵌嵌嵌嵌

嵌入式系统与结构 第四章 标准单用途处理器 - 外部设备

  • Upload
    dewei

  • View
    125

  • Download
    0

Embed Size (px)

DESCRIPTION

嵌入式系统与结构 第四章 标准单用途处理器 - 外部设备. 概述. 单目的处理器 执行专用的计算任务 定制单用途处理器 我们为一个专门的任务而设计 标准的 单用途处理器 为一个通用任务而预先设计的 例如:外设 串行发送 模拟 / 数字转换. 基本定时器. 16-bit 向上计数器. Cnt. 16. Clk. Top. Reset. 定时器,计数器,看门狗定时器. 定时器 Timer: 测试时间间隔 产生时间输出事件 例如,保持交通灯为绿灯 10 秒钟 测试输入事件 例如,测试一个汽车的速度 基于对时钟脉冲的计数 - PowerPoint PPT Presentation

Citation preview

Page 1: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

1

  嵌入式系统与结构

第四章 标准单用途处理器 -外部设备

Page 2: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

2

概述 单目的处理器 执行专用的计算任务 定制单用途处理器

我们为一个专门的任务而设计 标准的单用途处理器

为一个通用任务而预先设计的 例如:外设 串行发送 模拟 / 数字转换

Page 3: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

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

Page 4: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

4

计数器 CountersCounter: 象一个定时器,但是对通用输入信号进行计数而不是对时钟进行计数

例如,通过一个传感器来计数汽车的通过

常能够配置称定时器或者计数器

16-bit 向上计数器

Clk16

Cnt_in

2x1 mux

模式

定时器 / 计数器

Top

Reset

Cnt

Page 5: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

5

其它定时器结构

间隔定时器 可输出信号表示特定

时间间隔已经过去 设置终止计数寄存器

时钟周期数=时间间隔 / 时钟周期

16-bit up counterClk16

终止计数值

=

Top

Reset

有终止计数功能的定时器

Cnt

Page 6: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

6

其它定时器结构

Top2

级联计数器

16-bit 向上计数器Clk

16-bit 向上计数器

16

Cnt2

Top1

16/32-bit 定时器

Cnt1

16

Page 7: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

7

其它定时器结构带预分频的定时器

16-bit 向上计数器Clk 预分频

模式

预分频器定时器 分频时钟 增加了定

时范围,降低了分辨率

Top

cnt

Page 8: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

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

Page 9: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

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.

Page 10: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

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}

Page 11: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

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 率

每秒的信号变化 位数据率通常更高

Page 12: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

12

键盘控制器 N1N2N3N4

M1M2

M3M4

key_code

键盘控制器

k_pressed

key_code

4

N=4, M=4

Page 13: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

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

Page 14: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

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

Page 15: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

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电机的速度, 调光器灯光

另一应用 : 编码命令,接收机用定时器解码

Page 16: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

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

去处理器

Page 17: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

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 写入数据

Page 18: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

18

LCD controller

E

R/W

RS

DB7–DB0

LCD 控制器

通信总线

微处理器 r8

void WriteChar(char c){

RS = 1; /* 指示要发送的数据 */ DATA_BUS = c; /* 发送数据到 LCD */ EnableLCD(45); /* 反转 LCD 并延时 */}

Page 19: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

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电机当电压加上后会连续旋转,电压消失后逐渐停止

按照制定的电压顺序施加到转子上来完成旋转控制器通常简化成这样

Page 20: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

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;}

Page 21: 嵌入式系统与结构 第四章  标准单用途处理器 - 外部设备

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); }}