|
代碼采用ADC中斷式, ,ADC值抖動的更厲害了,請高手幫忙檢查一下代碼是否有問題。謝謝大家。
- #define N 12 //取中值
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- WORD ADCx,ADCbg,bandgap,ADCx10filter,ADCx11filter;
- WORD VoltageBuf[N],CurrentBuf[N];
- // 初始化ADC
- void InitADC() {
- P1ASF = 0x03;// (1 << ADC_CHANNEL); // 設(shè)置P1.0,P1.1為ADC輸入
- ADC_RES = 0;ADC_RESL = 0; // 清除ADC結(jié)果寄存器
- CLK_DIV = 0x20;
- ADC_CONTR = 0x88|0x01;//ADC_POWER | ADC_SPEEDLL | ADC_CHANNEL; // 使能ADC,設(shè)置速度為最快
- Delay20ms(); // 等待ADC穩(wěn)定
- EADC = 1;
- }
- //中值濾波法(去掉最大,最小值,取平均值)
- void filter(char channel)
- {
- char i,j,count;
- int crtemp,votemp,sum=0;
- if(channel==0){
- for(j=0;j<(N-1);j++)
- {
- for(i=0;i<(N-j);i++)
- {
- if(CurrentBuf[i]>CurrentBuf[i+1])
- {
- crtemp = CurrentBuf[i];
- CurrentBuf[i]= CurrentBuf[i+1];
- CurrentBuf[i+1]= crtemp;
- }
- }
- }
- for(count =1;count<N-1;count++) sum += CurrentBuf[count];
- ADCx10filter=sum/(N-2);
- }
-
- if(channel==1){
- for(j=0;j<(N-1);j++)
- {
- for(i=0;i<(N-j);i++)
- {
- if(VoltageBuf[i]>VoltageBuf[i+1])
- {
- votemp = VoltageBuf[i];
- VoltageBuf[i] = VoltageBuf[i+1];
- VoltageBuf[i+1] = votemp;
- }
- }
- }
- for(count =1;count<N-1;count++) sum += VoltageBuf[count];
- ADCx11filter=sum/(N-2);
- }
- }
- //ADC中斷函數(shù)
- void adc_isr()interrupt 5 using 1
- {
- static char vo=0,cr=0,ch=0;
- // ADC_CONTR &= !0x10; //CLOSE ADC ADC_FLAG復(fù)位
- ADC_CONTR &= ~ADC_FLAG;
- if(ch==0)
- {
- CurrentBuf[cr] = (ADC_RES*256+ADC_RESL);
- cr++;
- if(cr==N){
- cr=0;
- filter(0);
- }
- }
- if(ch==1)
- {
- VoltageBuf[vo] = (ADC_RES*256+ADC_RESL);
- vo++;
- if(vo==N){
- vo=0;
- filter(1);
- }
- }
- ch++;
- if(ch>1)ch=0;
- ADC_CONTR = 0x88|ch; //ADC_POWER | ADC_SPEEDLL | 0x02 | ADC_START;
- }
復(fù)制代碼 |
|