打印
[其它应用]

SH79F165 的AD值输出不稳定

[复制链接]
617|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tian111|  楼主 | 2017-3-5 11:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
SH79F165 的AD值输出不稳定
沙发
wenfen| | 2017-3-5 12:01 | 只看该作者
怎么不稳定

使用特权

评论回复
板凳
tian111|  楼主 | 2017-3-5 12:02 | 只看该作者
差模信号为零的时候,AD值不在零附近而是好几千

使用特权

评论回复
地板
zhuhuis| | 2017-3-5 12:04 | 只看该作者
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
5
tian111|  楼主 | 2017-3-5 21:23 | 只看该作者
   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);
}

使用特权

评论回复
6
songqian17| | 2017-3-5 21:25 | 只看该作者
SH79F165 的AD值输出不稳定, 估计硬件和电源, 参考电压等电压的噪声可能性大.

使用特权

评论回复
7
chenho| | 2017-3-5 21:27 | 只看该作者
嗯,可以做个算术平滑滤波

使用特权

评论回复
8
gongche| | 2017-3-5 21:29 | 只看该作者
对,通常温度是缓慢变化的量

使用特权

评论回复
9
chenho| | 2017-3-5 21:31 | 只看该作者
是的,时间常数做大些

使用特权

评论回复
10
tian111|  楼主 | 2017-3-5 21:33 | 只看该作者
结贴了,多谢大家讨论这么多哈,呵呵

使用特权

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

本版积分规则

797

主题

8878

帖子

7

粉丝