关于28PIN LGT IO,又遇到郁闷的事,有兴趣的请进详聊
PB2设置输入(DDB2=0),即使开内部上拉,PB2脚电压死活都是1.5V,如果外部加10K上拉到3.3V,PB2电压升高到2.5V。正好我画的一块小板用PB2做按键输入,本来以为没有问题,现在用不了……
有闲心的朋友请帮忙测试一下,谢谢。 IO烧了吗? IO没有烧。如果作为输出则没有问题,可以输出0或者3.3V。我试过的。 换一块板子测试,如果情况一样,检查线路板是否有短路情况。一般都是自己的问题。 检查电路板没问题,就换一个芯片再试试。 芯片刚换全新的,把PB2单独出来不接任何东西,结果一样的 一般是自己的程序问题。 难道内部Bandgap参考漏出来了? gzhuli 发表于 2012-8-31 10:58 static/image/common/back.gif
难道内部Bandgap参考漏出来了?
回大湿,不敢猜测。
因为上面有人说是我程序的问题。晚上我再做进一步的实验。 你是不是 有外设工作这个脚实际上有输出波形啊用示波器测下。
图在这里,如果我如果把KEY0换到PB0完全没有任何问题。
晚上回去再检查程序看看。 kebaojun305 发表于 2012-8-31 11:45 static/image/common/back.gif
你是不是 有外设工作这个脚实际上有输出波形啊用示波器测下。
PB2的外设功能是AN0模拟比较器+输入,要说外设影响GPIO,那除非就是ACBG控制有问题,BGR跑到外面去了。 仁兄把IC拆下来,再用万用表测一下PB2的那个焊点对地的电阻是多大,如果是无穷大说明PCB没有问题,估计是IC的问题,请更换别的IC。我们根据你的问题在评估板上试过了,不会有你的问题出现。
至于gzhuli兄说的,实际即使启动了比较器也不影响PB2的电平。 logicgreen 发表于 2012-8-31 12:58 static/image/common/back.gif
仁兄把IC拆下来,再用万用表测一下PB2的那个焊点对地的电阻是多大,如果是无穷大说明PCB没有问题,估计是IC ...
我也觉得PCB问题可能性比较大,首先ACBG控制的两个开关是互斥的,然后还有个GPIO MUX,这都能漏出来不太可能现在才被发现的了。 漏出来,也是1.25不可能成了1.5吧! gzhuli 发表于 2012-8-31 13:04 static/image/common/back.gif
我也觉得PCB问题可能性比较大,首先ACBG控制的两个开关是互斥的,然后还有个GPIO MUX,这都能漏出来不太 ...
PCB是在老大这里打样的,质量绝对值得信赖!
昨晚搞到太晚,思路不太清晰,就先发贴出来看看有没有人遇到过。看来没有。
那今晚回去整理一下思路,相信可以找到问题点。谢谢各位关注。 测试结果来了,确实是我代码有问题。不小心开启了模拟比较器,选择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 */ MARK下。 学习了{:smile:} 找到问题就好。 顺便报告一下,ADC的误差比较大。参考选用AVCC(3.3V),转换0.58V左右的直流电压,ADC值比理论计算值小11LSB。
误差是不指望了。希望线性不错,DIY就懒得去测试…… 11LSB,这也太大了点吧。 mowin 发表于 2012-9-3 08:53 static/image/common/back.gif
顺便报告一下,ADC的误差比较大。参考选用AVCC(3.3V),转换0.58V左右的直流电压,ADC值比理论计算值小11L ...
ADC输入阻抗为20K左右,请将这个内部阻抗和外部分压电路综合起来,是不是因为内部阻抗拉低了输入电压? 再有人跟我说阻抗问题我就无语了。图在上面,有MCP6002缓冲。
我现在是直接在ADC值加上11修正。先凑合用。 mowin 发表于 2012-9-3 10:38 static/image/common/back.gif
再有人跟我说阻抗问题我就无语了。图在上面,有MCP6002缓冲。
我现在是直接在ADC值加上11修正。先凑合用。 ...
你可以同时测试一下地电平,然后做差值,应该会比较准一点。 我用胜利VC97量:VCC=3.328V。PA0=0.582V。理论上ADC转换出来应该是179。LGT转换出来只有168。 168很稳定吗?还是跳来跳去? 非常稳定。即使不做软件滤波,也只有+-1LSB跳到。滤波之后非常稳定。 楼上也降低速度试试。我的板子还没到手,没法测试。 本帖最后由 mowin 于 2012-9-4 08:46 编辑
我用默认的8MHz系统时钟。ADC预分频设置为128(最大值),Fadc=8000K/128=62.5KHz。已经最低。还要更低只有降主时钟了。这样单次转换时间都16uS啦,够慢的了。
编辑:单次转换时间错了,不是16uS。回头我看看规格书。 n0831 发表于 2012-9-4 08:24 static/image/common/back.gif
楼上也降低速度试试。我的板子还没到手,没法测试。
期待你的测试报告。但愿是我自己的误差而不是IC的误差,现在已经不敢请教厂方专家了。 板子焊接出来,测试了下。 ADC2 输入 0.554V,AVCC = 3.294V理论值为172,实际在169和170跳动,基本还算可以。 n0831 发表于 2012-9-8 14:54 static/image/common/back.gif
板子焊接出来,测试了下。 ADC2 输入 0.554V,AVCC = 3.294V理论值为172,实际在169和170跳动,基本还算 ...
麻烦你把程序贴上,我试试。谢谢
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;
} 就是最简单的程序。我基本1S采集一次
页:
[1]