劉毅 劉偉
摘要:本文主要介紹模擬復(fù)印機(jī)生產(chǎn)組裝過程中,在TM與IOT組裝前設(shè)計(jì)一個(gè)檢測裝置,對(duì)TM的各組件狀態(tài)及傳感器進(jìn)行檢測,確保組裝到IOT整機(jī)后,TM均為良品。以此解決原生產(chǎn)方式中的弊端。
關(guān)鍵詞:單片機(jī)串口通信TM(Tray Module)IOT(Image Output Terminal)
中圖分類號(hào):TS261 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-3791(2012)08(c)-0030-02
1設(shè)計(jì)構(gòu)想
多功能復(fù)印機(jī)現(xiàn)有工程生產(chǎn)方式如圖1,這種生產(chǎn)方式操作麻煩,且容易造成二次人為故障,生產(chǎn)效率低?;谶@種考慮,將生產(chǎn)過程改良如下,可解決原生產(chǎn)方式的弊端(如圖2)。
2檢測器設(shè)計(jì)
TM與IOT由物理層,數(shù)據(jù)連接層,虛擬命令層構(gòu)成。本設(shè)計(jì)利用虛擬命令層獲取相關(guān)信息,完成檢測目的。綜合考慮成本,設(shè)計(jì)周期,難易度等因素,最終選定單片機(jī)+LCD作為設(shè)計(jì)課題。
檢測器系統(tǒng)如圖3所示,單片機(jī):采用ATMEGA48單片機(jī)完成整個(gè)檢測器的控制;LCD:顯示TM的動(dòng)態(tài)信息,TM內(nèi)部故障發(fā)生時(shí)報(bào)警;電源控制:當(dāng)檢測器檢測到正確連接到TM時(shí),啟動(dòng)按鍵,延時(shí)1秒鐘向TM供電,檢測過程中,一時(shí)發(fā)生故障,系統(tǒng)自動(dòng)供電電源,防止二次故障發(fā)生;LED蜂鳴:LED顯示數(shù)據(jù)的發(fā)送接收狀態(tài),有數(shù)據(jù)傳輸時(shí)LED閃爍,異常時(shí)蜂鳴器報(bào)警。
3程序設(shè)計(jì)
主程序中各子程序通過標(biāo)識(shí)狀態(tài)作相應(yīng)處理。串口數(shù)據(jù)讀取利用單片機(jī)串口中斷函數(shù),非常方便于數(shù)據(jù)的連續(xù)發(fā)送與接收。
3.1 程序代碼
3.1.1 主程序
/************************************** *************************************************
#include "common.h"
………
intmain(void)
{ Sys_Init(); //系統(tǒng)初始化
………….
TIMSK0 |=(1< sei(); while(1) {wdt_reset();//喂狗 if(Key_Ctr==1){Key_Control(); Key_Ctr=0;} // 按鍵處理 if(Buzzer_F!=0){Buzzer_On(Buzzer_F);Buzzer_F=0;} // 蜂鳴 if((Error_F!=0)&&(Run_F!=0)){Buzzer_F=1;} // 報(bào)警處理 if(Send_F==1){USART_Data_Send();Send_F=0;} // 數(shù)據(jù)傳送 if(rx_buffer.flag == FLAG_RECEIVE_OK) // 如果串口接收到完整的數(shù)據(jù)幀,則進(jìn)行處理 {USART_CMDProcess(); USART_ClearRXBuffer(); Time_Out=0;//通信超時(shí)計(jì)時(shí)結(jié)束 Time_Out_Sec=0; } if(tx_buffer.flag == FLAG_SEND_REQUEST) // 如果串口發(fā)送緩沖區(qū)有發(fā)送請(qǐng)求,執(zhí)行發(fā)送 {USART_SendString(); tx_buffer.flag = FLAG_EMPTY; Time_Out=1; //通信超時(shí)計(jì)時(shí)開始} if(RefreshLCD_F){ RefreshLCD();RefreshLCD_F=0;} // 如果LCD有刷新請(qǐng)求,則刷新LCD}} 3.1.2 串口中斷程序代碼 #include "common.h" ……… RX_BUFFER rx_buffer;//接收數(shù)據(jù)結(jié)構(gòu)體實(shí)例 TX_BUFFER tx_buffer;//發(fā)送數(shù)據(jù)結(jié)構(gòu)體實(shí)例 static ucharNO_CMD_D5[5]={0xD5,0x00,0x00,0x00,0x55}; ……………. /****************************** ******************************************串口初始化 voidUSART_init(uint baud) {UBRR0H=baud>>8; UBRR0L=baud&0x00FF; UCSR0A=0x00; //U2xn=0,波特率無倍速 UCSR0B=(1< UCSR0C=(1< USART_ClearRXBuffer(); USART_ClearTXBuffer();} /******************************** *****************************************數(shù)組發(fā)送 void USART_Data_Send(void) {uchar i; switch(Data_F) { case 1:{for(i=0;i
………
case 6:{for(i=0;i default:; }} /************************************** *****************************TRAY-STS數(shù)據(jù)處理 void USART_CMDProcess(void) {if(rx_buffer.buff[1]==0x03)//本組數(shù)據(jù)為TM 版本數(shù)據(jù) {Ver_D=(rx_buffer.buff[3]>>3)&0x03;; //實(shí)驗(yàn)/恒久 Ver_H=rx_buffer.buff[3]&0x07;//TM版本上位 Ver_L=rx_buffer.buff[2]&0x3F;//TM版本下位 RefreshLCD_F=2;} else if(rx_buffer.buff[1]==0x04) //本組數(shù)據(jù)為TRAY_STS { TM_No=rx_buffer.buff[2]&0x03;//取出TRAY編號(hào) 00->No2 01->No3 10->No4 TM_Status=(rx_buffer.buff[2]>>2)&0x07; //TRAY狀態(tài) 000->準(zhǔn)備好 001->上升 010->Tary拔 出 011->無紙 100->上升NG 101->NC 110->上升3次NG 111->SizeSensor NG ASize=(rx_buffer.buff[2]>>5)|(rx_buffer.buff[3]<<2); //SizeSensor模擬電壓AD值 DSize=(rx_buffer.buff[3]>>6)&0x01;//SizeSensor數(shù)字位 0,1 RefreshLCD_F=3;} else; } /****************************** **************************************清空接收緩沖區(qū) void USART_ClearRXBuffer(void) { uchar i; for(i=0; i rx_buffer.rxcount = 0; // 計(jì)數(shù)值清零 rx_buffer.flag = FLAG_EMPTY;} /************************ *******************************向接收緩沖區(qū)中添加一個(gè)字節(jié) uchar USART_AddToRXBuffer(uchar ch) { if(rx_buffer.rxcount >= RX_MAX){ return ERROR_RXBUFFER_FULL;} // 緩沖區(qū)滿 else { rx_buffer.buff[rx_buffer.rxcount] = ch;// 將要添加的字節(jié)保存到當(dāng)前計(jì)數(shù)值指向的位置 rx_buffer.rxcount ++; // 緩沖區(qū)的長度增加1 wdt_reset();//喂狗 return ADD_CHAR_OK; // 返回添加成功信息}} /**************************** *******************************清空發(fā)送緩沖區(qū) void USART_ClearTXBuffer(void) { uchar i; for(i=0; i { tx_buffer.buff[i] = 0x00; // 緩沖區(qū)當(dāng)前元素清空 wdt_reset();//喂狗} tx_buffer.txcount = 0; // 計(jì)數(shù)值清零 tx_buffer.flag = FLAG_EMPTY;} /**************************** *******************************向發(fā)送緩沖區(qū)中添加一個(gè)字節(jié) uchar USART_AddToTXBuffer(uchar ch) {if(tx_buffer.txcount > TX_MAX){ return ERROR_TXBUFFER_FULL;} // 緩沖區(qū)滿 else {wdt_reset(); tx_buffer.buff[tx_buffer.txcount] = ch;// 將要添加的字節(jié)保存到當(dāng)前計(jì)數(shù)值指向的位置 tx_buffer.txcount ++; // 緩沖區(qū)的長度增加1 wdt_reset();//喂狗 if(tx_buffer.txcount == TX_MAX) {tx_buffer.flag = FLAG_SEND_REQUEST; // 填充完畢指定數(shù)量數(shù)據(jù),設(shè)置發(fā)送請(qǐng)求} return ADD_CHAR_OK; // 返回添加成功信息}} /************************ ***************************將發(fā)送緩沖區(qū)的內(nèi)容一次性發(fā)送 void USART_SendString(void)
{ UDR0=tx_buffer.buff[0]; //從結(jié)構(gòu)數(shù)據(jù)的第1個(gè)數(shù)開始發(fā)送
tx_buffer.txcount=0;}
/**************************** ************************串口發(fā)送中斷服務(wù)函數(shù)
SIGNAL(SIG_USART_TRANS)
{ if(++tx_buffer.txcount else if(tx_buffer.txcount==TX_MAX) { USART_ClearTXBuffer(); //發(fā)送完畢 USART_ClearRXBuffer(); //作好接收準(zhǔn)備 } else;} /************************** ***************************串口接收完畢中斷服務(wù)函數(shù) SIGNAL(SIG_USART_RECV) {rx_buffer.buff[rx_buffer.rxcount] = UDR0; rx_buffer.rxcount ++; if(rx_buffer.rxcount >= RX_MAX){ rx_buffer.flag = FLAG_RECEIVE_OK;}} 3.1.3 LCD顯示程序代碼(紙型檢出部份) void RefreshLCD(void)/*刷新LCD顯示*/ {if(RefreshLCD_F==1)//LCD刷新標(biāo)識(shí) 0:無效 1:框架顯示 2:版本顯示3:數(shù)據(jù)顯示4:刷新機(jī)種 { if(TM_Status==2){disp_String(x,y,(uchar *)"已取出");}//紙盒拔出 else{ if((199 {disp_String(x,y,(uchar *)"A5 SEF");} else if((184 {disp_String(x,y,(uchar *)"B5 SEF");} …………….. else if((0 {disp_String(x,y,(uchar *)"11x17SEF");} else{disp_String(x,3,(uchar *)" ErrorSize"); }//紙型錯(cuò)誤} } 4結(jié)果測試 只要是TM組件自身的故障都就能檢出,如TM紙型感知傳感器未安裝或接觸不良、TM控制器版本錯(cuò)誤等。目前為止,沒有一件因TM不良而導(dǎo)致整機(jī)拆卸的維修事件,提高了生產(chǎn)效率。 參考文獻(xiàn) [1] 芯藝.AVR單片機(jī)GCC程序設(shè)計(jì)[J].單片機(jī)技術(shù)應(yīng)用,2005,1,1. [2] 陳勇.基礎(chǔ)工業(yè)工程[J].工業(yè)技術(shù),2010,7,1. [3] 吳鍇,郭海霞.單片機(jī)串行口的擴(kuò)展研究[J].單片機(jī)技術(shù),2010,5,19.