打印

ADC采样问题

[复制链接]
554|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zwll|  楼主 | 2020-5-14 21:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PIC16F1507 ,使用VDD做参考电压,18脚实际测量是3.9V,但是我在程序中测到的ADRESH 的数值是5.

使用特权

评论回复
沙发
xxrs| | 2020-5-14 21:23 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
zwll|  楼主 | 2020-5-14 21:26 | 只看该作者
初始化代码如下:
void adc_init(void)
{
        CHS4 = 0;
        CHS3 = 0;
        CHS2 = 0;
        CHS1 = 0;
          CHS0 = 1;                //select AN1
        ANSA1 = 1;                //select AN1         
        ADON = 1;                //enable ADC
    GO_nDONE = 1;        
        ADFM = 1;                ///  high byte high 6 bits is not use
        ADCS2 = 0;      ///  
        ADCS1 = 1;      ///
        ADCS0 = 1;      ///  ADC CLK SELECT INNER RC
        TRIGSEL3 = 0;
        TRIGSEL2 = 0;
        TRIGSEL1 = 0;
        TRIGSEL0 = 0;        
}

在主程序中,检测代码如下:
void main(void)
{
        init();

        while(1)
        {
                if(GO_nDONE == 0)
                {
                    GO_nDONE = 1;
        
                        adc_value_ave = ADRESH;
               
                }
             .
             .
             .
调试发现 adc_value_ave 的值是小于5的数,感觉严重不对。
请高手帮忙看看代码哪里有问题?

使用特权

评论回复
地板
kangzj| | 2020-5-14 21:31 | 只看该作者
你要等到ADC转换结束才能取结果。所以,正确的顺序是,切换通道,开始转换,等待完成,取结果。

使用特权

评论回复
5
zwll|  楼主 | 2020-5-14 21:33 | 只看该作者

哪儿啊?我怎么没有找到。。。

使用特权

评论回复
6
langgq| | 2020-5-14 21:36 | 只看该作者
例如,
GO_nDONE = 1;
while(GO_nDONE) ;
adc_value_ave = ADRESH;
可以如上死等,也可以先去做别的,回头来查询GO_nDONE == 0,再取结果。

使用特权

评论回复
7
bqyj| | 2020-5-14 21:41 | 只看该作者
把ADFM设错了

使用特权

评论回复
8
chenho| | 2020-5-14 21:43 | 只看该作者
ADFM = 1;                ///  high byte high 6 bits is not use

采样结果设为右边对齐了,ADRESH 寄存器的高6位没存储结果。

使用特权

评论回复
9
zwll|  楼主 | 2020-5-14 21:49 | 只看该作者
发现另外一个问题了。只要电池大于3.3V,ADRESH都是大于250.这样我就没法在3.3V以上再分电压等级了

使用特权

评论回复
10
dingy| | 2020-5-14 21:53 | 只看该作者

你有什么打算呢?或者你想知道什么?

使用特权

评论回复
11
zwll|  楼主 | 2020-5-14 21:57 | 只看该作者
同样的板子,别人的程序可以,真是好奇怪啊。

使用特权

评论回复
12
zwll|  楼主 | 2020-5-14 21:59 | 只看该作者
我用的参考电压是VDD,ADC直接接电池的。

使用特权

评论回复
13
hanwe| | 2020-5-14 22:03 | 只看该作者

vdd是多少呢?

使用特权

评论回复
14
zwll|  楼主 | 2020-5-14 22:07 | 只看该作者
我们的VDD是会变化的,随外接电源的变化而变化。

使用特权

评论回复
15
zwll|  楼主 | 2020-5-14 22:10 | 只看该作者
我想请教一下我是用VDD做参考电压的,如果VDD会变化是不是测ADC就不准了啊?

使用特权

评论回复
16
stly| | 2020-5-14 22:18 | 只看该作者
如果你的信号和VDD同步正比波动,那就无所谓。

使用特权

评论回复
17
chenho| | 2020-5-14 22:21 | 只看该作者
例如VDD通过两个电阻分压,想测量其中一个电阻上的压降,此时使用VDD做VREF就非常好。

使用特权

评论回复
18
renyaq| | 2020-5-14 22:24 | 只看该作者
反之则应该设计独立的参考电压源。

使用特权

评论回复
19
houcs| | 2020-5-14 22:28 | 只看该作者
VDD上尽量要‘干净’,如果使用开关电源生成的VDD,最好是将电压略微调高一些

使用特权

评论回复
20
chenjunt| | 2020-5-14 22:30 | 只看该作者
然后用一个LDO做一个降压,这样最终的测量效果会更好一些。

使用特权

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

本版积分规则

885

主题

11314

帖子

5

粉丝