打印
[其它应用]

温度表头

[复制链接]
1211|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wyj790501293|  楼主 | 2014-5-15 09:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
紧急求助!SH79F165 的AD值输出不稳定,并且差模信号为零的时候,AD值不在零附近而是好几千,不知哪位大侠能帮我解决一下,感激不尽!我的代码:
        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);
}
沙发
airwill| | 2014-5-17 13:23 | 只看该作者
SH79F165 的AD值输出不稳定, 估计硬件和电源, 参考电压等电压的噪声可能性大.
可以做个算术平滑滤波, 通常温度是缓慢变化的量, 时间常数做大些

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝