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

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

Aha, tak to s tím ADSC jsem netušil. Program přepíšu a budu to řešit přes přerušení.

Výstup PWMka mně změřit voltmetrem jde. Na stejnosměrném rozsahu mně naměří efektivní hodnotu napětí. Naměřím postupně 0 až 5 voltů. Potom se musím dopočítat k hodnotě, ale tam je samozřejmě odchylka v měření atd., takže se dostanu pouze na přibližnou hodnotu registru ADC.

S kondenzátorem jsem již experimentoval, ale po ruce jsem měl pouze 10nF. Teď koukám, že v datasheetu je 14pF. Zkusím někde vyhrabat 14pF a případně připojit na vstup ADC lineární zdroj a uvidíme,

Budu Vás průběžně informovat o mém úspěchu, respektive neúspěchu.

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

#3 MilanL
Přesně, k tomu jsem ještě došel sám, že to dělení celočíselných proměných není zrovna to pravé.

Jak již psal mistr KIIV a vy potvrdil, problém bude v tom "mém" bitovém posuvu.

Děkuji za radu, Kebule.

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

#2 KIIV
Aha, tak to jsem tedy zásadně přehlídl a namísto toho jsem trávil čas přepisováním registrů ADMUX a ADCSRA-B.
Cíl mojí práce je pouze naučit se s avr a oživit si C. To znamená, že bych rád dostal z AD převodníku všech 10 možných bitů a do budoucna již budu mít uložený funkční projekt.

Děkuji za radu, Kebule.

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

Dobrý den,

prosím o radu ohledně AD převodníku v mikrokontroléru ATtiny85. Níže je můj kód a potřeboval bych ho zkontrolovat.

Můj plán byl generovat PWM signál na pinu PB4 podle hodnoty AD převodníku, který je aktivní na pinu PB3. PWM mi funguje, ale AD převodník ne. Je jedno zda připojím PB3 na Vcc nebo GND, výsledek je pořád stejný. Nastavení registrů pro ADC jsem prošel snad stokrát, ale nevidím chybu.

ADC mám nastavený následovně: Jako referenční napětí beru napájecí napětí, ADCH a ADCL zarovnávám vpravo, pin pro ADC je nastaven na PB3, vzorkuji frekvencí FCPU/128, je nastaven Free Running mode.

V hlavní smyčce poté vyčítám registry ADCH a ADCL. Ty ukládám do proměnné, tak že její maximální hodnota je 1023 při Vref=5V a měřenému napětí 5V. Tuto hodnotu poté přepočítám na rozsah pro PWM, tedy 0-255.

Ještě detail, jako měřené testovací napětí beru čistý PWM signál z druhého mikrokontroléru. Napájecí napětí je bráno pro oba mikrokontroléry ze stejného zdroje.

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

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

unsigned int adc_result_to_PWM_range(unsigned int AdcIn);

int main(void)
{
	// PORT B
	DDRB = 0b00010000; // SET PB4 as output, rest inputs
	
	// ADC
	ADMUX = 0 << REFS1 | 0 << REFS0 | 0 << ADLAR | 0 << REFS2 | 0 << MUX3 | 0 << MUX2 | 1 << MUX1 | 1 << MUX0; 
	ADCSRA = 1 << ADEN | 1 << ADATE | 1 << ADPS2 | 1 << ADPS1 | 1 << ADPS0;
	ADCSRB = 1 << BIN | 0 << ADTS2 | 0 << ADTS1 | 0 << ADTS0;	
	
	// PWM
	OCR1B=250;
	TCCR1 = 0b00000001;
	GTCCR = 0b01100000;
	
	unsigned int step = 0;
	
	while (1)
	{		
			ADCSRA |= 1 << ADSC;
			while(ADCSRA &(1 << ADSC));
			step = (8 << ADCH) | ADCL;	
						
			OCR1B = adc_result_to_PWM_range(step);
			_delay_ms(10);			
	}
}

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

Napadá vás, kde by mohla být chyba? Pokud k tomu potřebujete více informací, tak stačí napsat.

Díky za odpovědi, Kebule.

 

 

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