Sida 1 av 1

Första testet med attiny45!

Postat: 19 juli 2017, 15:57:22
av Castello
Hej!

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? :humm:

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();
}

Re: Första testet med attiny45!

Postat: 19 juli 2017, 16:19:16
av Borre
Helt död är den väl inte, det kör väl så hög duty cycle den kan, i princip 100%?
Så frågan är väl vad ADCH som du sätter som duty cycle motsvara?

Re: Första testet med attiny45!

Postat: 20 juli 2017, 22:06:33
av exile

Kod: Markera allt

   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
Som det är nu sätter du ADMUX = 0, och misstänker att du vill ha ADLAR = 1. Annars kommer värdet på ADCH vara mellan 0..3 och inte 0..255.

Det är vad jag kan se på rak hand....

Re: Första testet med attiny45!

Postat: 20 juli 2017, 22:38:04
av Mr Andersson
Du sätter igång interrupt för compare match men ISR:n är för overflow. Det borde nog vara TIMER0_COMPB_vect istället.