Första testet med attiny45!

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Castello
Inlägg: 127
Blev medlem: 9 februari 2014, 13:40:08
Ort: Göteborg

Första testet med attiny45!

Inlägg 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();
}
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Borre
Inlägg: 4564
Blev medlem: 14 juni 2007, 15:43:50
Ort: Hälsingland

Re: Första testet med attiny45!

Inlägg 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?
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Re: Första testet med attiny45!

Inlägg 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....
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Första testet med attiny45!

Inlägg 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.
Skriv svar