Anonymní profil Kebule – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Kebule – Programujte.comAnonymní profil Kebule – Programujte.com

 

Příspěvky odeslané z IP adresy 213.226.252.–

Kebule
Mikrokontroléry › Nastavení ATtiny85 jako AD p…
13. 11. 2017   #218539

Tak mně to nedalo, začal jsem testovat a hlavní problém byl použití měřeného napětí z výstupu PWM druhého mikrokontroléru. Je určitě potřeba filtr a odfiltrovat střídavou složku a dostat z PWM opravdu pouze střední hodnotu napětí (ne tu efektivní, jak jsem psal výše).

Teď když na ADC nastavím určité napětí, dostanu přesně to stejné na výstupu PWM. Je to otestováno na verzi níže a i na verzi, kdy se čte hodnota z ADC při přerušení.

#ifndef F_CPU
#define F_CPU 1000000UL // 1 MHz clock speed
#endif

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

unsigned long adc_result_to_PWM_range(unsigned long AdcIn);

int main(void)
{
	// PORT B
	DDRB |= 1 << DDB4; // SET PB4 as output, rest inputs
	
	// PWM
	OCR1B = 250;
	TCCR1 = 0b00000001;
	GTCCR = 0b01100000;
	
	// ADC
	ADMUX   = (1 << MUX1);
	ADMUX  |= (1 << MUX0);
	ADCSRA  = (1 << ADEN);
	ADCSRA |= (1 << ADATE);
	ADCSRA |= (1 << ADPS2);
	ADCSRA |= (1 << ADPS1);	
	ADCSRA |= (1 << ADSC);
	
	while (1)
	{		
			while ( !(ADCSRA & (1 << ADIF)));
			OCR1B = adc_result_to_PWM_range(ADC);
			_delay_ms(10);
			ADCSRA |= (1 << ADIF);		
	}
}

unsigned long adc_result_to_PWM_range(unsigned long AdcIn){
	return ((AdcIn * 1000 * 255) / 1023) / 1000;
}

Děkuji chlapi za rady a zároveň narovinu přiznávám, že se ještě ozvu.

Kebule
Mikrokontroléry › Nastavení ATtiny85 jako AD p…
13. 11. 2017   #218530

Ano, teď tu kravinu vidím a uvědomuji si jí, děkuji KIIV (#12).

hlucheucho: Vyzkouším to co radíš, nastavit co nejméně registrů a rozhýbat základ. Vyčítat data z ADC při přerušení byl můj následující plán, potom co rozhýbu toto.
Výsledek ADC nemůžu poslat na PORT, jelikož mám pouze PORT B a k tomu jen sěst pinů. Výstup řeším PWMkem, LEDkou a voltmetrem.
Ty zápisy 0 do registrů tam mám, protože nastavení těchto registrů dokola ladím a vidím co a kam zapisuji.
U ADSC je napsáno: ADSC will read as one as long as a conversion is in progress. When the conversion is complete, it returns to zero. Writing zero to this bit has no effect.
Děkuji za rady.

Celý ADC chápu tak, že ho povolím a řeknu mu čím se bude spouštět (v mém případě Auto Triggering - Free Running Mode) a následně si setuji bit ADSC a čekám až ho ADC vyresetuje. V momentě kdy je ADSC nula, konverze je hotová a já mohu vyčíst data. Je to tak?

Pořád přemýšlím o tom, zda není problém v tom, že ten ADC krmím PWMkem z druhého mikrokontroleru bez nějakých filtrů apod.

Kebule
 

Kebule
Mikrokontroléry › Nastavení ATtiny85 jako AD p…
13. 11. 2017   #218514

Podle datasheetu, ale nemám možnost získat přímo 16 bitové číslo. Mám k dispozici pouze ADCH a ADCL registr. V případě, že zarovnám bity doleva, tak můžu číst pouze ADCH a získám 8 bitové rozlišení.

Právě to, teď zkouším. ALDARem zarovnám bity doleva a vyčítám pouze ADCH a to následně přiřazuji rovnou do registru pro PWM. Bohužel, na výstupu pořád nic.

while (1)
	{		
			ADCSRA = 1 << ADSC;
			while(ADCSRA &(1 << ADSC));
					
			OCR1B = ADCH;
			_delay_ms(10);		
	}

Pokud by jste měli chuť a čas, zkuste prosím projít registry pro nastavení AD převodníku (manuál zde: http://www.atmel.com/images/atmel-2586-avr-8-bit-microcontroller-attiny25-attiny45-attiny85_datasheet.pdf a je to strana 134).

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032022 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý