[其它应用]

SH79F165 的AD值输出不稳定

[复制链接]
12185|10
手机看帖
扫描二维码
随时随地手机跟帖
tian111|  楼主 | 2021-6-14 23:50 | 显示全部楼层 |阅读模式
SH79F165 的AD值输出不稳定

使用特权

评论回复
dengdc| | 2021-6-14 23:52 | 显示全部楼层
怎么不稳定

使用特权

评论回复
tian111|  楼主 | 2021-6-14 23:54 | 显示全部楼层
差模信号为零的时候,AD值不在零附近而是好几千

使用特权

评论回复
zhenykun| | 2021-6-14 23:56 | 显示全部楼层
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
tian111|  楼主 | 2021-6-14 23:58 | 显示全部楼层
CLKCON |=0x00;
        CLKCON |=0x08;         //HFON=1;
        delay(10);                   //延时至少2mS
        CLKCON |=0x04;         //FS=1;
        REGCON=0x01;        //开启电源稳压器
        PGAM = 0xb4;         // 1011 0100 开启PGA模块 默认增益75倍  允许削波  1KHz
        ADCON = 0x11;   //0001 0001 禁止AD模块工作  ADCIF中断标志清零  选外部参考电压      
        ADT = 0xef;                    
        ADRAND=0x00;                        //随机时钟控制寄存器
        ADCH |= 0x0a;           //选AIN1+AIN1-模拟输入 (voltage resistor采集) P1.5 1.6         
        EADC = 1;                    //允许AD中断               
        ADCON |= 0x80;          //启动AD转转
void ADC_INT() interrupt 6 using 1
{                        
        ADCON &= 0xbf;        //1011 1111  ADCIF=0 中断标志ADCIF清零               
        if(!AD_bit0)
        {
        AD_middle=(((unsigned long)ADDH)<<12)|(((unsigned long)ADDM)<<8)|((unsigned long)ADDL);
        AD_DATA[AD_counter0] = AD_middle;//
        AD_counter0++;
        if(AD_counter0 > 10)                    //判断是否十个数据采集完成
        {                        
                AD_bit0 = 1;                            //是,置完成标志
        }
        else
        {
                ADCON |= 0x80;                      //重新启动AD转转
        }        
        }                  
}
long int ReadCount(void)
{
        uchar i;
        long int    Count;                        
        if(AD_bit0 == 1)
        {
                for(i = 0;i < 10;i++)
                AD_sum = AD_sum + AD_DATA[i];        //求十个数据总合
                for(i = 1;i < 10; i++)                        //循环十次
                if(AD_DATA[0] < AD_DATA[i])                //找最大值
                AD_DATA[0] = AD_DATA[i];                //交换值
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                for(i = 2;i < 10;i++)                        //循环九次
                if(AD_DATA[1] > AD_DATA[i])        //找最小值
                AD_DATA[1] = AD_DATA[i];        //交换值
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                AD_max_min = AD_DATA[0]+AD_DATA[1];        
                AD_sum = AD_sum-AD_max_min;        //去掉最大值和最小值           
                AD_sum >>= 3;                                //求平均值                                 
                //AD_sum =AD_sum /10;
                AD_Value = AD_sum; //取低字节数据
                AD_bit0 = 0;                        //准备下次采集数据
                AD_counter0 = 0;        //清AD采集数据计数单元
                AD_sum = 0;  //AD总和值清零               
                Count = AD_Value;
                _nop_();
                _nop_();
                _nop_();
                _nop_();               
                _nop_();
                _nop_();
                ADCON |= 0x80; //重新启动AD转转                                       
        }
        return(Count);
}

使用特权

评论回复
chenqianqian| | 2021-6-15 07:33 | 显示全部楼层
偏差有多大?

使用特权

评论回复
pengf| | 2021-6-15 21:14 | 显示全部楼层
SH79F165 的AD值输出不稳定, 估计硬件和电源, 参考电压等电压的噪声可能性大.

使用特权

评论回复
xxrs| | 2021-6-15 21:16 | 显示全部楼层
嗯,可以做个算术平滑滤波

使用特权

评论回复
jiajs| | 2021-6-15 21:21 | 显示全部楼层
对,通常温度是缓慢变化的量

使用特权

评论回复
zhanghqi| | 2021-6-15 21:23 | 显示全部楼层
是的,时间常数做大些

使用特权

评论回复
tian111|  楼主 | 2021-6-15 21:25 | 显示全部楼层
多谢大家讨论这么多哈,呵呵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

797

主题

8878

帖子

7

粉丝