43
第第第 第第第第第第第第

第六章 微机高级应用实例

  • Upload
    stacey

  • View
    241

  • Download
    0

Embed Size (px)

DESCRIPTION

第六章 微机高级应用实例. 实例 1 : LED 照明灯. 驱动 LED 并实时监控亮度 恒流驱动. LT3478. PWM 调光, 3000:1 不会导致与电流有关的 LED 色彩变化。 LED 的导通时间 ( 或者平均电流 ) 受控于 PWM 引脚的占空比。 由于 LED 始终工作于相同的电流条件下,而只有平均电流发生变化,所以调光不会导致 LED 的色彩改变。. CTRL1 = 1.24* 130/(130+45.3+54.9) = 0.7V. 电流监控 INA139. ADC —— ADS7822. 12 位 ADS7822 功能特点: - PowerPoint PPT Presentation

Citation preview

第六章 微机高级应用实例

实例 1 : LED 照明灯 驱动 LED 并实时监控亮度 恒流驱动

LT3478 PWM 调光, 3000:1 不会导致与电流有关的 LED 色彩变化。 LED 的导通时间 ( 或者平均电流 ) 受控于 PWM 引脚的占

空比。 由于 LED 始终工作于相同的电流条件下,而只有平均电

流发生变化,所以调光不会导致 LED 的色彩改变。

CTRL1 = 1.24* 130/(130+45.3+54.9) = 0.7V

电流监控 INA139

12 位 ADS7822 功能特点: 采样速率可达 75 kHz ;

单电源供电 , 可以在 2. 0 ~ 5. 0 V 的电源电压下工作 , 范围广 ;

微功耗 : 采样速率 75kHz 时为 0. 54 mW;7. 5kHz 时为 0. 06 mW; 掉电模式时 , 最大电流为 3μA ;

体积小 , 有 8 脚 DIP ,SOIC 及 MSOP 封装 ;

模拟信号可单端或差分输入 ;

采用串行方式和与 CPU 相连。

ADC —— ADS7822

ADS7822 工作原理 内部框图

转换时序图

/************ 读取电压值 ***************/long GetLM(void) {

uchar i,j,hbyte,lbyte;uint ADdata=0; //ADdata 转换一次的数据, AD_data 转换后的平均数据 ;long AD_data=0;LM_CS=1; //

for(i=0;i<=127;i++) // 转换 128 次取平均值 {

DCLK=0; //ad DCLK 为低电平 LM_CS=0; // 开始 A/D 转换hbyte=0; // 清高字节 delay(5);for(j=0;j<3;j++) // 三周期后开始读入数据 {

DCLK=0;delay(1);DCLK=1;delay(1);

}

for(j=0;j<=3;j++){

DCLK=0; // 低电平时读数据 delay(1);if(LM_IN==1) // 若是 1 相应位置 1

hbyte|=(1<<(3-j));DCLK=1;delay(1);

}lbyte=0; // 清低字节 for(j=0;j<=7;j++){

DCLK=0; // 低电平时读数据 delay(1);if(LM_IN==1)

lbyte|=(1<<(7-j)); // 若是 1 相应位置 1DCLK=1;delay(1);

}LM_CS=1; // 转换结束 ADdata=(uint)(hbyte<<8)|lbyte; // 高四位 低八位合成 AD_data+=(ADdata&0x0fff);feed_watchdog();

}AD_data = AD_data>>7; // 除以 128 ,求平均 return AD_data;

}

实例 2 :数码彩扩冲印机 用数码手段,在化学相纸上曝光成像的设备和技术。 数码彩扩步骤 :数据采集、数据处理、数码曝光、冲纸。 优点:

解决了数码相机无底片问题; 所见即所得,照片效果预先在显示终端上得到,可进行个性化设

计,控制和改进最终输出的效果; 良好的图像色彩还原性,图像质量高于除印刷以外的其他方式; 数码相机可随拍随洗; 可通过网络进行图像的存储和交换,实现网上冲印服务。

数码彩扩成像方式

系统控制电路设计

电源及定时开机

电机板

温控及继电器控制

电机控制电路

+5V, GND

+36V,

GND_P

+5V_P

进纸电机 出纸电机

L297+

L298

滤波电路

MCU,

W77E58

纸箱 3 路,有无纸、纸到位,堵纸(提升架),切刀定位,门

微动开关 3路,

光耦 5路

RS232

步进电机控制信号

光电隔离

上位机

光耦隔离

串口

光电隔离 LCOS

L298

反馈电流检测

lm393

光电隔离

TLP521

切刀电机

分户电机

与温控板通讯

6N137隔离 LCOS开关

固态继电器板 温控板

Max813L

复位,电压监控,看门狗

LCOS转向检测

镜头编码检测

2个 LCOS转向

3个镜头编码

L297+

L298

L297+

L298

提升架电机

+24V,

GND_P

温控电路

+5V, GND, -5V

型滤波

稳定 2 稳定 1 漂定 彩显

双电压跟随器 opa2277

双电压跟随器 opa2277

键盘

LC

D

补液 4路,加热 5路,冲纸电机

MCU

C8051F005

低电平复位

电压比较器 lm393

参考电压 lm385

逻辑电路

光耦隔离, 驱动 74LS07

9路液

位检测 与电机板通讯

6路 AD590电流信号输入

光耦隔离 6N137

固态继电器板 液位开关信号

去抖动、灯、触发器 电机控制板

TPS3705复位,电压监控及看门狗

Lm1117

蜂鸣器

指示灯

74ls

573

EEPROM 24LC04

I/O扩展 PCA9554

加热棒保护继电器

LCOS 烘干

双电压跟随器 opa2277

电阻采样

温控电路的软件流程 初始化 51端口及系统时钟

Y

N

设定彩显,漂定,稳定,烘干初始值

初始化 AD转换

加热、冲纸及报警关闭, Display_num=0

初始化 LCD显示

采集彩显,漂定,稳定,烘干实际温度

Display_num==20 显示实际温度 Display_num=0

“ ”设置 键按下

N

Y 温度设置子程序

“ ”冲纸 键按下 Y

冲纸子程序

N

彩显、漂定、稳定、烘干实际温度比设置温度低

Y 相应加热棒工作

N

彩显、漂定、稳定、烘干实际温度比设置温度高,但不超过 5度

Y 相应加热棒停止工作

N

彩显、漂定、稳定、烘干实际温度比设置温度高过 5度

Y 相应加热棒停止工作

并蜂鸣器报警

N

槽低液 Y 相应加热棒停止工作,

显示低液状态并蜂鸣器报警

N

满液 显示满液状态

N

槽正常液位

Y

N

Y 清除液位显示状态

四个温度及 液位均正常

Y 关闭蜂鸣器报警

N

Display_num++

其中烘干温控在接收到电

机板冲纸信号时才进行

桶空 Y 显示桶空状态并蜂鸣器报警

N

电机电路的软件流程 计算进纸步进电机步长 StepIn_Number、出纸步进电机步长数 StepOut_Number及分户记张张数 Division_Number

StepOut_Number<=100 Y

Ack ‘OS’ 异常退出

N

StepIn_Number<=100 Y

N

DRAWER_OPEN==0 N

Ack ‘DO’ 异常退出

LCOS_DIRECTION==0 N

Ack ‘LD’ 异常退出

Y

Y

查镜头编码 LENS1, LENS0

LENS1==0 && LENS0==0

Y

N

Ack ‘LE’ 异常退出

LENS1, LENS0 01: Ack ‘L1’ 10: Ack ‘L2’ 11: Ack ‘L3’

开 LCOS电源 LCOS_OPEN=0 开冲纸电机 PAPER_MOVE=0

CUT_NONE==0

切刀复位 CUT_EN=1 CUT_P=1 CUT_N=0

异常退出

Y Y

CUT_NONE==0

延时时间>10秒 N

Ack ‘CE’

Y

PAPER_NONE==0

Y Ack ‘PN’ 异常退出

N

PAPER_BLOCK= =0

Y

N Ack ‘PB’

查询纸箱编码 BOX_NUMBER2,1,0

出纸电机单独走,前 50步由慢至快启动 For(i=0;i<=50;i++) { STEP_OUT_CLK = 0; delay(50-i);

STEP_OUT_CLK = 1; delay(50-i); }

出纸电机走相应步长 For(i=0;i<=StepOut_Number-50;i++) { STEP_OUT_CLK = 0; delay(0); //对应确定时间

STEP_OUT_CLK = 1; Delay(0); }

后 50步由快至慢停止 For(i=0;i<=50;i++) { STEP_OUT_CLK = 0; delay(i);

STEP_OUT_CLK = 1; delay(i); }

正常结束

异常退出

2,1,0==0,0,0 Y

Ack ‘BN’ 异常退出

N

2,1,0 001: Ack ‘B1’ 010: Ack ‘B2’ 011: Ack ‘B3’ 100: Ack’ B4’

前 50步由慢至快启动 For(i=0;i<=50;i++) { STEP_IN_CLK = 0; STEP_OUT_CLK = 0; delay(50-i);

STEP_IN_CLK = 1; STEP_OUT_CLK = 1; Delay(50-i); }

两个电机走同样步长 For(i=0;i<=StepIn_Number;i++) { STEP_IN_CLK = 0; STEP_OUT_CLK = 0; delay(0); //对应确定时间

STEP_IN_CLK = 1; STEP_OUT_CLK = 1; Delay(0); }

PAPER_NONE = = 0 N

切刀运动切纸 CUT_EN=1 CUT_P=1 CUT_N=0 延时 0.5秒

CUT_NONE = = 0 Y

N

延时>10秒

N

Y

Ack ‘CE’

异常退出

锁死切刀 CUT_EN=1; CUT_P=1; CUT_N=1

延时 0.1秒 CUT_EN=0

Y, 纸完,切刀不切

出纸电机走相应步长 For(i=0;i<=StepOut_Number-50;i++) { STEP_OUT_CLK = 0; delay(0); //对应确定时间

STEP_OUT_CLK = 1; Delay(0); }

后 50步由快至慢停止 For(i=0;i<=50;i++) { STEP_OUT_CLK = 0; delay(i);

STEP_OUT_CLK = 1; delay(i); }

锁死出纸步进电机 STEP_OUT_EN=1; STEP_OUT_CLK=1; delay 0.5秒 释放出纸步进电机 STEP_OUT_EN=0;

正常结束

DIVISION_NUMBER==0

Y

N

StepIn_Number -=50; StepOut_Number -=50

开 INT0中断

AD590 及温度 AD 采样 Linear Current Output: 1 A/K Wide Range: –55 C to +150C Two Terminal Device: Voltage In/Current Out Excellent Linearity: ±0.3 C Over Full Range (AD590M) Wide Power Supply Range: +4 V to +30 V

电路设计

0° 输出 273A, 10V/0.273mA = 36.6K

电路设计2.5V/0.273mA = 9.15K

ADC 初始化

void init_adc(void){

ADC0CN = 0x81; // ADC0 enabled; normal tracking // mode; ADC0 conversions are initiated // on write to AD0BUSY; ADC0 data is // left-justified

REF0CN = 0x07; // enable temp sensor, on-chip VREF, // and VREF output buffer

AMX0CF = 0; //AIN0~AIN7 均单端使用ADC0CF = 0x80; // ADC conversion clock = 16 晶振时钟 , <1us 在 11.0592MH

zEIE2 &= ~0x02; // disable ADC0 End of Conversion interruptEIE1 &= ~0x04; // disable ADC0 window compare interrupt

}

温度转换unsigned int read_temp(unsigned char Channel) //Channel 0: CX; 1: PD; 2: WD; 3: HG{unsigned int xdata i;unsigned int xdata Temp; // 存放 温度 ADC 值。unsigned int xdata Ctg; // 最终摄氏温度

AMX0SL = Channel; // 温度传感器输入 Temp = 0;for(i=0;i<100;i++){ ADCINT = 0; // clear conversion complete indicator ADBUSY = 1; // initiate conversion while (ADCINT == 0); // wait for conversion complete

Temp += ADC0H; // 只获取高 8 位 AD 转换值,据此计算相应温度}if(Channel<=2) // 前三个通道为彩显、漂定和稳定 Ctg =(unsigned int)((((float)Temp/100.0)/256.0)*(float)VREF/4.9);// 求 100 次平均值。每 0.1 摄氏度 4.9mVelse Ctg =(unsigned int)((((float)Temp/100.0)/256.0)*(float)VREF/2.45);// 求 100 次平均值。每 0.1 摄氏度 2.45mVreturn Ctg;}

温度控制void Temp_Control_HG(void){

char xdata i;// 实际温度比设置温度低 5 度以上,连续加热 if(Temp_HG_Read+Temp_HG_Offset<Temp_HG_Set-Temp_Paper_Threshold) { HG_HEATER=0; // 加热 }// 实际温度比设置温度低 5 度以内,占空比加热

if((Temp_HG_Read+Temp_HG_Offset>=Temp_HG_Set-Temp_Paper_Threshold) & (Temp_HG_Read+Temp_HG_Offset<Temp_HG_Set-10)) {

PWM_Heat(3,PWM_persent); // 占空比加热 } // 实际温度在设置温度 ±1 度以内,占空比加热

if((Temp_HG_Read+Temp_HG_Offset>=Temp_HG_Set-10) & (Temp_HG_Read+Temp_HG_Offset<Temp_HG_Set+10)) { PWM_Heat(3,4); // 占空比加热 }// 大于实际温度,但在 10 度之内,停止加热 if ((Temp_HG_Read+Temp_HG_Offset>=Temp_HG_Set+10) & (Temp_HG_Read+Temp_HG_Offset<Temp_HG_Set+100)) HG_HEATER=1; // 停止

}

if(Temp_HG_Read+Temp_HG_Offset>=Temp_HG_Set+100) // 实际温度比设置温度高 10 度,报警{ HG_HEATER=1; // 停止 if(Alarm_Num<=ALIMIT) {

ALARM=0; // 停止报警if(Alarm_Num==1)

{LCD_WriteCommand(2,0xB8+6); // 纵向起始位置(行数)第 7 页LCD_WriteCommand(2,0x40); // 横向起始位置 (列)for (i=0;i<32;i++)

LCD_WriteData(2,0x0); // 隐藏实际测量“烘干”温度LCD_WriteCommand(2,0xB8+7); // 纵向起始位置(行数)第 8 页LCD_WriteCommand(2,0x40); // 横向起始位置 (列)for (i=0;i<32;i++) LCD_WriteData(2,0x0); // 隐藏实际测量“烘干”温度

}Alarm_Num++;

} else if(Alarm_Num<=2*ALIMIT) {

ALARM=1; // 报警if(Alarm_Num==ALIMIT+1) // 显示实际测量烘干温度 LCD_WriteNum(2,0,6,(Temp_HG_Read+Temp_HG_Offset)/10.0); Alarm_Num++;

} else

Alarm_Num=0;}

void Temp_Control_NoHG(void) // 彩显、漂定、稳定温度控制{ char xdata i; if(Temp_CX_Read+Temp_CX_Offset<Temp_CX_Set-Temp_Threshold) { // 实际温度比设置温度低 Temp_Threshold 度以上,连续加热

if(Yeiwei_Low_CX!=LOW_FLAG) // 彩显槽中液位不为低时加热CX_HEATER=0; // 加热

else CX_HEATER=1; //stop 加热

} else if(Temp_CX_Read+Temp_CX_Offset>=Temp_CX_Set-Temp_Threshold & Temp_CX_Read+Temp_CX_Offset<Temp_CX_Set) { // 实际温度在 Temp_Threshold 与设置温度低以内,占空比加热

if(Yeiwei_Low_CX!=LOW_FLAG) // 彩显槽中液位不为低时加热PWM_Heat(0,PWM_persent); // 占空比加热

elseCX_HEATER=1; //stop 加热

} else if (Temp_CX_Read+Temp_CX_Offset>=Temp_CX_Set & Temp_CX_Read+Temp_CX_Offset<Temp_CX_Set+30) {// 大于实际温度,但在 3 度之内,停止加热

CX_HEATER=1; // 停止 } else if(Temp_CX_Read+Temp_CX_Offset>=Temp_CX_Set+30) // 实际温度比设置温度高 3 度,报警

可靠性设计: TPS3705 Power-On Reset Generator with Fixed Delay Time of 200 ms, no

External Capacitor Needed Precision Supply Voltage Monitor 2.5 V, 3 V, 3.3 V, and 5 V Integrated Watchdog Timer Voltage Monitor for Power-Fail or Low-Battery Warning

TPS3705

WDI = !WDI; // 触发外部看门狗if(!WDO) // 外部看门狗低电平{

ALARM=1; // 报警EIE2 &= 0xFE; // 关闭定时器 3 中断,使片内看门狗溢出复位

}

void Timer3_ISR() interrupt 14 //Timer3 interrupt{

TMR3CN &= 0x7F; // 清除中断标志

WDTCN = 0xA5; // Watchdog Timer Control Register, 允许并重载WDTCN = 0x07; // 时间间隔 1048576/ 系统频率 (11.0592MHz, 95ms)

if(!Paper_Flag) // 若停止冲纸,延时计数开始Paper_Num++; // 冲纸计数加 1

if(Display_Num%5 == 0){

LIGHT = 0; // 指示灯灭}else{

LIGHT = 1; // 指示灯亮}

}

可靠性设计:硬件保护

L297+L298

L297 单片步进电机控制集成电路适用于双极性两相步进电机或单极性四相步进电机的控制

L298 为 H 桥式驱动芯片 L297+L298 组合成完整的步进电机恒流斩波驱动器 使用 L297 的突出特点是外部只需时钟、方向和工作方式

3 个输入信号, L297 自动产生电机励磁相序。

电路图

// 送纸子程序void In_Motor(unsigned int Step_Num, unsigned int Speed){

unsigned int i;FixStep = FIXSTEP; // 固定步长为 400 步,用于缓启动和缓停止if((Step_Num <= 15) || (Step_Num>1000)) // 若步长太大或太小,返回

return;Step_Num *= STEP_COEF; // 输入步长乘系数转换为提升电机正确步数Step_Num -= (FixStep+FixStep/2); //运行步长减去缓启动和缓停止的步长// 送纸至切刀前先将前面曝光好的相纸走出PAPER_OUT_EN =ENABLE; // 使能出纸步进电机PAPER_OUT_CW = CW; //顺时针转ExtWatchdog(); // 外部看门狗操作for(i=200;i>0;i--) // 出纸前 200 步慢启动{

PAPER_OUT_CLK =1; //正脉冲delay2us(Speed+Speed*(i/20)); // 缓慢启动, 20 个脉冲一档PAPER_OUT_CLK =0; //负脉冲delay2us(Speed+Speed*(i/20)); // 缓慢启动, 20 个脉冲一档ExtWatchdog(); // 外部看门狗操作

}

for(i=0;i<650;i++) // 出纸中间 650 步正常速度{

ExtWatchdog(); // 外部看门狗操作PAPER_OUT_CLK =1; //正脉冲delay2us(Speed); //正常速度PAPER_OUT_CLK =0; //负脉冲delay2us(Speed); //正常速度

}for(i=0;i<200;i++) // 出纸后 200 步慢停止{

ExtWatchdog(); // 外部看门狗操作PAPER_OUT_CLK =1; //正脉冲delay2us(Speed+Speed*(i/20)); // 缓慢停止, 20 个脉冲一档PAPER_OUT_CLK =0; //负脉冲delay2us(Speed+Speed*(i/20)); // 缓慢停止, 20 个脉冲一档

}delay10ms(1); // 停止 10ms// 送纸步进电机PAPER_IN_EN=ENABLE; // 使能送纸步进电机PAPER_IN_CW=CW; //顺时针转ExtWatchdog(); // 外部看门狗操作

for(i=FixStep;i>0;i--) //两个电机同时慢启动 { ExtWatchdog(); // 外部看门狗操作 PAPER_IN_CLK ^=1; //半脉冲 PAPER_OUT_CLK ^=1; //半脉冲 delay2us(Speed+i); // 缓慢启动, if(PAPERNO) // 有无纸传感器判断到无纸,无纸为低电平 {

PAPER_IN_EN=1; //DISABLE; // 关闭送纸步进电机PAPER_OUT_EN=1; //DISABLE; // 关闭出纸步进电机send(PAPERNONE); // 发送无纸字符return; //返回

} } for(i=0;i<Step_Num;i++) { ExtWatchdog(); // 外部看门狗操作 PAPER_IN_CLK ^=1; //半脉冲 PAPER_OUT_CLK ^=1; //半脉冲 delay2us(Speed); //正常速度 }

for(i=0;i<FixStep/2;i++) //慢停止 { ExtWatchdog(); // 外部看门狗操作 PAPER_IN_CLK ^=1; //半脉冲 PAPER_OUT_CLK ^=1; //半脉冲 delay2us(Speed+i); // 缓慢启动, } PAPER_OUT_CLK=1; //锁住电机 PAPER_IN_CLK=1; delay10ms(10); // 停止 100ms PAPER_IN_EN=1; //DISABLE; // 关闭送纸步进电机 PAPER_OUT_EN=1; //DISABLE; // 关闭出纸步进电机}

可靠性设计

Schmitt-trigger inverter

看门狗

void ExtWatchdog(void) // 外部看门狗监控子程序{

WDI=!WDI; // 触发外部看门狗if(!WDO) // 外部看门狗输出低电平,程序跑飞,应复位{

send(RESET); //返回复位信息WDTRST = 0x01e;WDTRST = 0x0aa; //软件复位

}}