Připojení AD převodníku k AVRku – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Připojení AD převodníku k AVRku – Mikrokontroléry – Fórum – Programujte.comPřipojení AD převodníku k AVRku – Mikrokontroléry – Fórum – Programujte.com

 

Jirka
~ Anonymní uživatel
305 příspěvků
28. 1. 2013   #1
-
0
-

Ahojte.

Chci se naučit pracovat s AD převodníkem, ale nemůžu přijít na to jak jej připojit k MCU. Mohl by mi někdo poradit, jestli to mám dobře?

Jedná se o MAX187 a atmegu16.

MAX187 komunikuje po SPI sběrnici.

A jde mi o to, jestli ty MAX187 signály SCLK, CS, DOUT můžu takto napojit na MCU (SCK, SS, MOSI), nebo jsetli ty signály musím připojit na jiné piny.

Tady jsem si sesmolil takový vlastní modulek. Poradí někdo? Děkuji

Nahlásit jako SPAM
IP: 89.102.182.–
KIIV
~ Moderátor
+43
God of flame
28. 1. 2013   #2
-
0
-

krom toho MOSI (master out slave in) kde avr je master a slave je ten A/D prevodnik... (portrebujes master in slave out)

+ proc nestaci interni A/D prevodniky?

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jirka
~ Anonymní uživatel
305 příspěvků
28. 1. 2013   #3
-
0
-

#2 KIIV
No s interním AD jsem už pracoval. Tak proč nevyzkoušet něco nového. ;-)

Ale teď zpět k tomu MAX187. Takže jak to jako připojit? To MOSI nevím kam připojit.

Nahlásit jako SPAM
IP: 89.102.182.–
KIIV
~ Moderátor
+43
God of flame
28. 1. 2013   #4
-
0
-

mosi pravdepodobne nikam .. jen se bude muset "posilat" data aby se na miso taky nacetly

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jirka
~ Anonymní uživatel
305 příspěvků
28. 1. 2013   #5
-
0
-

#4 KIIV
Takže na mosi posílat data, abych mohl přijmout z toho ADčka. Tak to je taky dobré vědět. Dík moc

Nahlásit jako SPAM
IP: 89.102.182.–
KIIV
~ Moderátor
+43
God of flame
28. 1. 2013   #6
-
0
-

#5 Jirka
no kdyby ten prevodnik umel i master mod tak nemusis.. pripadne bys mohl generovat jen clock signal a ono by se snad i neco prijalo :D

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jirka
~ Anonymní uživatel
305 příspěvků
28. 1. 2013   #7
-
0
-

#6 KIIV
No uvidíme jak daleko se dostanu. :-D Třeba se zadaří a pojede to hned. ;-)

Nahlásit jako SPAM
IP: 89.102.182.–
Standa33
~ Anonymní uživatel
4 příspěvky
29. 1. 2013   #8
-
0
-

 Z datasheetu jsem odvodil následující postup komunikace:

Signál CS nastavíš do log.0, pak musíš počkat 8,5us(převod),nebo monitorovat stav na DOUT. Po dobu převodu je v log. 0. Poté postupně přečteš 2byte(MSB,LSB). Signál CS do log.1, před dalším převodem se musí počkat 0,5us.

Max. frekvence SCKL je 4MHz, takže musí být správně nastaven kmitočet pro SPI.

 Pro ochranu vstupu AIN bych volil hodnotu (P1 cca 10k) a ochranné diody(2 x 1N4148) na GND  a Vss.

Nahlásit jako SPAM
IP: 88.100.62.–
29. 1. 2013   #9
-
0
-

ochranné diody bych volil schottky, třeba BAS 70 obsahuje obě diody v jednom pozdře. Na vstupu bych doporučilještě kondenzátor na zem. Odpor P1 bych nahradil pevným odporem a  volil s ohledem jednak na ochrannou funkci, jednak s ohledem na vstupní proudy převodníku aby nezaváděl chybu měření. Kondenzátor pak tak, aby spolu s P1 tvořil dolní propust jejíž horní mezní kmitočet je výrazně nižší než vzorkovací frekvence převodníku.  Napájení převodníku bych ještě od Vcc oddělil tlumivkou asi 1 mH.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jirka
~ Anonymní uživatel
305 příspěvků
29. 1. 2013   #10
-
0
-

No tady ty příspěvky jsem si přečetl pozdě. :-D Ale to ještě opravím. ;-)

Jinak jsem se pustil do programování, ale ono ejhle. Něco je blbě. Tady je kód, ale na displeji se mi nic nezobrazí. Asi něco dělám špatně. A to jsem zkoušel už mooc věcí.

SPI mám nastavenou na rychlost 1MHz. Takže by to mělo fungovat. Ale kde je chyba, to nevím.

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

#include "lcd.h"	//knihovna pro komunikaci s LCD 2004


// Mega16 Pinout
#define MOSI	4
#define MISO	6
#define SCLK	7
#define SS	4

char buffer[50];

unsigned int get_adc(unsigned char adata)
{
	static unsigned int temp=0;
	
	PORTB &= ~(1<<SS);					// SET CS do 0 (aktivovani ADC) 
										// zde by měla být krátká prodleva??
	SPDR = adata;					// vložit data do odesílací registru
	while(!(SPSR & (1<<SPIF)));			// Poslat 1 byte přes HW SPI a čeka na tx
	temp = SPDR;			         	// přijatá data nahraje do proměnné TEMP
	temp = temp << 8;				// posune proměnnou TEMP o 8 vlevo
	SPDR = adata;					// vloží data do odesílacího registru
	while(!(SPSR & (1<<SPIF)));			// Poslat 1 byte přes HW SPI a čeka na tx	
	temp |= SPDR;					// přijatá data nahraje do proměnné TEMP
	PORTB |= (1<<SS);				// nastavi CS do 1 a tim zakaze ADC 
	return temp;					// navratí hodnotu ADcka
}

void spim_init(void)
{
	// SET PORT B jako výstup 
	DDRB |= (1<<MOSI) | (1<<SCLK) | (1<<SS);
	// SET MISO jako vstup
	DDRB &= ~(1<<MISO); 
	// Povoleni SPI, SPI Master, SPI CLK XTAL/16, LSB First
	SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);	        // CS HIGH protože SPI ADS je aktivní v         PORTB |= (1<<SS);	 
}

int main (void)
{
	lcd_init(LCD_DISP_ON);	//inicializace LCD
	
	static unsigned int adc_value=0;	// promenna AD prevodniku
	
	spim_init();						 	// Inicializace SPI jako MASTER
	adc_value = get_adc(0xFF);				// získání hodnoty z AD prevodniku


	lcd_gotoxy(0,1);
	printf(buffer,"%d",adc_value);
	lcd_puts(buffer);


	for(;;){}
}
Nahlásit jako SPAM
IP: 89.102.182.–
29. 1. 2013   #11
-
0
-

Asi používáš Atmel Studio. Zkus si to odkrokovat v debuggeru, podívej se, co chodí na porty a co kam zapisuješ. V datasheetu nebo Application notes mají ukázky použití SPI, podívej se, jestli jsi něco neopomněl. Ještě drobnost: máš nastavený porty? SCK  a SS jako output, MISO jako input s Pull Up ....

hu

Nahlásit jako SPAM
IP: 195.178.67.–
29. 1. 2013   #12
-
0
-

ještě jedna věc: podívej se do datasheetu převodníku na průběhy komunikace s převodníkem a nastav CPHA a CPOL  tak, aby odpovídaly signály z ATMEGA tomu, co převodník požaduje. Více na http://www.atmel.com/images/doc2466.pdf str. 143

ještě je dobrý si hodnotu přečtenou z ADC poslat třeba na port a log. sondou nebo voltmetrem osahat, co tam příjde a jestli reaguje údaj na změnu napětí na vstupu. Podobně lze udělat i na otestování vstup znaku na LCD, že funguje práce s LCD

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jirka
~ Anonymní uživatel
305 příspěvků
29. 1. 2013   #13
-
0
-

#12 hlucheucho
Ano tak s tím CPOL a CPHA jsi měl pravdu. To jsem měl nastavené blbě, nebo spíš vůbec. A na ty porty jsem se díval a vypadá, že je vše jak má, ale program furt nic.

Ale normálně na tvrdo jsem si vytiskl tu proměnnou lcd_puts(adc_value); a čekal jsem, že se ta hodnota bude měnit, že se displej zblázní, že bude ukazovat ptákoviny, ale místo toho tam pořád svítí 100.  A nic se neděje.

Nahlásit jako SPAM
IP: 89.102.182.–
Jirka
~ Anonymní uživatel
305 příspěvků
29. 1. 2013   #14
-
0
-

A teď jsem si všiml, že ten modul AD převodníku je blbě. Ten trimr takto nemůže být připojený.

Nahlásit jako SPAM
IP: 89.102.182.–
29. 1. 2013   #15
-
0
-

čtení z ADC musíš provádět v cyklu. Provedeš ho jednou a pak funkce main dojde k nekonečnému cyklu ve kterém nedělá nic.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
29. 1. 2013   #16
-
0
-

Nejčastěji používám cyklus: procesor v Idle, převodník generuje žádost o přerušení, při obsluze přerušení se přečte naměřená hodnota a uloží do bufferu. Probuzený procesor zpracuje data a vrátí se do Idle.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jirka
~ Anonymní uživatel
305 příspěvků
29. 1. 2013   #17
-
0
-

Ano to jsem si vložil do cyklu for, kde to opakuju. Zdroj jsem připojil přímo k tomu AD převodníku a zkouším to. Ale bez odezvy.

Nahlásit jako SPAM
IP: 89.102.182.–
KIIV
~ Moderátor
+43
God of flame
29. 1. 2013   #18
-
0
-

a to printf je spravne? nemelo by byt spis sprintf nebo tak?

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jirka
~ Anonymní uživatel
305 příspěvků
29. 1. 2013   #19
-
0
-

áááááááááááááááááááááá já z toho vyrostu. :-D

Tak stačilo změnit printf na sprintf a už to vypadá dobře. :-D :-D :-D :-D :-D :-D

Děkuji děkuji

PS: to by mě zajímalo, kolik takových chyb mě ještě čeká. :-D

Nahlásit jako SPAM
IP: 89.102.182.–
29. 1. 2013   #20
-
0
-

#19 Jirka
hodně, tím si asi prošel každý

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jirka
~ Anonymní uživatel
305 příspěvků
30. 1. 2013   #21
-
0
-

tak jsem zase zpět. 

Tady jsem si sesmolil kus kódu, ale mám problém. Přijímám hodnoty z AD od 2048 do 4095. A nemůžu to rozslousknout.

A zakopaný pes bude tady.

unsigned int get_adc(unsigned char adata)
{
	static unsigned int temp=0;
	
	PORTB &= ~(1<<SS);		// SET CS do 0 (aktivovani ADC) 
	_delay_us(10);			// zde by měla být krátká prodleva??
	SPDR = adata;			// vložit data do odesílací registru
	while(!(SPSR & (1<<SPIF)));	// Poslat 1 byte přes HW SPI a čeka na tx
	temp = SPDR;			// přijatá data nahraje do proměnné TEMP
	temp <<= 8;			// posune proměnnou TEMP o 8 vlevo
	SPDR = adata;			// vloží data do odesílacího registru
	while(!(SPSR & (1<<SPIF)));	// Poslat 1 byte přes HW SPI a čeka na tx	
	temp += SPDR;			// combine data
	temp >>=4;			// posune proměnnou TEMP o 4 vpravo
	PORTB |= (1<<SS);		// nastavi CS do 1 a tim zakaze ADC 
	return temp;			// navratí 12-bit hodnotu ADcka
}

Ono to vypadá, jak kdybych přijímal pouze část 12-bitů. Takže jsem si myslel, že je špatné rotování, ale to jsem nakonec vyloučil. Takže chyba asi bude ve slučování (temp += SPDR;) Ale prč takto nemůžu kombinovat čísla?

Nahlásit jako SPAM
IP: 89.102.182.–
KIIV
~ Moderátor
+43
God of flame
30. 1. 2013   #22
-
0
-

kdyz se tak koukam na prubehy tak prvni bit bude "conversion end" flag - log1 pri prvnim impulzu clk  ...  takze by mohlo fungovat odmaskovani MSB u prvniho bajtu a posun jen o 3 doprava

	PORTB &= ~(1<<SS);		// SET CS do 0 (aktivovani ADC) 
	_delay_us(10);			// zde by měla být krátká prodleva??
	SPDR = adata;			// vložit data do odesílací registru
	while(!(SPSR & (1<<SPIF)));	// Poslat 1 byte přes HW SPI a čeka na tx
	temp = SPDR & 0x7F;		// přijatá data nahraje do proměnné TEMP odmaskovat MSB
	temp <<= 8;			// posune proměnnou TEMP o 8 vlevo
	SPDR = adata;			// vloží data do odesílacího registru
	while(!(SPSR & (1<<SPIF)));	// Poslat 1 byte přes HW SPI a čeka na tx	
	temp += SPDR;			// combine data
	temp >>=3;			// posune proměnnou TEMP o 3 vpravo
	PORTB |= (1<<SS);		// nastavi CS do 1 a tim zakaze ADC 
	return temp;			// navratí 12-bit hodnotu ADcka
Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jirka
~ Anonymní uživatel
305 příspěvků
30. 1. 2013   #23
-
0
-

#22 KIIV
Ano to s tím vymaskováním toho posledního bitu "7F" mě taky napadlo a tak jsem s tím začal operovat, ale zapomněl jsem změnit to rotování na 3. Tak proto mě to nějak něchtělo jet. Už to vypadá OK. Teď se už jenom poperu s tím zobrazením, ale to by už měla být "hračka".

Takže znova KIIVE Dík 

Nahlásit jako SPAM
IP: 89.102.182.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Podobná vlákna

Připojení — založil milanmichal

C# připojení k DB — založil RePRO

Připojení k MySQL — založil G0rk1ll

 

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