放大器软件设计
H45345(AF014H)軟件設計,采用了和克隆的方法,軟件程序的功能和原來的軟件相同。硬件也采用了相同的電路;
圖一: P89LPC938引腳定義
表一: P89LPC938引腳方向及功能
| P00 | * | NU | P01 | I | FO-開限位 |
| P02 | IO | SID-LCD | P03 | IO | SCLK-LCD |
| P04 | IO | program | P05 | IO | program |
| P06 | O | Relay-故障輸出 | P07 | * | NU |
| P10 | O | TXD | P11 | I | RXD |
| P12 | * | NU | P13 | O | PWM-位置信號輸出4-20mA |
| P14 | I | CL-關按鈕 | P15 | I | RST |
| P16 | * | NU | P17 | * | U |
| P20 | A | 位置信號輸入-電位器 | P21 | A | 自動信號輸入4-20mA |
| P22 | O | SSR1 | P23 | O | SSR2 |
| P24 | I | R/L-遠程就地 | P25 | O | LED_LOCAL-就地顯示 |
| P26 | I | FC-關限位 | P27 | I | OT-馬達溫度 |
| P30 | I | OP-開按鈕 | P31 | I | E-確認按鈕 |
MCU系統配置
系統時鐘采用MCU內部RC振蕩器(7.373MHz+/-1%)來產生。
當前設置的各個時鐘頻率:
* RCCLK - 7.373MHz
* CCLK - 7.373MHz (DIVM=0)
* PCLK - 3.6865MHz (CCLK/2) – 0.27126us
OSCCLK-輸入到DIVM 分頻器。OSCCLK 有4 個時鐘源選項并且也可以分頻為低頻時鐘。__注:__fosc 定義為OSCCLK頻率
CCLK-CPU 時鐘;DIVM 時鐘分頻器的輸出。每個機器周期包含2個CCLK 周期,大多數指令執行時間為1 到2 個機器周期(2 到4 個CCLK 周期)。
RCCLK-內部7.373MHz RC 振蕩器輸出。
PCLK-用于不同外圍功能的時鐘,為CCLK/2。
DIVM 寄存器
OSCCLK 頻率可通過整數倒分頻,通過配置分頻寄存器DIVM 進行高達510 分頻來提供CCLK。從下式中可得出CCLK 的頻率:
CCLK 頻率=fOSC/(2N)
此處,fOSC 為OSCCLK 頻率。N 是DIVM 的值。
由于N 的取值范圍為0~255,因此,CCLK 的頻率范圍為fOSC~fOSC/510。(N=0時,CCLK=fOSC)。
代碼分析
MCU端口初始化
表2 IO配置方法
| 0 | 0 | 準雙向口 |
| 0 | 1 | 推挽 |
| 1 | 0 | 僅為輸入(高阻) |
| 1 | 1 | 開漏 |
表3 P89LPC938引腳方向配置寄存器定義
| NU | Relay | prog | prog | SCLK | SID | FO | ||
| P0 | x | O | x | x | IO | IO | I | |
| P0M1 | B3 | 1 | 0 | 1 | 1 | 0 | 0 | 1 |
| P0M2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| NU | NU | RST | CL | PWM | NU | RXD | ||
| P1 | x | x | x | I | O | I | I | |
| P1M1 | F4 | 1 | 1 | 1 | 1 | 0 | 1 | 0 |
| P1M2 | 8 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
| OT | FC | LED | R/L | SSR2 | SSR1 | A | ||
| P2 | I | I | O | I | O | O | A | |
| P2M1 | D3 | 1 | 1 | 0 | 1 | 0 | 0 | 1 |
| P2M2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| E | ||||||||
| P3 | I | |||||||
| P3M1 | 3 | 1 | ||||||
| P3M2 | 0 | 0 |
端口初始化代碼
void InitIO() {// I/O initializationP0M1 = 0;P0M2 = 0; /* Set P0 */P1M1 = 0;P1M2 = 0x08; /* Set P1 */P2M1 = 0;P2M2 = 0; /* Set P2 */P3M1 = 0;P3M2 = 0; /* Set P3 */ }系統執行間隔時間10mS
系統執行間隔時間10mS,采用了MCU的定時器0中斷程序來完成。定時器按照指定的時間間隔進行中斷,這樣來產生系統執行的間隔時間。
由于定時器中斷時間比較長(10mS),定時器的時鐘PCLK為3.6865MHz(0.27126uS),間隔10mS中斷TH0、TL0寄存器數據為(10mS/0.27126uS=36865/HEX9001),TH0/TL0=0x6FFF。因而,定時器只能采用mode 1(TnM[2:1]=001b),即16位的定時器寄存器來進行分頻。
void InitTMR0() {/* Timer 0 in mode 1, 16bit counter */TL0 = 0xFF;TH0 = 0x6F;TMOD = (TMOD & 0xF0) | 0x01; /* Set T/C0 Mode 1 */ET0 = 1; /* Enable Timer 0 Interrupts */TR0 = 1; /* Start Timer 0 Running */EA = 1; /* Global Interrupt Enable */ }
Timer/counter 0 or 1 in mode 1(16-bit counter).
外部開關信號采樣程序
外部開關信號的采樣,按照系統執行間隔時間來采樣,系統執行一次,對外部開關信號采樣一次,然后設定對應的標志寄存器。通過該程序可以檢測到按鈕的狀態,例如:按下、彈起、按下時間、彈起時間、上升沿狀態、下降沿狀態等。
外部開關信號的采樣間隔10mS采用一次,采樣程序在定時器0的10mS中斷程序中進行采樣。
bit rl_st,rl_ud,rl_du; // bits about remote/local bit e_st,e_ud,e_du; // bits about e key bit op_st,op_ud,op_du; // bits about open key bit cl_st,cl_ud,cl_du; // bits about close key bit lt_st,lt_ud,lt_du; // bits about limit of temperature bit lo_st,lo_ud,lo_du; // bits about limit of open bit lc_st,lc_ud,lc_du; // bits about limit of close unsigned int rl_time,e_time,op_time,cl_time,lt_time,lo_time,lc_time;x_st - 按鍵狀態標志位;
x_ud – 按鍵下降沿標志位;
x_du – 按鍵上升沿標志;
x_time – 按鍵保持時間
AD采樣程序
ADC采樣采用了雙通道,連續轉換模式進行;
void InitADC() {ADMODA = 0x20; /* selects fixed and dual channel,continuous conversion modes. */ADMODB = 0x60; /* CLK: 1.5MHz for 12MHz XTAL */AD0INS = 0xC0; /* Enable AD06..AD07 inputs */AD0CON = 0x05; /* Enable+start A/D converter */ } void ADCSample() {unsigned int adc[5];unsigned char i;while((AD0CON&0x08)==0){}AD0CON &= 0xF7;// auto signal samplefor(i=0;i<=4;i++) adc[i] = 0;adc[0] = (unsigned int)(AD0DAT0L*4)+(AD0DAT0R&0x03);adc[1] = (unsigned int)(AD0DAT2L*4)+(AD0DAT2R&0x03);adc[2] = (unsigned int)(AD0DAT4L*4)+(AD0DAT4R&0x03);adc[3] = (unsigned int)(AD0DAT6L*4)+(AD0DAT6R&0x03);for(i=0;i<4;i++){adc[4] += adc[i];}adc_auto = adc[4]/4;// pot signal samplefor(i=0;i<=4;i++) adc[i] = 0;adc[0] = (unsigned int)(AD0DAT1L*4)+(AD0DAT1R&0x03);adc[1] = (unsigned int)(AD0DAT3L*4)+(AD0DAT3R&0x03);adc[2] = (unsigned int)(AD0DAT5L*4)+(AD0DAT5R&0x03);adc[3] = (unsigned int)(AD0DAT7L*4)+(AD0DAT7R&0x03);for(i=0;i<4;i++){adc[4] += adc[i];}adc_pot = adc[4]/4; }PWM控制程序
本設計采用PWM控制程序,用來輸出一個PWM信號來實現DAC的功能;PWM實現方法有3種:一種是采用Timer/counter 0 或 1來實現PWM信號的產生;另一種方法采用CCU功能來實現。我們采用的是定時器方法來實現,輸出引腳為P1.3;還有一種通過定時器中斷產生固定的時鐘頻率,通過計數器來實現PWM的控制。
本設計的PWM要求頻率為200Hz,控制精度200,最小單位25us變換一次;我們采用定時器2進行25uS中斷,在終端程序內進行PWM輸出腳的高低點平控制。
由于定時器中斷時間為(25uS),定時器的時鐘PCLK為3.6865MHz(0.27126uS),間隔10mS中斷TH0、TL0寄存器數據為(25uS/0.27126uS=92.16/HEX5C),TH1=A4。因而,定時器可以采用mode 0(TnM[2:1]=010b)。
Timer/counter 0 or 1 in Mode 2(8-bit auto-reload)
PWM 400Hz頻率占空比調整4-20mA
PWM 200Hz頻率占空比調整4-20mA
PWM 100Hz頻率占空比調整4-20mA
UART程序
UART程序為程序的人機接口程序,我們可以通過該端口了解程序的運行情況。該應用程序通過初始化程序后,通過stdio.h頭文件來調用相關的子程序。
void InitUart() {SCON = 0x52; // initialize UARTSSTAT = 0x60; // separate Rx / Tx interruptsBRGR0 = 0xF0; // 9600 baud, 8 bit, no parity, 1 stop bitBRGR1 = 0x02;BRGCON = 0x03;ES = 1; }void UART_ISR(void) interrupt 4 {RI = 0; // clear receive interrupt flagputchar(SBUF); }數據存儲程序(EEPROM)
EEPROM驅動程序
void EEPROMwrite(unsigned int adr, unsigned char dat) {EA=0; // disable Interrupts during writeDEECON=(unsigned char)((adr>>8)&0x01); // mode: write byte, set addressDEEDAT=dat; // set write dataDEEADR=(unsigned char) adr; // start writeEA=1; while((DEECON&0x80)==0); // wait until write is complete }unsigned char EEPROMread(unsigned int adr) {DEECON=(unsigned char)((adr>>8)&0x01); // mode: read byte, set adressDEEADR=(unsigned char) adr; // start readwhile((DEECON&0x80)==0); // wait until read is completereturn DEEDAT; // return data }void EEPROMwriteWord(unsigned int adr, unsigned int dat) {unsigned int temp;unsigned char i,addr;addr = adr;temp = dat;i = (unsigned char)temp;EEPROMwrite(addr,i);addr++;temp = temp/256;i = (unsigned char)temp;EEPROMwrite(addr,i); }unsigned int EEPROMreadWord(unsigned int adr) {unsigned int temp1,temp2;unsigned char addr;addr = adr;temp1 = EEPROMread(addr);addr++;temp2 = EEPROMread(addr);return (temp2*256+temp1); }上電數據初始化
if(EEPROMreadWord(EEA_FLAG)==0xA581) {SysLoseAutoSwitch = EEPROMreadWord(EEA_SYSLOSEAUTOSWITCH);AutoLose = EEPROMreadWord(EEA_AUTOLOSE);AutoMin = EEPROMreadWord(EEA_AUTOMIN);AutoMax = EEPROMreadWord(EEA_AUTOMAX);AutoOver = EEPROMreadWord(EEA_AUTOOVER);PerAutoLose = EEPROMreadWord(EEA_PERAUTOLOSE);printf("%x,%x,%x,%x,%x,%x\n",SysLoseAutoSwitch,AutoLose,AutoMin,AutoMax,AutoOver,PerAutoLose);PotLose = EEPROMreadWord(EEA_POTLOSE);PotMin = EEPROMreadWord(EEA_POTMIN);PotMax = EEPROMreadWord(EEA_POTMAX);PotOver = EEPROMreadWord(EEA_POTOVER);PerPotLose = EEPROMreadWord(EEA_PERPOTLOSE);printf("%x,%x,%x,%x,%x\n",PotLose,PotMin,PotMax,PotOver,PerPotLose);PerDeadArea = EEPROMreadWord(EEA_PERDEADAREA);PerCloseLimit = EEPROMreadWord(EEA_PERCLOSELIMIT);PerOpenLimit = EEPROMreadWord(EEA_PEROPENLIMIT);PWM4mA = EEPROMreadWord(EEA_PWM4MA);PWM20mA = EEPROMreadWord(EEA_PWM20MA);printf("%x,%x,%x,%x,%x\n",PerDeadArea,PerCloseLimit,PerOpenLimit,PWM4mA,PWM20mA); } else {SysLoseAutoSwitch = STOP;AutoLose = 93; // 2mAAutoMin = 186; // 4mAAutoMax = 930; // 20mA // AutoOver = ??; // ??????? // PerAutoLose = ?; // ??????? // PotLose = ??; // ???????PotMin = 118; // 0R or 1KPotMax = 905; // 1K or 0 // PotOver = ????; // PerPotLose = ????PerDeadArea = 20; // 0~4%PerCloseLimit = 0; // 0%PerOpenLimit = 1000; // 100%PWM4mA = 0x39;PWM20mA = 0x8F;EEPROMwriteWord(EEA_FLAG,0xA581);EEPROMwriteWord(EEA_SYSLOSEAUTOSWITCH,SysLoseAutoSwitch);EEPROMwriteWord(EEA_AUTOLOSE,AutoLose);EEPROMwriteWord(EEA_AUTOMIN,AutoMin);EEPROMwriteWord(EEA_AUTOMAX,AutoMax);EEPROMwriteWord(EEA_AUTOOVER,AutoOver);EEPROMwriteWord(EEA_PERAUTOLOSE,PerAutoLose);EEPROMwriteWord(EEA_POTLOSE,PotLose);EEPROMwriteWord(EEA_POTMIN,PotMin);EEPROMwriteWord(EEA_POTMAX,PotMax);EEPROMwriteWord(EEA_POTOVER,PotOver);EEPROMwriteWord(EEA_PERPOTLOSE,PerPotLose);EEPROMwriteWord(EEA_PERDEADAREA,PerDeadArea);EEPROMwriteWord(EEA_PERCLOSELIMIT,PerCloseLimit);EEPROMwriteWord(EEA_PEROPENLIMIT,PerOpenLimit);EEPROMwriteWord(EEA_PWM4MA,PWM4mA);EEPROMwriteWord(EEA_PWM20MA,PWM20mA); }程序保護功能
if(EEPROMreadWord(EEA_PROTECT)!=0x4B4A) // KJ {while(1){KeySample();if((rl_st==LOW)&&(op_st==HIGH)&&(cl_st==LOW)){EEPROMwriteWord(EEA_PROTECT,0x4B4A);break;}} }9、數據處理
數據百分比處理
// data transformation void PerData() {long temp;AutoData = (int)adc_auto;PotData = (int)adc_pot;if(PotData>0x3FF)PotData = 0;// test endif(AutoData>=AutoMin){temp = (long)(AutoData-AutoMin)*1000/(AutoMax-AutoMin);PerAuto = (int)temp;}else{temp = (long)(AutoMin-AutoData)*1000/(AutoMax-AutoMin);PerAuto = -(int)temp;}if(PotData>=PotMin){temp = (long)(PotData-PotMin)*1000/(PotMax-PotMin);PerPot = (int)temp;}else{temp = (long)(PotMin-PotData)*1000/(PotMax-PotMin);PerPot = -(int)temp;}temp = (long)PotData*1000/1024;PerPotAD = (int)temp;// printf("%d,%d,%d\n",PotData,PerPotAD,PerPot); }液晶顯示程序
void delay(unsigned int t) {unsigned int i,j;for(i=0;i<t;i++)for(j=0;j<10;j++); // 0.27126uS }void WriteByte(unsigned char byte)/*串行傳送一字節數據*/ {unsigned char i;for (i=0;i<8;i++){SCLK = 0; // 0.27126uSif ((byte & 0x80)!=0){SID = 1;SID = 1;}else{SID = 0;SID = 0;}SCLK = 1;byte = byte<<1;} }/* Write data to Instruction Register */ void write_com(unsigned char cmd) { // _CS = 1;WriteByte(0xf8);WriteByte(cmd & 0xf0);WriteByte((cmd<<4)&0xf0); // _CS = 0; }/* Wtire data from to DATA Register */ void write_data(unsigned char dat) { // _CS = 1;WriteByte(0xfa);WriteByte(dat & 0xf0);WriteByte((dat<<4)&0xf0); // _CS = 0; }void hzkdis(unsigned char code *s) {while(*s>0){write_data(*s);s++;delay(50);} }設置程序
#include <math.h>unsigned int mode; unsigned char SysLoseAutoSwitchTemp; int PerCloseLimitTemp,PerOpenLimitTemp; int PerDeadAreaTemp; int PWM4mATemp,PWM20mATemp; bit bDataCheck;void setup() {if(rl_ud==TRUE) // mode setup{rl_ud = FAULT;mode ++;if(mode>8){if(bDataCheck==FAULT)mode = 0;if(mode>11)mode = 0;}clrscreen();}switch(mode){case 1:if(e_du==TRUE){e_du = FAULT;mode ++;}bDataCheck = FAULT;// setup data initPerCloseLimitTemp = PerCloseLimit; // close limit tempPerOpenLimitTemp = PerOpenLimit; // open limit tempPerDeadAreaTemp = PerDeadArea; // Dead area tempSysLoseAutoSwitchTemp = SysLoseAutoSwitch; // Lose auto signanl switch tempwrite_com(0x80); // first line displayhzkdis(" ");write_com(0x90); // second line displayhzkdis(" 設置狀態 ");break;case 2: // FULL CLOSE adjustmentif(op_st==LOW) // close actuator{op_ud = FAULT;SSR1 = LOW;}else{SSR1 = HIGH;}if(cl_st==LOW) // open actuator{cl_ud = FAULT;SSR2 = LOW;}else{SSR2 = HIGH;}if(e_st==LOW) // ok{e_ud = FAULT;e_du = FAULT;if(e_time>=10) // 1S{PotMin = PotData;EEPROMwriteWord(EEA_POTMIN,PotMin);write_com(0x90); // second line displayhzkdis("調至全關 OK ");}}else{//write_com(0x01); // clear LCD//delay(50);write_com(0x80); // first line displayhzkdis("全關標定");write_com(0x90); // second line displayhzkdis("調至全關 確認E");}DataToASICC(PerPotAD);write_com(0x84);hzkdisd(ascii);break;case 3: // FULL OPEN adjustmentif(op_st==LOW) // close actuator{op_ud = FAULT;SSR1 = LOW;}else{SSR1 = HIGH;}if(cl_st==LOW) // open actuator{cl_ud = FAULT;SSR2 = LOW;}else{SSR2 = HIGH;}if(e_st==LOW) // ok{e_ud = FAULT;e_du = FAULT;if(e_time>10) // 1S{PotMax = PotData;EEPROMwriteWord(EEA_POTMAX,PotMax);if(abs(PotMax-PotMin)<300){mode--;}else{write_com(0x90); // second line displayhzkdis("調至全開 OK ");}}}else{//write_com(0x01); // clear LCD//delay(50);write_com(0x80); // first line displayhzkdis("全開標定");write_com(0x90); // second line displayhzkdis("調至全開 確認E");}DataToASICC(PerPotAD);write_com(0x84);hzkdisd(ascii);break;case 4: // LIMIT CLOSE adjustmentif(op_ud==TRUE){op_ud = FAULT;PerCloseLimitTemp++;}if(op_st==LOW){if(op_time>=20) // 2S{op_time=20;PerCloseLimitTemp++;}}if(cl_ud==TRUE){cl_ud = FAULT;PerCloseLimitTemp--;}if(cl_st==LOW){if(cl_time>=20) // 2S{cl_time=20;PerCloseLimitTemp--;}}if(PerCloseLimitTemp>=1000)PerCloseLimitTemp = 1000;if(PerCloseLimitTemp<=0)PerCloseLimitTemp=0;if(e_st==LOW) // ok{e_ud = FAULT;e_du = FAULT;if(e_time>10) // 1S{PerCloseLimit = PerCloseLimitTemp;EEPROMwriteWord(EEA_PERCLOSELIMIT,PerCloseLimit);write_com(0x90); // second line displayhzkdis("加+減- OK ");}}else{write_com(0x80); // first line displayhzkdis("關限位");write_com(0x90); // second line displayhzkdis("加+減- 確認E");}DataToASICC(PerCloseLimitTemp);write_com(0x84);hzkdisd(ascii);break;case 5: // LIMIT OPEN adjustmentif(op_ud==TRUE){op_ud = FAULT;PerOpenLimitTemp++;}if(op_st==LOW){if(op_time>=20) // 2S{op_time=20;PerOpenLimitTemp++;}}if(cl_ud==TRUE){cl_ud = FAULT;PerOpenLimitTemp--;}if(cl_st==LOW){if(cl_time>=20) // 2S{cl_time=20;PerOpenLimitTemp--;}}if(PerOpenLimitTemp>=1000)PerOpenLimitTemp = 1000;if(PerOpenLimitTemp<=0)PerOpenLimitTemp=0;if(e_st==LOW) // ok{e_ud = FAULT;e_du = FAULT;if(e_time>10) // 1S{PerOpenLimit = PerOpenLimitTemp;EEPROMwriteWord(EEA_PEROPENLIMIT,PerOpenLimit);write_com(0x90); // second line displayhzkdis("加+減- OK ");}}else{write_com(0x80); // first line displayhzkdis("開限位");write_com(0x90); // second line displayhzkdis("加+減- 確認E");}DataToASICC(PerOpenLimitTemp);write_com(0x84);hzkdisd(ascii);break;case 6: // DEAD AREA adjustmentif(op_ud==TRUE){op_ud = FAULT;PerDeadAreaTemp++;if(PerDeadAreaTemp>40)PerDeadAreaTemp = 40;}if(cl_ud==TRUE){cl_ud = FAULT;PerDeadAreaTemp--;if(PerDeadAreaTemp<=0)PerDeadAreaTemp = 0;}if(e_st==LOW) // ok{e_ud = FAULT;e_du = FAULT;if(e_time>10) // 1S{PerDeadArea = PerDeadAreaTemp;EEPROMwriteWord(EEA_PERDEADAREA,PerDeadArea);write_com(0x90); // second line displayhzkdis("加+減- OK ");}}else{write_com(0x80); // first line displayhzkdis("死區值");write_com(0x90); // second line displayhzkdis("加+減- 確認E");}DataToASICC(PerDeadAreaTemp);write_com(0x84);hzkdisd(ascii);break;case 7: // automatic signal lose to processif(op_ud==TRUE){op_ud = FAULT;SysLoseAutoSwitchTemp ++;if(SysLoseAutoSwitchTemp>=3)SysLoseAutoSwitchTemp = 0;}if(e_st==LOW){e_ud = FAULT;e_du = FAULT;if(e_time>10) // 1S{SysLoseAutoSwitch = SysLoseAutoSwitchTemp;EEPROMwriteWord(EEA_SYSLOSEAUTOSWITCH,SysLoseAutoSwitch);write_com(0x90); // second line displayhzkdis("改變+ OK ");}}else{switch(SysLoseAutoSwitchTemp){case 0:write_com(0x80); // first line displayhzkdis("失效處理 保持 ");write_com(0x90); // second line displayhzkdis("改變+ 確認E");break;case 1:write_com(0x80); // first line displayhzkdis("失效處理 全開 ");write_com(0x90); // second line displayhzkdis("改變+ 確認E");break;case 2:write_com(0x80); // first line displayhzkdis("失效處理 全關 ");write_com(0x90); // second line displayhzkdis("改變+ 確認E");break;}}break;case 8:if((op_ud==TRUE)&(cl_ud==TRUE)){op_ud = FAULT;cl_ud = FAULT;bDataCheck = TRUE;PWM4mATemp = PWM4mA;PWM20mATemp = PWM20mA;mode++;}write_com(0x80); // first line displayhzkdis(" ");write_com(0x90); // second line displayhzkdis(" 設置完成 ");break;case 9: // auto signal checkedif(op_ud==TRUE){op_ud = FAULT;mode++;}if(e_st==LOW){e_ud = FAULT;e_du = FAULT;if(e_time>10) // 1S{AutoMax = AutoData;AutoMin = AutoMax*4/20;AutoLose = AutoMax*2/20;EEPROMwriteWord(EEA_AUTOMAX,AutoMax);EEPROMwriteWord(EEA_AUTOMIN,AutoMin);EEPROMwriteWord(EEA_AUTOLOSE,AutoLose);write_com(0x90); // second line displayhzkdis("20.00mA OK ");}}else{write_com(0x80); // first line displayhzkdis(" 輸入校準 ");write_com(0x90); // second line displayhzkdis("20.00mA 確認E");}break;case 10: // 4mAif(op_ud==TRUE){op_ud = FAULT;PWM4mATemp++;}if(op_st==LOW){if(op_time>=20) // 2S{op_time=20;PWM4mATemp++;}}if(cl_ud==TRUE){cl_ud = FAULT;PWM4mATemp--;}if(cl_st==LOW){if(cl_time>=20) // 2S{cl_time=20;PWM4mATemp--;}}if(e_st==LOW){e_ud = FAULT;e_du = FAULT;if(e_time>10) // 1S{e_time=0;PWM4mA = PWM4mATemp;EEPROMwriteWord(EEA_PWM4MA,PWM4mA);write_com(0x90); // second line displayhzkdis("加+減- OK ");}}else{//write_com(0x01); // clear LCD//delay(50);write_com(0x80); // first line displayhzkdis(" 4mA校準 ");write_com(0x90); // second line displayhzkdis("加+減- 確認E");}// PWM output codePWMData = PWM4mATemp;//break;case 11: // 20mAif(op_ud==TRUE){op_ud = FAULT;PWM20mATemp++;}if(op_st==LOW){if(op_time>=20) // 2S{op_time=20;PWM20mATemp++;}}if(cl_ud==TRUE){cl_ud = FAULT;PWM20mATemp--;}if(cl_st==LOW){if(cl_time>=20) // 2S{cl_time=20;PWM20mATemp--;}}if(e_st==LOW){e_ud = FAULT;e_du = FAULT;if(e_time>10) // 1S{e_time = 0;PWM20mA = PWM20mATemp;EEPROMwriteWord(EEA_PWM20MA,PWM20mA);write_com(0x90); // second line displayhzkdis("加+減- OK ");}}else{//write_com(0x01); // clear LCD//delay(50);write_com(0x80); // first line displayhzkdis(" 20mA校準 ");write_com(0x90); // second line displayhzkdis("加+減- 確認E");}// PWM output codePWMData = PWM20mATemp;//break;} }version: 1.0 date: 2008-8-8 hnhkj@163.com 初稿
總結
- 上一篇: 高大上必备!D3.js对产品的贡献度剖析
- 下一篇: HTTP和HTTPS详解