ATTINY84 no puede hacer que PWM funcione en absoluto

0

Recientemente he estado pasando de entornos Arduino a AVR, y estoy programando un Tiny84 con el programador Sparkfun USBTiny y Atmel Studio 7. Por mi vida, no puedo entender por qué no puedo enviar un PWM señal.

He probado muchos códigos de ejemplo diferentes, recorrí la hoja de datos y configuré mis propios bits TCCR0A y TCCR0B para configurar los modos, pero hasta ahora todos los programas tienen a) no encendido el LED en absoluto o b) encendió el LED a pleno brillo, es decir, no se correlaciona con OCR0A en absoluto . El LED MOSFET está en PB2 (OCR0A, ¿verdad?) Y funciona bien con una simple función de parpadeo. El código que estoy intentando actualmente: (este emite un brillo total todo el tiempo. Incluso he probado con un led normal de 5V en la salida para asegurarme de que el MOSFET no tiene un tiempo de recuperación extremadamente lento)

#ifndef F_CPU
#define F_CPU 8000000UL // 8 MHz clock speed
#endif

#include <avr/io.h>
//#include <avr/interrupt.h>
#include <util/delay.h>


int main(void)
{   
    DDRB |= 1 << PB2;
    TCCR0A |= (1<<WGM00)|(1<<COM0A1);
    TCCR0B |= (1<<WGM02)|(1<<CS00);

    while(1){
        for (uint8_t i = 0; i < 255; i++) {
            OCR0A = i;
            _delay_ms(4);
        }

        for (uint8_t i = 255; i >= 0; i--) {
            OCR0A = i;
            _delay_ms(4);
        }
    }
}

Según tengo entendido, este debe ser PWM de fase correcta, claro en la coincidencia OCR0A y no en el escalador previo

Y el esquema (completo): EstoyintentandoponerPWMenelMOSFETdecontrolblanco,queestámanejandounapequeñaseccióndetiradeLEDde12V.LosMOSFETson NVR4501NT1G n-channel

Esto se encuentra en una tabla hecha a medida que tenía el problema de un plano de tierra roto donde coloqué mousebites al azar, así que tengo dos cables de cuerpo para solucionar ese problema.

Cualquier ayuda sería muy apreciada; incluso solo un ejemplo de lo que debería funcionar me dejaría saber si se trata de un problema de software u otro problema con mi placa.

    
pregunta Orotavia

1 respuesta

3

Creo que tu problema puede ser la elección del modo de generación de forma de onda.

Mirando la hoja de datos (extraiga de la página 83):

Ha configurado los bits WGM02 y WGM00 para que esté usando el modo 5. Puede ver que en el modo 5, el temporizador TOP está en OCRA, por lo que el temporizador cuenta desde 0 hasta el valor que ha escrito en el registro OCR0A. pero luego restableciéndolo a cero antes de que la salida del pin tenga la posibilidad de bajar, así tendrá un ciclo de trabajo del 100% PWM.

El uso del modo 1 debería funcionar como se esperaba, ya que TOP está en 0xFF, por lo que el temporizador contará de 0 a 255 cada vez y proporcionará la salida PWM de frecuencia fija de resolución de 8 bits que espera. Simplemente no establezca el bit WGM02.

También como un aparte: creo que el segundo para el bucle tiene un problema. La condición de prueba es que i es > = 0 pero esto siempre será cierto para un entero sin signo, ya que se ajustará alrededor de 0 a 255. Usar un tipo de entero con signo como int16_t funcionaría, o podría probar > 0 que se volverá falso una vez que sea igual a 0.

Espero que ayude.

    
respondido por el rattlesnake

Lea otras preguntas en las etiquetas