Atmega328p - El programa funciona con una fuente de alimentación de 2.7V pero no con 3.3V

0

Ya publiqué esta pregunta en avrfreaks pero así ahora no recibo muchas respuestas, así que decidí preguntar aquí también.

  

Comenzaré contando un poco cómo se ve este proyecto.   Para la idea básica. Disponemos de módulo Bluetooth Microchip RN4020 (3.3V   dispositivo), Cypress CY15B102Q FRAM (dispositivo 3.3V) y dos Atmega328p.

     

La idea es iluminar leds de neopíxeles WS2812B (dispositivo 5V) dependiendo de   qué datos vienen del módulo bluetooth Puede ser tanto una sola   Color o diferentes movimientos animados. Así que guardamos datos sobre animaciones.   Movimientos en FRAM. El problema con una Atmega328 era que no podía   administre a tiempo para recibir datos de UART sobre nuevas animaciones y guardar   Para FRAM e iluminar LEDS fotograma a fotograma sin perder algunos datos   desde UART (debido a que tuvo que desconectar las interrupciones en el momento de encenderlas)   LEDS).

     

Estos dispositivos obtienen energía del regulador LM1117 que se supone que debe dar   Salida de 3.3V cuando se da en 5V.

     

Así que ahora un Atmega328p es responsable de obtener datos UART de RN4020   y guardándolos en FRAM y el otro toma datos a través de SPI.   Desde FRAM y enciende leds. El problema es, por supuesto, compartir lo mismo.   FAM por estos dos Atmega328p, así que decidí dedicar 2 pines que   indicaría si FRAM está en uso por alguno de estos dos   Atmegas (si está en uso, el PIN es alto, si no es bajo). El otro Atmega mira a   esto y espera cuando otro Atmega no usa SPI y solo en este momento   apunte el SPI y comience a usar FRAM. Cuando no se usa SPI esos   los pines se configuran como entradas para que no dañen la señal.

Estas son las funciones que son responsables de activar / desactivar SPI

void turn_SPI_on()
{
    if(!spi_is_enabled){
        DATA_PORT |= (1 << FRAM_USED_BY_MCU2);
        PRR &= ~(1 << PRSPI);

        /* Set MOSI and SCK, MOSI and SS output, all others input */
        SPI_DDR = (1<<SS) | (1<<MOSI) | (1<<SCK);
        SPI_PORT = (1 << SS); //slave select high

        /* Enable SPI, Master, set clock rate fck/4 */
        SPCR = (1<<SPE)|(1<<MSTR);
        SPSR = (1 << SPI2X); //double SPI speed

        spi_is_enabled = 1;
    }
}

void turn_SPI_off()
{
    if(spi_is_enabled){
        SPCR = 0;
        SPSR = 0;

        //set everything to input
        SPI_DDR = 0;
        SPI_PORT = 0;

        spi_is_enabled = 0;

        DATA_PORT &= ~(1 << FRAM_USED_BY_MCU2);
    }
}

Lo interesante es que cuando el LM1117 obtiene un voltaje de entrada de 3.3V desde el módulo USB de UART, da una salida de 2.7V , como la hoja de datos sugiere y todavía está bien porque < fuerte> todo sigue funcionando con este voltaje. (Ambos Atmegas pueden compartir el mismo FRAM a través de SPI sin ningún problema). Ahora, el dato curioso ocurre cuando LM1117 recibió 5V en su entrada y da 3.3V salida que debería funcionar de la misma manera. Ahora, el segundo Atmega que se supone que enciende los leds lee los valores de FRAM todo mal mientras que el Atmega responsable de recibir datos de UART todavía puede acceder a FRAM sin ningún problema. Si desconecto el cable SPI CLOCK (SCK) de 1st Atmega (el responsable de UART), 2nd Atmega comienza a acceder correctamente.

¿Pueden ustedes darme alguna idea de por qué podría pasar esto? Recuerde que este es el mismo programa y funciona con una fuente de alimentación de 2.7V pero no con 3.3V.

Circuito regulador LM1117

EDITAR: otra cosa potencialmente importante: si la fuente de alimentación V_in = 3.3V (V_out = 2.7V), se toma del módulo USB UART, si la fuente de alimentación V_in = 5V (V_out = 3.3V ), se toma de la fuente de alimentación LRS-50-5

    
pregunta etrusks

2 respuestas

1

¡Se ha encontrado el problema! Una de las atmósferas estaba conectada a una placa de programación y esta placa de programación estaba conectada al programador. A pesar de que el programador no estaba enchufado en ninguna parte, obviamente, había fastidiado algo. Desconectar este programador de la placa de programación solucionó el problema.

Gracias a todos los que dieron algunos consejos útiles :)

    
respondido por el etrusks
2

De la sección 8.2.2.1 de la hoja de datos , es probable que su regulador sea inestable. Debes tener 10 \ $ \ mu \ $ F en la entrada y mínimo 10 \ $ \ mu \ $ F en la salida. Cuando alimenta el regulador 3V3 como entrada, no actúa como regulador; Eche un vistazo a esta pregunta .

    
respondido por el awjlogan

Lea otras preguntas en las etiquetas