打印
[技术问答]

用新唐N76E003的ADC测量,串口显示连续跳,有新唐的技术支持...

[复制链接]
3016|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
arm_arm|  楼主 | 2018-7-24 11:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做N76E003的ADC,参考电压是VDD,采用电阻分压,ADC脚直接测量,用万用表显示是4.2V,在串口助手里显示如下:
Voltage:00004.29
Voltage:00004.14
Voltage:00004.25
Voltage:00004.29
Voltage:00004.14
Voltage:00004.29
Voltage:00004.16
Voltage:00004.18
Voltage:00004.29
Voltage:00004.14
Voltage:00004.29
Voltage:00004.27
Voltage:00004.14
Voltage:00004.29
Voltage:00004.14
Voltage:00004.23

显示不稳定,同样的电路用ST的003,显示的是固定数值,不跳变。

程序是根据官方例子改的,
官方例子如下:
void main (void)
{
                InitialUART0_Timer1(115200);

                Enable_ADC_AIN0;                                                // Enable AIN0 P1.7 as ADC input, Find in "Function_define.h" - "ADC INIT"
                while(1)
    {
                        clr_ADCF;
                        set_ADCS;                                                                        // ADC start trig signal
      while(ADCF == 0);
                        printf ("\n Value = 0x%bx",ADCRH);
                        printf ("\n Value = 0x%bx",ADCRL);
                        Timer0_Delay1ms(1000);
    }
}



我改的读取结果函数:

unsigned long GetResult(void)
{
        clr_ADCF;
        set_ADCS;
        while(ADCF == 0);
        temp_H=ADCRH;
        temp_L=ADCRL;
        ADCtemp=((temp_H<<4)|(temp_L&0x0F));
        return ADCtemp;
}

用的AIN7
        Enable_ADC_AIN7;        //PIN14
        Timer0_Delay1ms(100);
        data1 = GetResult();     //Read the 14th Pin's voltage
        Timer0_Delay1ms(100);
        data1 = GetResult();     //Read the 14th Pin's voltage
串口显示.....

各位知道结果跳变的原因吗?感谢。

沙发
小灵通2018| | 2018-7-24 17:41 | 只看该作者
打印原始数据看看。

使用特权

评论回复
板凳
小灵通2018| | 2018-7-24 17:41 | 只看该作者
同样的电路,用其他单片机不跳变吗

使用特权

评论回复
地板
tianxj01| | 2018-7-24 18:00 | 只看该作者
ST10位,新唐12位,看你处理过程,采用的是12位数据,对应于ST10位,没有可比性,除非你扔掉2位,再进行数字处理。

使用特权

评论回复
5
捉虫天师| | 2018-7-24 19:12 | 只看该作者
楼上讲的好,试试这个方法,丢弃低两位。

使用特权

评论回复
6
小明的同学| | 2018-7-24 21:54 | 只看该作者
12位就太牛X了,这个你要把频率将下来测。

使用特权

评论回复
7
小明的同学| | 2018-7-24 21:55 | 只看该作者
取10位或者8位看看怎么样的效果。

使用特权

评论回复
8
zhuomuniao110| | 2018-7-25 11:48 | 只看该作者
保留10BIT效果如何?

使用特权

评论回复
9
zhuomuniao110| | 2018-7-25 11:48 | 只看该作者
还有个方式采用平均值滤波法。

使用特权

评论回复
评论
arm_arm 2018-7-29 08:14 回复TA
用了16个数的平均值滤波,效果不是太好,比不用好,用10位的ADC效果更好一些。 
10
jasontu| | 2018-7-25 13:40 | 只看该作者
以新唐的规格书来看,12位adc有效位应该只有10位。

使用特权

评论回复
11
dongnanxibei| | 2018-7-25 17:21 | 只看该作者
我之前用10位做,效果很稳。

使用特权

评论回复
12
tianxj01| | 2018-7-25 18:18 | 只看该作者
dongnanxibei 发表于 2018-7-25 17:21
我之前用10位做,效果很稳。

12位的话,多次平均后,数据还是很稳定的,但是单次数据跳动就比较厉害了。所以,如果是采用12位的,是可以得到有效结果的,不过必须进行算术平均处理。

使用特权

评论回复
13
jack5288| | 2018-7-27 09:01 | 只看该作者
我使用这个官方例程用KEIL调试时,调试到“while(ADCF == 0);”就不动了,你在调试时有出现过吗?

使用特权

评论回复
14
arm_arm|  楼主 | 2018-7-29 07:38 | 只看该作者
jack5288 发表于 2018-7-27 09:01
我使用这个官方例程用KEIL调试时,调试到“while(ADCF == 0);”就不动了,你在调试时有出现过吗? ...

没有出现过,能往下走

使用特权

评论回复
15
arm_arm|  楼主 | 2018-7-29 08:11 | 只看该作者
感谢楼上几位,只取10位,效果好多了,只是末尾的一个数字有时候跳,测量值跟STM8S003测的差不多了。两者效果如下:
值经过相同的公式计算了。
ST的:

Vol:00054.46
Res:00028.73
Vol:00054.46
Res:00028.73
Vol:00054.46
Res:00028.73
Vol:00054.46
Res:00028.73
Vol:00054.46
Res:00028.73
Vol:00054.46
Res:00028.73
Vol:00054.46
Res:00028.73
Vol:00054.46
Res:00028.73
Vol:00054.46
Res:00028.73
Vol:00054.46
Res:00028.73
Vol:00054.46
Res:00028.73
Vol:00054.46
Res:00028.73
Vol:00054.46

N76E003的,10位ADC
Voltage:00054.65
Res:00028.24
Voltage:00054.65
Res:00028.24
Voltage:00054.66
Res:00028.28
Voltage:00054.66
Res:00028.28
Voltage:00054.65
Res:00028.24
Voltage:00054.65
Res:00028.24
Voltage:00054.65
Res:00028.24
Voltage:00054.66
Res:00028.28
Voltage:00054.66
Res:00028.28
Voltage:00054.65
Res:00028.24
Voltage:00054.65
Res:00028.24

使用特权

评论回复
16
tianxj01| | 2018-7-29 09:05 | 只看该作者
arm_arm 发表于 2018-7-29 08:11
感谢楼上几位,只取10位,效果好多了,只是末尾的一个数字有时候跳,测量值跟STM8S003测的差不多了。两者效 ...

新唐的AD,还是满稳定的,当然到12位时候,跳动就明显了,但是只需要经过合理的算术平均,数据位的稳定和有效还是可以得到保证的,

使用特权

评论回复
17
jack5288| | 2018-7-29 09:36 | 只看该作者
arm_arm 发表于 2018-7-29 07:38
没有出现过,能往下走

这是什么原因呢?能帮我分析下吗?ADCF == 0这行有什么用呢,前面一行 clr_ADCF定义就是ADCF = 0,这是什么意思呢?我是刚学的希望能得到你的帮助,谢谢!!!

使用特权

评论回复
18
tianxj01| | 2018-7-29 10:37 | 只看该作者
jack5288 发表于 2018-7-29 09:36
这是什么原因呢?能帮我分析下吗?ADCF == 0这行有什么用呢,前面一行 clr_ADCF定义就是ADCF = 0,这是 ...

ADCS位,写1表示启动AD。
ADCF是AD完成标志位,该位为1表示一次转换完成,该位必须软件清除,否则无法开启下一次转换。
所以每次转换以前,必须有一个clr_ADCF,就是清除该位,好启动本次AD转换。然后就是ADCS =1;启动本次转换,然后while(ADCF == 0); 等待该位变为1,本次转换完成。

使用特权

评论回复
19
jack5288| | 2018-7-29 11:19 | 只看该作者
tianxj01 发表于 2018-7-29 10:37
ADCS位,写1表示启动AD。
ADCF是AD完成标志位,该位为1表示一次转换完成,该位必须软件清除,否则无法开 ...

多谢您的回复!!
“while(ADCF == 0); 等待该位变为1,本次转换完成”不太理解这句,为什么ADCF为0是等待该位变为1.
我试了将while(ADCF == 0); 改while(ADCF ==1 ); 则可调试OK,不知是否正确?

使用特权

评论回复
20
tianxj01| | 2018-7-29 11:36 | 只看该作者
jack5288 发表于 2018-7-29 11:19
多谢您的回复!!
“while(ADCF == 0); 等待该位变为1,本次转换完成”不太理解这句,为什么ADCF为0 ...

这个不想和你多说了,while语句用法,自己好好去复习吧。
启动以后,ADCF为0,while(ADCF == 0);就是等待该位变成1,退出while这个还需要解释吗?
这个都看不懂,建议先别碰单片机,好好去复习或者学习C语言。

使用特权

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

本版积分规则

19

主题

39

帖子

0

粉丝