Jag försöker få igång en attiny45 för att på sikt bygga en buck-regulator. Jag vill läsa en spänning och med denna styra PWM-perioden hos regulatorn. Men jag har lite problem med att styra PWM-perioden. Som koden står nu så är PWM:en helt död (se bild) men om jag avkommenterar en rad och sätter OCR0B till ett hårt värde innan whileloopen så spottar den ur sig en PWM-signal.
Kan någon se varför den är död?
Kod: Markera allt
// Switched buck regulator - read level from ADC and control PWM
/* ----------------- Initialization ---------------- */
#define F_CPU 16000000 // External crystal
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
volatile char dutyCycle = 0;
/* ----------------- FUNCTIONS ---------------- */
void startConversion()
{
ADCSRA |= (1 << ADSC);
}
int main(void)
{
sei();
DDRB &= ~(1 << PORTB0); // Set port B0 as input
DDRB = (1 << PORTB1); // Set port B1 as output
ADMUX &= ~((1 << REFS0)|(1 << REFS1)|(1 << ADLAR)); // Selecting voltage reference and ADC channel
ADMUX &= ~((1 << MUX0)|(1 << MUX1)|(1 << MUX2)|(1 << MUX3)); // Selecting ADC0/pin1
ADCSRA = (1 << ADEN) | (1 << ADIE); //Enabling the ADC and interrupt enable
//ADCSRB &= ~((1 << ADTS2)|(1 << ADTS1)|(1 << ADTS0)); // Free running mode
DIDR0 = (1 << ADC0D); //Disable digital input buffer
startConversion();
TCCR0A = (1 << WGM00)|(1 << WGM01)|(1 << COM0B0)|(1 << COM0B1);
TIMSK = (1 << OCIE0B); // Timer/Counter Output Compare match B Interrupt Enable
TCCR0B = (1 << CS00); // Start PWM timer
//OCR0B = 255*0.7; // OM DENNA SÄTTS SÅ KOMMER PWM UT
while(1)
{
}
}
/* ----------------- INTERRUPT SERVICE ROUTINES ---------------- */
ISR(TIMER0_OVF_vect)
{
OCR0B = dutyCycle;
}
ISR(ADC_vect)
{
dutyCycle = ADCH;
startConversion();
}