hengjng_t 发表于 2012-8-16 17:48:41

中颖 SH79F166A 单片机 AD 和定时器问题

有没有哪位大侠,用过中颖 SH79F166A 单片机 的!我是个新手,刚用这款单片机,用它的AD,AD值总是在乱跳,定时器的时间也不对!
请各位大侠,给个例程,学习下,谢谢!!

wallelectronics 发表于 2012-8-17 08:18:49

内部晶振还是外部晶振、是否分频?
看门狗是否开启??
AD乱跳是什么概念?跳了多少数,模拟信号接的什么信号?可以接一个恒定的信号,再看看还跳不跳。

hengjng_t 发表于 2012-8-17 09:51:56

wallelectronics 发表于 2012-8-17 08:18 static/image/common/back.gif
内部晶振还是外部晶振、是否分频?
看门狗是否开启??
AD乱跳是什么概念?跳了多少数,模拟信号接的什么信 ...

用的是 内部晶振,没分频!
看门狗 没开!
AD 跳的范围很大,有几十的误差, 我是直接用精密滑动电阻器分压来做的,信号应该是很稳的,以前用STC的单片机这种方法没有问题!
我想应该是 单片机不熟悉,哪里设置不清楚,所以会有这样的结果!我把相关代码 贴上去,望大侠指教,谢谢!
AD相关代码
//-------AD define--------
#define AN0 0x00
#define AN1 0x02
#define AN2 0x04
#define AN3 0x06
#define AN4 0x08
#define AN5 0x0a
#define AN6 0x0c
#define AN7 0x0e

//*****************系统初始化**********************//
void        system_int()
{       
        P1CR=0xff;
        P1PCR=0xff;
        P1=0X00;
       
        P2CR=0xff;
        P2PCR=0xff;
        P2=0X00;
       
        P3CR=0xff;
        P3PCR=0xff;
        P3=0X00;
       
        P4CR=0x0f;          //设置p4.0为输入
        P4PCR=0x0f;          //关上拉电阻
        P4=0X00;
       
        P5CR=0xff;
        P5PCR=0xff;       
        P5=0X00;
       
}
//***************AD 采集****************//

uint get_adc(uchar ch)
{
//        int i,adc;
        ADCON        =        0x80;        //允许ADC模块
        ADT                =        0x20;        //DC时钟为系统时钟的32分频
        ADCH         =   0x01;           //选择AD输入通道       
        ADCON        |=ch;           //选择CH1通道
        for(i=0;i<250;i++);
        ADCON        |=0x01;        //开始ADC转换
        while(ADCON&0x01);
        adc = ADDH;
        adc<<=2;
        adc = adc + ADDL;

        return adc;
       
}
//********************AD 求平均******************//
void AD_COUNT()
{
        AD1=get_adc(AN0);//ADchange(AN0);//
        AD_zhong=AD_zhong+AD1;
        c++;
        if(c==50)
        {
                AD_jun=AD_zhong/50        ;
                AD_zhong=0;
                c=0;
        }
}


定时器相关代码
//*****************系统初始化**********************//
void        system_int()
{       
       
        P1CR=0xff;
        P1PCR=0xff;
        P1=0X00;
       
        P2CR=0xff;
        P2PCR=0xff;
        P2=0X00;
       
        P3CR=0xff;
        P3PCR=0xff;
        P3=0X00;
       
        P4CR=0x0f;          //设置p4.0为输入
        P4PCR=0x0f;          //关上拉电阻
        P4=0X00;
       
        P5CR=0xff;
        P5PCR=0xff;       
        P5=0X00;
       
}
//*****************定时器 初始化********************//
void time_int()
{

        CLKCON = 0x00;
        T2CON=0X00;        //定时器2 控制寄存器 16位自动重载方式
        T2MOD=0x00;//
        RCAP2H = 0xff;
        RCAP2L = 0xad;
        TH2    = 0xff;
        TL2    = 0xad;
        IEN0 = 0xa0;
        TR2=1;
        TF2=0;                     
        ET2=1;//使能T2中断
        EA=1;//开总中断                 
}
void Time2(void) interrupt 5
{
    TF2=0;
    aa++;
}       

wallelectronics 发表于 2012-8-17 10:02:44

hengjng_t 发表于 2012-8-17 09:51 static/image/common/back.gif
用的是 内部晶振,没分频!
看门狗 没开!
AD 跳的范围很大,有几十的误差, 我是直接用精密滑动电阻器分 ...

我没用过这个片子,用的是165,有几个小建议:
1.不用每次读数据都配置AD吧,初始化一次就够了……,配置AD后有个建立时间;
2.adc = adc + ADDL;    ADDL只有低两位有效,把高六位清零后再和adc相加吧;
3.先别平均,光看看读出来的数据,虽然平均很简单,但也有可能出错,不要引入那么多不确定的因素。

hengjng_t 发表于 2012-8-17 10:11:28

wallelectronics 发表于 2012-8-17 10:02 static/image/common/back.gif
我没用过这个片子,用的是165,有几个小建议:
1.不用每次读数据都配置AD吧,初始化一次就够了……,配置 ...

好的,谢谢指教!!我再调调看!!

oopuuo 发表于 2013-6-24 16:40:44

想问一下解决问题了吗

muyejingfeng 发表于 2013-11-18 09:33:24

也是马上要开始用中颖的芯片了。

奮闘ing 发表于 2014-4-6 14:22:33

解决了吗??

ljy99731 发表于 2014-4-6 22:00:34

这个片子我还真用过,没觉得AD有什么问题。参照4楼的建议,同时考虑ADC的时钟是不是太快,或输入阻抗太大了。

sfq2008 发表于 2014-4-7 12:14:19

在用166A的ADC,暂时没有发现什么问题
页: [1]
查看完整版本: 中颖 SH79F166A 单片机 AD 和定时器问题