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
LT3478 PWM 调光, 3000:1 不会导致与电流有关的 LED 色彩变化。 LED 的导通时间 ( 或者平均电流 ) 受控于 PWM 引脚的占
空比。 由于 LED 始终工作于相同的电流条件下,而只有平均电
流发生变化,所以调光不会导致 LED 的色彩改变。
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
/************ 读取电压值 ***************/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
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; // 关闭出纸步进电机}