ATmega16 & AD7688 – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

ATmega16 & AD7688 – Mikrokontroléry – Fórum – Programujte.comATmega16 & AD7688 – Mikrokontroléry – Fórum – Programujte.com

 

Lotus
~ Anonymní uživatel
11 příspěvků
22. 2. 2013   #1
-
0
-

Dobrý večer pánové,

chtěl bych se zeptat, jestli jsem dobře pohopil komunikaci s AD7688 převodníkem.

Jako první jen uvedu zapojení (Mega16 = AD7688): MISO = SDO, SCK = SCK, SS = CNV

A vývod SDI spojen s VIO, takže chci komunikovat s "CS mode 3-wire, no busy indicator".

A teď ke komunikaci.

Jako první musím vytvořit impulz na pinu SS s délkou 10ns a poté následuje zvednutí SS po dobu 1us do jedničky. Po uplynutí této doby hodit SS do nuly a vyčítat 16bitů z MISO. Po přečtení 16 bitů SS do jedničky a vyčkat 2us (time between conversion". No potom už to volat pořád dokola jak chci. Je to tak správně? děkuji za odpověď.

Vyčítal jsem to z obrázku 35 (str. 17) a hodnoty časů (str. 5) z datasheetu

http://www.analog.com/static/imported-files/data_sheets/AD7688.pdf

Nahlásit jako SPAM
IP: 89.102.182.–
Lotus
~ Anonymní uživatel
11 příspěvků
22. 2. 2013   #2
-
0
-

Tak jsem něco sesmolil, ale hodnoty mi trošku lítají od mínus do plus,... :-D

unsigned int get_adc(unsigned char adata)
{
static unsigned int temp=0;

PORTB &= ~(1<<SS);     // aktivace ADC
_delay_us(2);      // prodleva 1us
SPDR = adata;      
while(!(SPSR & (1<<SPIF)));   // Poslat 1 byte přes HW SPI a čeka na tx (příjem MSB)
temp = SPDR;      
temp <<=8;       // posune proměnnou TEMP o 8 vlevo
SPDR = adata;      
while(!(SPSR & (1<<SPIF)));   // Poslat 1 byte přes HW SPI a čeka na tx (příjem LSB)
temp += SPDR;      // kombinace dat
temp <<=8;
PORTB |= (1<<SS);     // nastavi CS do 1 a tim zakaze ADC
return temp;      // navratí 16-bit hodnotu ADcka
_delay_us(4);
}
Nahlásit jako SPAM
IP: 89.102.182.–
24. 2. 2013   #3
-
0
-

nebylo by jednodušší použít SPI? AT MEGA ho má na čipu.

hu

Nahlásit jako SPAM
IP: 188.95.60.–
Lotus
~ Anonymní uživatel
11 příspěvků
24. 2. 2013   #4
-
0
-

Nyní jsem ve fázi, že hodnota zobrazená na LCD je malá. cca 2x menší než má být. A CPOL a CPHA v datasheetu není uvedené jak nastavit, tak jsou v 0. Ale s nima jsem experimentoval, takže zde chybu nevidím. Neporadí někdo? Kód je zde:

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

#include "lcd.h"  

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

char buffer[20];

unsigned int get_adc(unsigned char adata)
{
   static unsigned int temp=0;

	_delay_ms(1);
	PORTB &= ~(1<<SS);               // SET CS to LOW (activate ADC)
	_delay_us(2);                  // small dealy
	SPDR = adata;                 
	while(!(SPSR & (1<<SPIF)));     //MSB           
	temp = SPDR;                 
	temp <<=8;    //shift to upper byte                 
	SPDR = adata;                 
	while(!(SPSR & (1<<SPIF)));     //LSB
	temp += SPDR;     // add low byte
	   //temp <<=8;      // why this??
	PORTB |= (1<<SS);               // SET CS ti HIGH (stop 
	return temp;
}

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, LSB First, SPI CLK XTAL/16)
	SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);	
	// nastaveni funkcniho registra SPI (SPCR), CPHA a CPOL v log 0
	SPCR &= ~ (1<<CPOL); 
	SPCR &= ~ (1<<CPHA);	
	// CS HIGH protože SPI ADS je aktivní v 0
	PORTB |= (1<<SS);		 
}
  
int main(){  
	static unsigned int adc_value=0;	// promenna AD prevodniku
	spim_init();

    lcd_init(LCD_DISP_ON); //inicializacia displeja  

	for(;;){

	adc_value = get_adc(0xff);				// získání hodnoty z AD prevodniku

	lcd_gotoxy(0,1);
	sprintf(buffer,"ADC: %05d",adc_value);		//zobrazi na LCD hodnotu adc_value na 4 místa (0000)
	lcd_puts(buffer);
	
	}
return 0;  
}
Nahlásit jako SPAM
IP: 89.102.182.–
KIIV
~ Moderátor
+43
God of flame
24. 2. 2013   #5
-
0
-

doporucil bych nevypisovat jako signed int v tom sprintfu

a podle datasheetu by asi mohlo chtit spis CPHA=1 CPOL=0 

+ nepouzivas ten mod CS MODE 3-Wire with busy indicator? Tam bys videl uplne presne kde se ztraci ten jeden bit v diagramu

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Lotus
~ Anonymní uživatel
11 příspěvků
24. 2. 2013   #6
-
0
-

#5 KIIV
No mám to zapojené podle "CS MODE 3-WIRE, NO BUSY INDICATOR"

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

v tom pripadne zkus to cpha=1 ...  co sem tak cetl tak pokud je pri vzestupne hrane cnv DI 1 tak se zapina CS mod... a kdyz je na konci cnv 1 tak by to melo byt bez busy..

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Lotus
~ Anonymní uživatel
11 příspěvků
24. 2. 2013   #8
-
0
-

Tak jsem nastavil ten CPHA do 1 a nic. Výsledek pořád stejný.

Nahlásit jako SPAM
IP: 89.102.182.–
Lotus
~ Anonymní uživatel
11 příspěvků
25. 2. 2013   #9
-
0
-

Tak já jsem se silama už v koncích. Nikoho nic nenapadá?

Nahlásit jako SPAM
IP: 89.102.182.–
25. 2. 2013   #10
-
0
-

Jsou celkem 4 kombinace nastavení CPOL a CPHA. Dá se zkusmo projít všechny.
Podívat se digitálním paměťovým osciloskopem na SPI a porovnat signál na osciloskopu s obrázky v datasheetu převodníku. Pokud to zacyklíš, jde to i s analogovým osciloskopem.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Lotus
~ Anonymní uživatel
11 příspěvků
25. 2. 2013   #11
-
0
-

Tak to mám jeden malý problém. Nemám osciloskop.

CPHA & CPOL jsem prokombinoval mezi sebou. Pouze když byly oba v 1, tak se výsledek změnil. Ale změnil se k nepoznání (dostal jsem záporné číslo úplně mimo mísu).

A v ostatních kombinacích se číslo zobrazuje kladné, ale cca 2x menší.

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

#11 Lotus
jeste jednou:   %d  =  16bitu se znamenkem na 16. bitu...  jses si jist ze to nechces radeji vypisovat jako unsigned? Mozna by nesmyslnej vysledek najednou byl spravne

no a jinak by uz byla snad chyba jedine v tom, ze mas jinej mod prevodniku nez myslis... a prvni bit je pak ten busy bit

Nahlásit jako SPAM
IP: 2001:af0:ffcf:866:a1f4:8c...–
Program vždy dělá to co naprogramujete, ne to co chcete...
25. 2. 2013   #13
-
0
-

zkus si nechat vypsat výstup převodníku jako hex číslo. U převodníků bývá jejich výstup jiný než je signed int. Při největším záporném napětí na vstupu mají výstup 0x0000,  při 0 mají 0x8000 a při největším kladném napětí na vstupu mají 0xffff. Proto ti KIIV radí formátovat jako unsigned. Další možnost jak si pomoci je poslat výstup převodníku na par. porty procesoru a tam je osahat voltmetrem.  Tak se dozvíš, jestli ti z převodníku chodí to co má.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Lotus
~ Anonymní uživatel
11 příspěvků
25. 2. 2013   #14
-
0
-

No a ještě k tomu HW, jestli není chyba zde:

Zapojil jsem to takto: IN- jsem uzemnil, protože chci měřit v rozmezí 0-5V a na IN+ jsem připojil ono měřené napětí.

A ostatní jsem ošetřil z datasheetu.

Jinak zítra koupím ještě jeden obvod pro můj logický analyzátor a pokud se zadaří, tak průběhy s ním odměřím a dám je sem. Toto by mi určitě hodně pomohlo.

Nahlásit jako SPAM
IP: 89.102.182.–
Lotus
~ Anonymní uživatel
11 příspěvků
25. 2. 2013   #15
-
0
-

Tak jsem ten výpis hodil do HEXa.

A po nastavení 0V, jsem dostal na LCD hodnotu fffc

Při 4,97V LCD ukazuje 7fb1

Nahlásit jako SPAM
IP: 89.102.182.–
Lotus
~ Anonymní uživatel
11 příspěvků
25. 2. 2013   #16
-
0
-

#15 Lotus
Ale pozor. Změnil jsem nastavení CPOL a CPHA. Obojí do 1.

A teď při měření 1,71V jsem dostal 5887H (v dec je to 22663) a podle výpočtu mám dostat 22413. A to už je asi nejblíž.

Při 2.31V 7710H (dec 30480) a výpočet říká 30277.

Nyná už to vypadá zajímavěji.

Nahlásit jako SPAM
IP: 89.102.182.–
25. 2. 2013   #17
-
0
-

na přesnost měření má vliv spousta věcí. Převodníky mají velkou vst. impedanci a tak berou kdeco. AD7793 jsem musel zavřít do plechu, protože bral i statiku. Stačilo zamávat papírem a děly se věci. Další faktor je systém zemí a kvalita napájecího napětí. K tomu je třeba si ošetřit aby vzorkovací frekvence byla nejméně dvojnásobkem max. frekvence na vstupu. Používají se jednoduché RC dolní propusti a vzorkovací frekvence se posouvají na několikanásobek jejich horní mezní frekvence.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Lotus
~ Anonymní uživatel
11 příspěvků
25. 2. 2013   #18
-
0
-

Ale musím říct, že zase taková prkotina, tím myslím, že stačilo změnit výpis na jiný datový typ a ejhle už to frčí. 

Ale děkuji za vaše rady a postřehy. Teď už by to mohlo být OK. Zítra zkusím kouknout na tu komunikaci logickým analyzátorem.

Nahlásit jako SPAM
IP: 89.102.182.–
25. 2. 2013   #19
-
0
-

si vyhrál ve sportce?  

hu

Nahlásit jako SPAM
IP: 195.178.67.–
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, 9 hostů

Podobná vlákna

ATmega16 UART — založil Pelda

ATMEGA16 paměť — založil frontm4n

Atmega16 uart — založil jur3c

Atmega16---sfh5110-38 — založil jur3c

ATMEGA16-nastaveni — založil frontm4n

 

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