1 / 21

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

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

dewei
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. 概述 • 单目的处理器 • 执行专用的计算任务 • 定制单用途处理器 • 我们为一个专门的任务而设计 • 标准的单用途处理器 • 为一个通用任务而预先设计的 • 例如:外设 • 串行发送 • 模拟/数字转换

  3. 基本定时器 16-bit 向上计数器 Cnt 16 Clk Top Reset 定时器,计数器,看门狗定时器 • 定时器Timer:测试时间间隔 • 产生时间输出事件 • 例如,保持交通灯为绿灯 10秒钟 • 测试输入事件 • 例如,测试一个汽车的速度 • 基于对时钟脉冲的计数 • 例如,让Clk周期为10 ns • 然后计数20,000个 Clk 脉冲 • 那么就是 200 ms • 16-bit计数器能够计数 65,535*10 ns = 655.35 ms., 分辨率为 10 ns • Top: 指示计时到其最大范围的时间,成为“溢出”

  4. 定时器/计数器 Clk 2x1 mux 16-bit 向上计数器 Cnt 16 Top Cnt_in Reset 模式 计数器 Counters • Counter: 象一个定时器,但是对通用输入信号进行计数而不是对时钟进行计数 • 例如,通过一个传感器来计数汽车的通过 • 常能够配置称定时器或者计数器

  5. 有终止计数功能的定时器 16-bit up counter Clk Cnt 16 Reset = Top 终止计数值 其它定时器结构 • 间隔定时器 • 可输出信号表示特定时间间隔已经过去 • 设置终止计数寄存器 时钟周期数=时间间隔/ 时钟周期

  6. 16/32-bit 定时器 16-bit 向上计数器 Clk Cnt1 16 Top1 16-bit 向上计数器 Cnt2 16 其它定时器结构 • 级联计数器 Top2

  7. 带预分频的定时器 预分频 16-bit 向上计数器 Clk 模式 其它定时器结构 • 预分频器定时器 • 分频时钟 • 增加了定时范围,降低了分辨率 cnt Top

  8. reaction button indicator light LCD time: 100 ms 举例: 反应定时器 /* 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. Osc 12MHz clk overflow overflow to system reset or interrupt Prescaler 12分频 Scalereg 11位加计数 Timereg 16位加计数 checkreg 实例:看门狗定时器实现自动提款机的计时超时功能 • 必须每隔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. embedded device 0 1 1 1 0 1 1 0 Sending UART Receiving UART start bit end bit data 1 0 0 1 1 0 1 1 1 0 0 1 1 0 1 1 使用进行串口发送UARTs • UART: 通用异步收发器 • 将并行数据串行的发送 • 接收串行数据并转换称并行 • Parity奇偶位: 为简单的错误检查的额外位 • 开始位,停止位 • 波特Baud率 • 每秒的信号变化 • 位数据率通常更高

  12. N1 N2 N3 k_pressed N4 M1 M2 M3 M4 4 key_code key_code 键盘控制器 N=4, M=4 键盘控制器

  13. Vmax = 7.5V 4 4 1111 7.0V 1110 6.5V 1101 3 3 6.0V 1100 5.5V 1011 2 2 analog input (V) analog output (V) 5.0V 1010 4.5V 1001 1 1 4.0V 1000 3.5V 0111 time time 0110 3.0V t1 t2 t3 t4 t1 t2 t3 t4 2.5V 0101 0100 1000 0110 0101 0100 1000 0110 0101 2.0V 0100 Digital input Digital output 1.5V 0011 1.0V 0010 0.5V 0001 0V 0000 模数转换 数摸转换 比例关系 模拟-数字(A/D)转换器

  14. 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 1 0 1 例:逐次逼近的模数转换 假设一个模拟输入信号电压范围 0 to 15 V,并且8-bit数字编码,计算5V电压的正确编码。然后跟踪逐次逼近方法找到正确的电压编码值。 5/15 = d/(28-1) d= 85 编码: 01010101 逐次逼近方法 ½(Vmax – Vmin) = 7.5 volts Vmax = 7.5 volts. ½(5.63 + 4.69) = 5.16 volts Vmax = 5.16 volts. ½(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 Vmax = 5.05 volts. ½(5.63 + 3.75) = 4.69 volts Vmin = 4.69 volts. ½(5.05 + 4.93) = 4.99 volts

  15. pwm_o clk 25% duty cycle – average pwm_o is 1.25V pwm_o clk 50% duty cycle – average pwm_o is 2.5V. pwm_o clk 75% duty cycle – average pwm_o is 3.75V. 脉冲宽度调制 • 用指定的高/低电平时间产生脉冲 • 占空比: 高时间的% • 方波: 50% 占空比 • 一般应用: 控制电子设备的平均电压 • 比DC-DC转换器或者 数字-模拟转换器更简单 • DC电机的速度, 调光器灯光 • 另一应用: 编码命令,接收机用定时器解码

  16. 所施加电压与直流电机速度的关系 5V DC MOTOR 去处理器 用PWM控制一个DC 电动机 counter ( 0 – 254) clk_div clk 控制计数器递增的速度 8-bit comparator counter < cycle_high, pwm_o = 1 counter >= cycle_high, pwm_o = 0 pwm_o cycle_high Internal Structure of PWM void main(void){ /* 控制周期 */ PWMP = 0xff; /* 控制占空比 */ PWM1 = 0x7f; while(1){}; } The PWM 单独不能驱动一个DC电机,一种实现电机驱动的方法试使用一个 MJE3055T NPN 晶体管。.

  17. E 通信总线 R/W RS DB7–DB0 8 微处理器r LCD 控制器 LCD 控制器

  18. E 通信总线 R/W RS DB7–DB0 8 微处理器r LCD 控制器 LCD controller void WriteChar(char c){ RS = 1; /* 指示要发送的数据 */ DATA_BUS = c; /* 发送数据到 LCD */ EnableLCD(45); /* 反转 LCD并延时 */ }

  19. Red A Vd 1 16 Vm White A’ A’ 2 15 B Yellow B A 3 14 B’ Black B’ 4 13 GND GND 5 12 Bias’/Set 6 11 Phase A’ Clk 7 10 CW’/CCW O|C 8 9 Full’/Half Step MC3479P 步进电机控制器 • 步进电机: 当施加一个步进信号后 旋转固定角度 • 相反,DC电机当电压加上后会连续旋转,电压消失后逐渐停止 • 按照制定的电压顺序施加到转子上来完成旋转 • 控制器通常简化成这样

  20. MC3479P Stepper Motor Driver 8051 CW’/CCW P1.0 P1.1 10 7 B 15 B’ 14 CLK 2 A’ 3 A Stepper Motor 步进电机驱动器上的输出引脚不能提供足够的电流来驱动步进电机 。需要一个缓冲器来放大电流。一钟可能的缓冲器方案如右图。Q1 为 MJE3055T NPN 晶体管 and Q2 is an MJE2955T PNP 晶体管。A被连接到微处理器如8051,B连接到步进电机上 带有控制器的步进电机 /* 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; } 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; }

  21. 8051 P2.4 P2.3 P2.2 P2.1 P2.0 GND/ +V Stepper Motor +V 1K Q1 +V B 1K A Q2 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); } } 一种缓冲器实现结构 。Q1为 MJE3055T NPN,Q3 为MJE2955T PNP 。A被连接到微处理器如8051,B连接到步进电机上

More Related