mowin 发表于 2012-8-30 23:17:34

关于28PIN LGT IO,又遇到郁闷的事,有兴趣的请进详聊

PB2设置输入(DDB2=0),即使开内部上拉,PB2脚电压死活都是1.5V,如果外部加10K上拉到3.3V,PB2电压升高到2.5V。
正好我画的一块小板用PB2做按键输入,本来以为没有问题,现在用不了……
有闲心的朋友请帮忙测试一下,谢谢。

xwkm 发表于 2012-8-31 07:48:46

IO烧了吗?

mowin 发表于 2012-8-31 08:09:29

IO没有烧。如果作为输出则没有问题,可以输出0或者3.3V。我试过的。

n0831 发表于 2012-8-31 08:13:07

换一块板子测试,如果情况一样,检查线路板是否有短路情况。一般都是自己的问题。

zhanan 发表于 2012-8-31 08:24:31

检查电路板没问题,就换一个芯片再试试。

mowin 发表于 2012-8-31 08:36:28

芯片刚换全新的,把PB2单独出来不接任何东西,结果一样的

n0831 发表于 2012-8-31 10:42:58

一般是自己的程序问题。

gzhuli 发表于 2012-8-31 10:58:56

难道内部Bandgap参考漏出来了?

mowin 发表于 2012-8-31 11:16:13

gzhuli 发表于 2012-8-31 10:58 static/image/common/back.gif
难道内部Bandgap参考漏出来了?

回大湿,不敢猜测。
因为上面有人说是我程序的问题。晚上我再做进一步的实验。

kebaojun305 发表于 2012-8-31 11:45:04

你是不是 有外设工作这个脚实际上有输出波形啊用示波器测下。

mowin 发表于 2012-8-31 12:38:03


图在这里,如果我如果把KEY0换到PB0完全没有任何问题。
晚上回去再检查程序看看。

gzhuli 发表于 2012-8-31 12:56:27

kebaojun305 发表于 2012-8-31 11:45 static/image/common/back.gif
你是不是 有外设工作这个脚实际上有输出波形啊用示波器测下。

PB2的外设功能是AN0模拟比较器+输入,要说外设影响GPIO,那除非就是ACBG控制有问题,BGR跑到外面去了。

logicgreen 发表于 2012-8-31 12:58:40

仁兄把IC拆下来,再用万用表测一下PB2的那个焊点对地的电阻是多大,如果是无穷大说明PCB没有问题,估计是IC的问题,请更换别的IC。我们根据你的问题在评估板上试过了,不会有你的问题出现。

至于gzhuli兄说的,实际即使启动了比较器也不影响PB2的电平。

gzhuli 发表于 2012-8-31 13:04:50

logicgreen 发表于 2012-8-31 12:58 static/image/common/back.gif
仁兄把IC拆下来,再用万用表测一下PB2的那个焊点对地的电阻是多大,如果是无穷大说明PCB没有问题,估计是IC ...

我也觉得PCB问题可能性比较大,首先ACBG控制的两个开关是互斥的,然后还有个GPIO MUX,这都能漏出来不太可能现在才被发现的了。

n0831 发表于 2012-8-31 14:52:46

漏出来,也是1.25不可能成了1.5吧!

mowin 发表于 2012-8-31 16:03:22

gzhuli 发表于 2012-8-31 13:04 static/image/common/back.gif
我也觉得PCB问题可能性比较大,首先ACBG控制的两个开关是互斥的,然后还有个GPIO MUX,这都能漏出来不太 ...

PCB是在老大这里打样的,质量绝对值得信赖!
昨晚搞到太晚,思路不太清晰,就先发贴出来看看有没有人遇到过。看来没有。
那今晚回去整理一下思路,相信可以找到问题点。谢谢各位关注。

mowin 发表于 2012-8-31 20:59:57

测试结果来了,确实是我代码有问题。不小心开启了模拟比较器,选择AN0为比较器输入(ACSR=0),同时又开了PB2上拉,结果就不对了。
说说问什么会写错吧,我用到ADC,用AVR时习惯初始ADC时把模拟比较器关掉,所以有ACSR=_BV(ACD)这一句。昨晚精神不佳写成ACSR=0,于是……有劳各位跟着蛋疼了,谢谢。结贴。

测试代码顺便奉上,好事者可以试试。
PB2连接到万用表,单步调试以下代码,观察电压变化。
/*
* main.c
*/

#include <avr/io.h>
#include "iolgt8f0xa.h"

int main(void)
{
        PORTA = 0xff;
        DDRA = 0;
        PORTB = 0xff;
        DDRB = 0;
        /* PB2 = 3.3V */
        PORTC = 0xff;
        DDRC = 0;
        PORTD = 0xff;
        DDRD = 0;

        ACSR = 0; /* 启用模拟比较器 */
        /* PB2 = 1.5V */
        ACSR |= _BV(ACBG); /* 选择内部1.25V参考 */
        /* PB2 = 3.3V */
        ACSR &= ~_BV(ACBG); /* 选择外部AN0输入 */
        /* PB2 = 1.5V */
        PORTB &= ~_BV(PB2);
        /* PB2 = 0V */
        PORTB |= _BV(PB2);
        /* PB2 = 1.5V */
        ACSR = _BV(ACD); /* 关闭模拟比较器 */
        /* PB2 = 3.3V */
        for (;;) {}
        return 0;
}

/* End of main.c */

doolheey 发表于 2012-8-31 22:43:37

MARK下。

tdwx 发表于 2012-8-31 23:30:12

学习了{:smile:}

n0831 发表于 2012-9-1 08:19:49

找到问题就好。

mowin 发表于 2012-9-3 08:53:57

顺便报告一下,ADC的误差比较大。参考选用AVCC(3.3V),转换0.58V左右的直流电压,ADC值比理论计算值小11LSB。
误差是不指望了。希望线性不错,DIY就懒得去测试……

n0831 发表于 2012-9-3 09:43:05

11LSB,这也太大了点吧。

LGT 发表于 2012-9-3 10:05:47

mowin 发表于 2012-9-3 08:53 static/image/common/back.gif
顺便报告一下,ADC的误差比较大。参考选用AVCC(3.3V),转换0.58V左右的直流电压,ADC值比理论计算值小11L ...

ADC输入阻抗为20K左右,请将这个内部阻抗和外部分压电路综合起来,是不是因为内部阻抗拉低了输入电压?

mowin 发表于 2012-9-3 10:38:19

再有人跟我说阻抗问题我就无语了。图在上面,有MCP6002缓冲。

我现在是直接在ADC值加上11修正。先凑合用。

jianghu-00091 发表于 2012-9-3 14:25:54

mowin 发表于 2012-9-3 10:38 static/image/common/back.gif
再有人跟我说阻抗问题我就无语了。图在上面,有MCP6002缓冲。

我现在是直接在ADC值加上11修正。先凑合用。 ...

你可以同时测试一下地电平,然后做差值,应该会比较准一点。

mowin 发表于 2012-9-3 14:49:08

我用胜利VC97量:VCC=3.328V。PA0=0.582V。理论上ADC转换出来应该是179。LGT转换出来只有168。

n0831 发表于 2012-9-3 16:24:02

168很稳定吗?还是跳来跳去?

mowin 发表于 2012-9-3 16:25:42

非常稳定。即使不做软件滤波,也只有+-1LSB跳到。滤波之后非常稳定。

n0831 发表于 2012-9-4 08:24:28

楼上也降低速度试试。我的板子还没到手,没法测试。

mowin 发表于 2012-9-4 08:40:35

本帖最后由 mowin 于 2012-9-4 08:46 编辑

我用默认的8MHz系统时钟。ADC预分频设置为128(最大值),Fadc=8000K/128=62.5KHz。已经最低。还要更低只有降主时钟了。这样单次转换时间都16uS啦,够慢的了。

编辑:单次转换时间错了,不是16uS。回头我看看规格书。

mowin 发表于 2012-9-4 08:49:10

n0831 发表于 2012-9-4 08:24 static/image/common/back.gif
楼上也降低速度试试。我的板子还没到手,没法测试。

期待你的测试报告。但愿是我自己的误差而不是IC的误差,现在已经不敢请教厂方专家了。

n0831 发表于 2012-9-8 14:54:16

板子焊接出来,测试了下。 ADC2 输入 0.554V,AVCC = 3.294V理论值为172,实际在169和170跳动,基本还算可以。

mowin 发表于 2012-9-8 14:56:39

n0831 发表于 2012-9-8 14:54 static/image/common/back.gif
板子焊接出来,测试了下。 ADC2 输入 0.554V,AVCC = 3.294V理论值为172,实际在169和170跳动,基本还算 ...

麻烦你把程序贴上,我试试。谢谢

n0831 发表于 2012-9-8 15:33:41

unsigned int DrvADC_Convers(unsigned char vref,unsigned char channel)
{
        unsigned int retval;
//        ADCSRA = 0;                        //disable ADC
//        DIDR0 = 0xFF;                //disable digital port
        ADMUX = ((vref << 6) | channel);       

        ADCSRA |= (1 << ADEN);                //enable ADC
        NOP();
        NOP();
        NOP();
        NOP();
        NOP();
        ADCSRA |= (1 << ADSC);                //enable conversion
       
        while(!(ADCSRA & (1 << ADIF)));
        ADCSRA |= (1 << ADIF);                //clear ADC interrupt flag

        retval = ADCL;
        retval |= (ADCH << 8);
        return retval;
}

n0831 发表于 2012-9-8 15:34:24

就是最简单的程序。我基本1S采集一次
页: [1]
查看完整版本: 关于28PIN LGT IO,又遇到郁闷的事,有兴趣的请进详聊