日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

放大器软件设计

發布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 放大器软件设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

H45345(AF014H)軟件設計,采用了和克隆的方法,軟件程序的功能和原來的軟件相同。硬件也采用了相同的電路;

圖一: P89LPC938引腳定義

表一: P89LPC938引腳方向及功能

引腳方向功能引腳方向功能
P00*NUP01IFO-開限位
P02IOSID-LCDP03IOSCLK-LCD
P04IOprogramP05IOprogram
P06ORelay-故障輸出P07*NU
P10OTXDP11IRXD
P12*NUP13OPWM-位置信號輸出4-20mA
P14ICL-關按鈕P15IRST
P16*NUP17*U
P20A位置信號輸入-電位器P21A自動信號輸入4-20mA
P22OSSR1P23OSSR2
P24IR/L-遠程就地P25OLED_LOCAL-就地顯示
P26IFC-關限位P27IOT-馬達溫度
P30IOP-開按鈕P31IE-確認按鈕

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配置方法

PxM1.YPxM2.Y口輸出模式
00準雙向口
01推挽
10僅為輸入(高阻)
11開漏

表3 P89LPC938引腳方向配置寄存器定義

HEX76543210
NURelayprogprogSCLKSIDFO
P0xOxxIOIOI
P0M1B31011001
P0M200000000
NUNURSTCLPWMNURXD
P1xxxIOII
P1M1F41111010
P1M280000100
OTFCLEDR/LSSR2SSR1A
P2IIOIOOA
P2M1D31101001
P2M200000000
E
P3I
P3M131
P3M200

端口初始化代碼

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 – 按鍵保持時間

void KeySample() {// key "RL" sampleif(RL){if(rl_st==LOW){rl_time = 0;rl_du = TRUE;}rl_time ++;rl_st = HIGH;} else{if(rl_st==HIGH){rl_time = 0;rl_ud = TRUE;}rl_time++;rl_st = LOW;}// key "E" sampleif(E){if(e_st==LOW){e_time = 0;e_du = TRUE;}e_time ++;e_st = HIGH;} else{if(e_st==HIGH){e_time = 0;e_ud = TRUE;}e_time++;e_st = LOW;}// key "OPEN" sampleif(OPEN){if(op_st==LOW){op_time = 0;op_du = TRUE;}op_time ++;op_st = HIGH;} else{if(op_st==HIGH){op_time = 0;op_ud = TRUE;}op_time++;op_st = LOW;}// key "CLOSE" sampleif(CLOSE){if(cl_st==LOW){cl_time = 0;cl_du = TRUE;}cl_time ++;cl_st = HIGH;} else{if(cl_st==HIGH){cl_time = 0;cl_ud = TRUE;}cl_time++;cl_st = LOW;}// key "LTEMP" sampleif(LTEMP){if(lt_st==LOW){lt_time = 0;lt_du = TRUE;}lt_time ++;lt_st = HIGH;} else{if(lt_st==HIGH){lt_time = 0;lt_ud = TRUE;}lt_time++;lt_st = LOW;}// key "LOPEN" sampleif(LOPEN){if(lo_st==LOW){lo_time = 0;lo_du = TRUE;}lo_time ++;lo_st = HIGH;} else{if(lo_st==HIGH){lo_time = 0;lo_ud = TRUE;}lo_time++;lo_st = LOW;}// key "LCLOSE" sampleif(LCLOSE){if(lc_st==LOW){lc_time = 0;lc_du = TRUE;}lc_time ++;lc_st = HIGH;} else{if(lc_st==HIGH){lc_time = 0;lc_ud = TRUE;}lc_time++;lc_st = LOW;} }

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

int PWMCounter; int PWMData;void InitTMR1(void) {TH1 = 0xA4; // 25uS intterruptTMOD|=0x20; // timer1 mode 6, PWMTR1 = 1; // start timer 1ET1 = 1; // Enable Timer 1 InterruptsEA = 1; // Global Interrupt Enable }/*------------------------------------------------ Timer 1 Interrupt Service Routine. 25uS intterupt onetime ------------------------------------------------*/ void timer1_ISR (void) interrupt 3 {TH1 = 0xA4;PWMCounter++;if(PWMCounter>400)PWMCounter=0;if(PWMCounter<PWMData)PWM = 0;elsePWM = 1;//testport = !testport;XTMR ++; }

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 初稿

總結

以上是生活随笔為你收集整理的放大器软件设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。