标题: STC15W402AS做电压表,电源电压变化时显示电压间隔0.2V显示,如12.2直接跳到12.4,没12.3 [打印本页]

作者: 李坏坏    时间: 2016-4-23 15:16
标题: STC15W402AS做电压表,电源电压变化时显示电压间隔0.2V显示,如12.2直接跳到12.4,没12.3
/**********************************************************************
*函 数 名: read_adc()
*函数功能: 读8位ADC结果
*其    它:
**********************************************************************/
unsigned char read_adc(){                                //AD转换函数,返回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);
}

/**********************************************************************
*函 数 名: vol_conver()
*函数功能: 检测电压AD值并转为电压显示数字
*其    它:
**********************************************************************/
void vol_conver(){                                //将测得的电压四次平均按分压比换算成十进制的电压数
        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.51hei.com/bbs/) Powered by Discuz! X3.1