標題: STC15W402AS做電壓表,電源電壓變化時顯示電壓間隔0.2V顯示,如12.2直接跳到12.4,沒12.3 [打印本頁]

作者: 李壞壞    時間: 2016-4-23 15:16
標題: STC15W402AS做電壓表,電源電壓變化時顯示電壓間隔0.2V顯示,如12.2直接跳到12.4,沒12.3
/**********************************************************************
*函 數(shù) 名: read_adc()
*函數(shù)功能: 讀8位ADC結果
*其    它:
**********************************************************************/
unsigned char read_adc(){                                //AD轉換函數(shù),返回8位結果

        unsigned char ad_flg = 0;                        //存儲AD轉換標志
        WDT_CONTR = 0X3C;                                        //喂狗
        ADC_CONTR = adc_chan;                                //開ADC電源并置轉換通道
        Delay1ms(1);
        ADC_CONTR = ADC_CONTR | 0x08;                //開啟ADC轉換
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        while(ad_flg == 0){                                        //等待AD轉換結束
                WDT_CONTR = 0X3C;                                //喂狗
                ad_flg = (ADC_CONTR & 0X10);
        }
        ADC_CONTR &= 0xe7;                                        //停ADC轉換,清ADC_FLAG
        return (ADC_RES);
}

/**********************************************************************
*函 數(shù) 名: vol_conver()
*函數(shù)功能: 檢測電壓AD值并轉為電壓顯示數(shù)字
*其    它:
**********************************************************************/
void vol_conver(){                                //將測得的電壓四次平均按分壓比換算成十進制的電壓數(shù)
        unsigned char i, j, temp;
        unsigned char buf[AD_TIMES];
        WDT_CONTR = 0X3C;                        //喂狗
        adc_chan = ADC_V;                        //電壓通道

        for(i=0;i<AD_TIMES;i++){                //采樣AD_TIMES次
                  buf[i]=read_adc();
        }
        for(i=0;i<AD_TIMES-1; i++){
                for(j=i+1;j<AD_TIMES;j++){
                        if(buf[i]>buf[j]){                //升序排列
                                temp=buf[i];
                                buf[i]=buf[j];
                                buf[j]=temp;
                        }
                }
        }
        value_v=0;
        for(i=2;i<AD_TIMES-2;i++)value_v+=buf[i];
        value_v >>= 3;
        value_v *= 13;                                //data*3.3/256*1000 單位mV
        value_v <<=4;                                //乘16倍電阻分壓比

        dis_done = 0;
        v_10=value_v/10000;                                                        //10V
        v_1=(value_v-v_10*10000)/1000;                                //1V
        v_01=(value_v-v_10*10000-v_1*1000)/100;                //0.1V
        dis_done = 1;
}



作者: huanx    時間: 2017-7-15 10:49
能用嗎?源程序,仿真有沒
作者: LGH850    時間: 2018-5-4 10:30
你這個最好有個仿真電路別人才能容易分析……
作者: wulin    時間: 2018-5-4 13:13
使用12位ADC轉換,提高轉換精度,每隔2ms采一次樣,10次為一個計算周期,可以有效減小無所不在的50Hz共/差模干擾造成的影響,計算時末位+5以得到四舍五入結果。
作者: 1123212143255    時間: 2018-5-4 13:31
10位AD的片子,不要做成99.9v的,做成30.0v的就沒問題.精度受限,STC新出的12位AD的片子能解決這個
問題。
作者: nijifeng    時間: 2018-5-17 15:49
樓上說的對,新款單片機是STC8A系列的




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1