ATTiny AREF predeterminado

Estoy tratando de hacer que el amplificador de micrófono Electret de Adafruit funcione con un ATTiny85, pero tengo algunos problemas con el voltaje de referencia. Estoy usando un circuito de 5 V porque también estoy alimentando una tira de LED y estoy tratando de evitar que el circuito sea demasiado complicado con un montón de reguladores adicionales. Dado que el chip debería usar el voltaje de suministro como referencia de forma predeterminada, pensé que estaría bien usando 5V en todos los ámbitos. Pero básicamente no obtengo respuesta del micrófono cuando hago esto. Sin embargo, si conecto 5V a AREF y luego llamo a analogReference(EXTERNAL), todo funciona bien.

¿Alguna idea de por qué sería así? Esto va completamente en contra de mi comprensión (y experiencia) del AREF predeterminado en los chips ATMega.

Sería bueno poder usar ese pin AREF para otra cosa :)

Nota al margen: voy a alimentar esto con baterías, ¿así que tal vez solo lo necesito de todos modos? Pero nuevamente, pensé que el modo predeterminado era usar VCC como referencia...

Mencionas tres plataformas diferentes: ATtiny85, ATmega y Arduino. Están estrechamente relacionados, pero ¿cuál estás usando? Incluya un enlace a la hoja de datos adecuada y las partes correspondientes del código.
Si sospecha que su suposición sobre el voltaje de referencia predeterminado es incorrecta, ¿por qué no forzarlo explícitamente en su código, solo toma un par de bytes?
Estoy usando un ATTiny85 pero en la plataforma de código Arduino. Sé que solo ocupa un par de bytes en el código, pero ocupa un pin de E/S completo que preferiría poder usar...
Puede forzarlo al Vcc predeterminado (supuesto) en unos pocos bytes y sin sacrificar el pin.
Ok... ¿podría decirme cómo hacer eso? Todo lo que sé es llamar a analogReference() y ninguna de sus opciones parece hacer lo que sugiere.
analogReference(DEFAULT) ? La referencia se cierra de forma predeterminada. Está habilitado cuando el ADC está habilitado y tiene un tiempo de inicio. Compruebe también si AREF está configurado para una referencia de tensión interna con un condensador externo . Consulte la hoja de datos del registro ADMUX, puede escribir fácilmente en el registro con ADMUX=n;. Consulte este pequeño programa mío que usa Vcc como referencia en un ATtiny13: git.linformatronics.nl/gitweb/…
Supuse que DEFAULT era lo que estaba configurado si no hacía nada, ¿entonces no era necesario configurarlo manualmente?
Solo hay una forma de averiguar si eso es cierto para programar tiny's a través de Arduino. No tengo experiencia con ese método, pero sé que no todas las bibliotecas y mecanismos funcionarán con todos los controladores. Considere ingresar al chat: chat.stackexchange.com/rooms/15/electrical-engineering

Respuestas (1)

¿Quizás está cambiando el modo de referencia A/D en algún otro lugar de su código? Puede verificar esto agregando una llamada a analogReference(DEFAULT)justo antes de su llamada a analogRead(). Esto debería seleccionar Vcc como la entrada al A/D Mux en el ATTINY85 tal como esperaba.

Aquí está el registro ADMUX de la hoja de datos ATTINY85...ATTINY85 ADMUX Registro

Aquí está el código relevante extraído de la biblioteca de Arduino....

#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
65  #define DEFAULT 0
66  #define EXTERNAL 1
67  #define INTERNAL 2

uint8_t analog_reference = DEFAULT;

void analogReference(uint8_t mode)
{
        // can't actually set the register here because the default setting
        // will connect AVCC and the AREF pin, which would cause a short if
        // there's something connected to AREF.
        analog_reference = mode;
}

int analogRead(uint8_t pin)
{
        uint8_t low, high;

        if (pin >= 14) pin -= 14; // allow for channel or pin numbers

        // set the analog reference (high two bits of ADMUX) and select the
        // channel (low 4 bits).  this also sets ADLAR (left-adjust result)
        // to 0 (the default).
        ADMUX = (analog_reference << 6) | (pin & 0x07); 
...