Embedded AVR模拟比较器+内部上拉?

Embedded AVR模拟比较器+内部上拉?,embedded,hardware,microcontroller,avr,avr-gcc,Embedded,Hardware,Microcontroller,Avr,Avr Gcc,我有一个关于Atmel AVR微控制器的简单问题。所以我想使用ATTiny85的模拟比较器来确定信号是高于还是低于阈值。当激活时,该信号通常是浮动的,并拉向地面,即它是一个激活的低开集电极信号。如果我通过以下操作启用输入引脚上的上拉,该引脚也是比较器输入: DDRB = 0x00; // DDRB.1 = 0 = input PORTB = 0xFF; // PORTB.1 = 1 = internal pullup enabled 如果我使用模拟比较器并选择端口B.1作为AIN1,内部

我有一个关于Atmel AVR微控制器的简单问题。所以我想使用ATTiny85的模拟比较器来确定信号是高于还是低于阈值。当激活时,该信号通常是浮动的,并拉向地面,即它是一个激活的低开集电极信号。如果我通过以下操作启用输入引脚上的上拉,该引脚也是比较器输入:

DDRB  = 0x00; // DDRB.1  = 0 = input 
PORTB = 0xFF; // PORTB.1 = 1 = internal pullup enabled
如果我使用模拟比较器并选择端口B.1作为AIN1,内部上拉会应用于我的输入信号吗?我希望有人有个人经验来证实这种行为。希望这个问题对于堆栈溢出来说不是太“面向硬件”。谢谢

编辑 为了回应下面关于为什么不进行数字化处理的一些评论,这是因为我的信号是由一个传感器即光学红外传感器产生的。我不能保证它的下拉强度足以被数字解释为零,所以我将使用内部2.56V参考电压作为切换阈值。我只是想了解IR事件,所以这对我来说似乎是最简单的方法


此外,通过使用模拟比较器,我可以使用ISR异步检测事件。虽然某些引脚可以在数字边缘上调用中断,但该引脚不希望依赖于下降到V_IL以下的响应。

我不能说它会起作用,我从未做过您描述的案例,但从电子角度讲,您的推理是合理的。当开关断开时,AIN1将通过内部上拉看到VCC,当开关闭合时,两者都将看到0V

VCC
|
100k(?)
|
AIN1
|
 /
|
GND
如果没有实际阅读该处理器的数据表,就有可能无法在配置为模拟输入的引脚上使用内部上拉;在这种情况下,您可以使用芯片上配置为数字输入的另一个引脚进行上拉:

VCC
|
100k(?)
|
Other---AIN1
        |
        /
        |
        GND

但是,如果AIN1上的电压始终处于逻辑高或逻辑低范围内,则可能会使您的电流消耗相当高。

通常,您会将数字输入与上拉一起使用,因为您似乎有数字输入信号

是否有理由使用模拟输入?

从图10-5可以看出,模拟级的输入受上拉影响

因此,您可以将内部上拉与比较器一起使用。如数据表所述,您可能希望禁用该端口的数字输入阶段以降低功耗-当然,只有在您不将其用于数字输入的情况下

注:
浮动引脚会导致数字输入级的巨大电流消耗。尽量避免使用它们。

+1用于指导他查看数据表;总是第一个看的地方。不幸的是,我在尝试之前接受了这个答案。事实证明,尽管从数据表推断,为了使用管脚作为模拟比较器的输入,必须禁用内部上拉。在进行ADC时启用上拉运算会发生什么情况?是ADC被禁用了,还是您正在测量与预期不同的东西?我刚刚阅读了一些论坛帖子,似乎它应该可以工作。这是德语+1,它提出了一个显而易见的问题:当只有两种感兴趣的状态时,为什么需要模拟输入?。听起来像是一个数字输入的候选人。@Michael根据这个回答编辑了我的问题,谢谢!除非这里发生了其他事情,否则使用带上拉的数字输入管脚,没有理由使用比较器。通过上拉,开路集电极信号的功耗应该不会太高。当引脚浮动时,它应该非常接近0。@vicatu使用这种方法时要小心,如果电平检测中没有滞后现象,则可能会遇到这样的情况,即红外二极管下降到大约您的参考电压,并在那里抖动,导致产生假中断。