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
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.