Signály CS a FS u TLC4541 – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Signály CS a FS u TLC4541 – Mikrokontroléry – Fórum – Programujte.comSignály CS a FS u TLC4541 – Mikrokontroléry – Fórum – Programujte.com

 

Pinzeta
~ Anonymní uživatel
17 příspěvků
12. 2. 2013   #1
-
0
-

Ahojte přátelé. :-)

Prosím mohl bych mít jednoduchý, dotaz?

Splašil jsem AD převodník TLC4541, ale nějak nemůžu přijít jak jej připojit k AVRku.

Vývody VDD, AIN, GND jsou mi jasné.

SDO = je výstup (přijímám  2 Byte)

SLCK = zdroj hodin

[b]

a teď: CS slouží k vybrání zařízení na sběrnici, ale zároveň, pokud jsem to dobře pochopil, mě informuje, jestli přijímám MSB nebo LSB z výstupu SDO.

Ale nač je tam FS? Nemohl bych ho jednoduše připojit na +5V?[/b]

Podotýkám, že zařízení je samo na sběrnici. Děkuji za radu

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

CS nic neindikuje.. aktivuje vystup pokud ho hodis do log 0

fs se pouziva k nejaky synchronizaci.. a je tam jasne napsano ze pokud ho nechces pouzivat tak ho hodit na Vdd

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

#2 KIIV
Takže na komunikaci mi stačí pouze SCLK a SDO? to je hustý. :-D Díky moc KIIVE

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

no jeste CS .. vypadalo ze by se dalo pouzivat..  ale je mozne ze by nemuselo byt ani potreba (to chce poradne nastudovat)

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
13. 2. 2013   #5
-
0
-

http://www.ti.com/…/tlc4541.pdf  tabulka na str. 3. FS se připojí na VDD pokud se nepoužívá.  Druhá možnost je použít FS, v tom případě se nevyužitý CS se zapojí na GND. bez jednoho z těchto signálů ta komunikace asi fungovat nebude. Stačí si přečíst datasheet.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
remmidemmi0
Věrný člen
13. 2. 2013   #6
-
0
-

tak především si prohlídni obrázek 14 na straně 12 a přečti si důkladně pozorně a NAHLAS několikrát popis na stranách 13 až 17. To je zásadní.

Nahlásit jako SPAM
IP: 194.228.20.–
remmidemmi0
Věrný člen
13. 2. 2013   #7
-
0
-

#4 KIIV
CS je chip select a MUSÍ se použít. Prohlídni si obrázky časování signálů. Kdyby se CS nemusel používat, tak by ho výrobce do obvodu nedával.

Nahlásit jako SPAM
IP: 194.228.20.–
KIIV
~ Moderátor
+43
God of flame
13. 2. 2013   #8
-
0
-

#7 remmidemmi
technicky vzato by mohl CS byt jen pro odpojeni od sbernice... kdyz by bylo vic cipu tak se hodi chip select... pokud je obvod sam tak muze zustat aktivni stale... pokud nema CS jeste jinou funkci... napriklad ze sestupnou hranou vybavi MSB na SDO (coz tady zrovna je) - nicmene tady muze zustat stale CS low a pouzit vzestupnou hranu FS na start cyklu

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Pinzeta
~ Anonymní uživatel
17 příspěvků
15. 4. 2013   #9
-
0
-

Ahoj. Tak jsem se dneska vrhl na ten TLC4541. Ale nedaří se.

Podle všeho, ten TLC4541 potřebuje před měřením RESET PULZ. A to atk, že položí CS signál do 0 po dobu nejméně jednoho SCLK pulzu (sestupné hrany) ale ne víc než 8 SCLK pulzů. Takže jsem si chtěl udělat fci, kterou bych v mainu zavolal.

void TLC4541_init(void)
{
	PORTB |= (1<<SS);			//SET CS do 1 
	for (int i;i<4;i++)
	{
	if(SS==1)
          {}
	}   
	PORTB &= ~(1<<SS);

}

Ale problém je, že nevím, jak kontrolovat SCLK sestupnou hranu. Ale podle mě to je blbě, páč se nic nestalo. :-D Co si o tom myslíte? Jak to kontrolovat?

Nahlásit jako SPAM
IP: 89.102.184.–
Pinzeta
~ Anonymní uživatel
17 příspěvků
15. 4. 2013   #10
-
0
-

#9 Pinzeta
A abych nezapomněl. Zapojené to mám takto:

AVR = TLC4541

CS = SS

SDO = MISO

SCK = SCK

a pin FS je napojen na +5V (takže jej nepoužívám).

Nahlásit jako SPAM
IP: 89.102.184.–
Pinzeta
~ Anonymní uživatel
17 příspěvků
15. 4. 2013   #11
-
0
-

Tak jsem to zadal takto, ale taky bezezměny:

void TLC4541_init(void)
{
	PORTB &= ~(1<<SS);			//SET CS do 0 
		for (int x;x<5;x++)
		{
		PORTB |= (1<<SCLK);
		PORTB &= ~(1<<SCLK);
		}   
	PORTB |= (1<<SS);			//SET CS do 1
}
Nahlásit jako SPAM
IP: 89.102.184.–
15. 4. 2013   #12
-
0
-

http://www.ti.com/…/tlc4541.pdf   str. 12, Fig 14. těch pulzů má být 1 - 8, takže lze poslat celý byte. Jinak je tam FS nastaven na Low, asi jen při inicializaci. Asi by sis měl ten datasheet pořádně přečíst celý. Chtělo by to SPI monitorovat digitálním osciloskopem abys viděl, co tam opravdu posíláš.

hu

Nahlásit jako SPAM
IP: 188.95.60.–
Pinzeta
~ Anonymní uživatel
17 příspěvků
15. 4. 2013   #13
-
0
-

No podle mě by ta komunikace měla fungovat i při FS na +5V.

V datasheetu píší: FS: Tie this pin to VDD if not used. Takže v tomto bych problém neviděl. A s tím SCOPEM je problém. Ten opravdu nevlastním

Nahlásit jako SPAM
IP: 89.102.184.–
Pinzeta
~ Anonymní uživatel
17 příspěvků
15. 4. 2013   #14
-
0
-

Kontrolní otázka za 2 bludišťáky. Pomohou nám, teda mne tyto průběhy? Je to měřeno na log. analyzátoru s obvodem CY7C68013A.

Nahlásit jako SPAM
IP: 89.102.184.–
Pinzeta
~ Anonymní uživatel
17 příspěvků
15. 4. 2013   #15
-
0
-

Tady si dovolím ještě jeden obrázek, trošku lepší než ten minulý. Už to analyzuje i s rozhraním SPI.

Nahlásit jako SPAM
IP: 89.102.184.–
Pinzeta
~ Anonymní uživatel
17 příspěvků
15. 4. 2013   #16
-
0
-

Tak jsem se pořádně zaměřil na tu hodnotu toho AD a všiml jsem si tohoto:

např. natoším hodnotu 2040, ale další není plynulá na otočení trimru, ale další je hned 4080, 8160, 16320,...... Akorát nevím, proč mi vrací tuto hodnotu.

Program je tady

/******************************************************************************
*             Program vyčítá hodnotu z 16- bit AD převodníku AD7688           *
*				a zobrazuje ji na LCD                         *
******************************************************************************/

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

#include <inttypes.h>
#include <avr/pgmspace.h>

#include "lcd.h"  

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

char buffer[20];

void TLC4541_init(void)
{
	PORTB &= ~(1<<SS);			//SET CS do 0 
		for (int x=0;x<5;x++)
		{
		PORTB |= (1<<SCLK);
		_delay_us(1);
		PORTB &= ~(1<<SCLK);
		_delay_us(1);
		}   
	PORTB |= (1<<SS);			//SET CS do 1
	_delay_ms(2);
}

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(3);				// 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
	PORTB |= (1<<SS);			//SET CS ti HIGH (stop 
	return temp;				//return 16bit value
}

void spim_init(void)
{
	// SET PORT B OUTput
	DDRB |= (1<<MOSI) | (1<<SCLK) | (1<<SS);
	// SET MISO INput
	DDRB &= ~(1<<MISO); 
	// ENable SPI, SPI Master, LSB First, SPI CLK XTAL/16)
	SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);	
	// SET function register SPI (SPCR)
	SPCR &=  ~(1<<CPOL); 	//datasheet
	SPCR |=  (1<<CPHA);		//datasheet
	//nastaveni DORD (setup LSB and MSB)
	SPCR &= ~(1<<DORD);
	// CS HIGH (STOP AD)
	PORTB |= (1<<SS);
}
  
int main(){  
	unsigned int adc_value=0;	// ADC value


	//inicializace SPI
	spim_init();
	//inicializacia displeja 
    lcd_init(LCD_DISP_ON);  

	//inicializace ADC
	TLC4541_init();

for(;;){

	adc_value = get_adc(0xFF);				//Get ADC value

	lcd_gotoxy(0,1);
	sprintf(buffer,"ADC: %05u",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.184.–
Pinzeta
~ Anonymní uživatel
17 příspěvků
16. 4. 2013   #17
-
0
-

Takže jsem to změřil a zjistil jsem, že hodnota čtená z AD převodníku je například 16320 a tato hodnota je stejná v rozmezí 0,64V až 1,2V.

Ale přitom je tato hodnota odpovídá 1,24V.

Nahlásit jako SPAM
IP: 89.102.184.–
16. 4. 2013   #18
-
0
-

jestli nemá na vstupu žádný buffer, tak podle Fig. 22 musí být vstup napájen z malé impedance např. výstup OZ. Dále je důležitá kvalita napájecího a referenčního napětí. I zbytky rušení, které produkuje logika, vedou k nežádoucímu chování ADC. Doporučuji napájení ADC dodatečně filtrovat tlumivkou asi 1mH a par. kombinací kondenzátorů 10uF tant. a 100nF ker. nejlépe nízkošumový.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Pinzeta
~ Anonymní uživatel
17 příspěvků
16. 4. 2013   #19
-
0
-

Napájení +5V je odděleno tlmivkou 10uH od laboratorního zdroje.

Napětí z trimru je odděleno RC filtrem. Referenční napětí je použit REF02 (5V), který je filtrován 10uF a blok. 100n taky nesmí chybět. Napětí přivedeno do TLC4541 je taktéž blokováno 100n co nejblíže k čipu.

Nahlásit jako SPAM
IP: 89.102.184.–
16. 4. 2013   #20
-
0
-

RC filtr nemusí představovat malou impedanci. 

Pro spuštění měření musí proběhnout 24 CLK pulzů při CS/ v Low. To je popsaáno na str 12 a 14, Fig 16. takže přečteš 3 byte, poslední neobsahuje data, a počkáš po dobu delší než tconv.

Tenhle převodník se mi nelíbí, moc neumí, negeneruje přerušení, komunikace s ním složitá jak mlátička. Zlatý Analog Devices, mají na vstupu přepinatelný zesilovač, volitelný samplerate, dají se kalibrovat, když mají změřeno, dají to najevo. 

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Pinzeta
~ Anonymní uživatel
17 příspěvků
16. 4. 2013   #21
-
0
-

takže jako první provedu reset.

CS do 0, pak 6x clock, CS do 1. Potom by měl vrátit hodnotu FF00h, že reset je vpořádku.

Poté by mělo následovat CS do low a 24x clock a CS do jedničky.

Potom prodlevu Tconv=2,5us.

A už jen vyčítat. No jdu to zkusit.

Nahlásit jako SPAM
IP: 89.102.184.–
Pinzeta
~ Anonymní uživatel
17 příspěvků
16. 4. 2013   #22
-
0
-

Tak jsem to zkusil a nic. :-D

PS: A když jsi to už zmínil, tak napiš nějaký 16-bit AD převodník, jednokanál, s OZ od analogu? Rád bych se koukl.

Nahlásit jako SPAM
IP: 89.102.184.–
16. 4. 2013   #23
-
0
-

Těch 24 SCLK pulzů musí předcházet každému měření. Pokud jsem to dobře pochopil, umí to jen "single conversion".

Záleží na rychlosti vzorkování. Pro měření termočlánky používám AD7793, má 24 bitů, integrovanou referenci, SPI rozhraní, může měřit už od 10mV, max 500 SPS. Integrovaný Power On Reset. Pokud má naměřenou hodnotu, generuje DRDY signál - stáhne MISO na Low - lze použít jako žádost o přerušení. Podporuje i "continous mode" - měří sám s nastavenou vzorkovací frekvencí a vždy s novou hodnotou generuje DRDY. Při použití vnitřní reference 3 diferenciální vstupy. Totéž v 16 bitech je AD7792. Je vhodné ho zavřít do plechu aby nesbíral rušení a statiku. Více na stránkách výrobce www.analog.com.

Když k tomu přidáš galvanická oddělení téhož výrobce (ADUM...) a FT2232 získáš velice jednoduchý "bus powered" voltmetr do USB.

V ČR zastupuje Analog Devices firma Amtek s. r. o. Není problém koupit i kusová množství, AD7793 vyjde asi na 270,-Kč. Od Analog Devices lze získat i vzorky zdarma, zkus si vytvořit MyAnalog účet.

hu

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

tak jsem trošku popojel.

void TLC4541_init(void)
{
	static unsigned int control=0;

   PORTB &= ~(1<<SS);         //SET CS do 0
      for (int x=0;x<5;x++)
      {
      PORTB |= (1<<SCLK);
      _delay_us(2);
      PORTB &= ~(1<<SCLK);
      _delay_us(2);
      }   

   	SPDR = 0xFF;    
	_delay_ms(10);	     
	while(!(SPSR & (1<<SPIF))); //MSB           
	control = SPDR;                 
	control <<=8;               //shift to upper byte                 
	SPDR = 0xFF;   
	   
	_delay_ms(10);         
	while(!(SPSR & (1<<SPIF))); //LSB
	control += SPDR;            //add low byte
	PORTB |= (1<<SS);         	//STOP ADC

   	lcd_gotoxy(0,2);
    sprintf(buffer,"kontr: %x",control);		//zobrazi na LCD hodnotu adc_value na 4 místa (0000)
	lcd_puts(buffer);
}

Toto je funkční inicializace TLC4541. Sice občas po restartu MCU TLC4541 neinicializuje, ale na to prostě už nemůžu přijít. Ale z 90% navrátí hodnotu FF00.

Nahlásit jako SPAM
IP: 89.102.184.–
Pinzeta
~ Anonymní uživatel
17 příspěvků
16. 4. 2013   #25
-
0
-

Tak jsem doplnil před začátek toho měření onu prodlevu (24x Clock + delay delší než Tconv) a nic. Program se tváří pořád stejně.

Nahlásit jako SPAM
IP: 89.102.184.–
Pinzeta
~ Anonymní uživatel
17 příspěvků
16. 4. 2013   #26
-
0
-
Nahlásit jako SPAM
IP: 89.102.184.–
Pinzeta
~ Anonymní uživatel
17 příspěvků
16. 4. 2013   #27
-
0
-

hlucheucho:

A PLS nemáš tam nějaký zajímavý tip na AD: 16-bit, 1 kanál třeba i se zesíkem???

Nahlásit jako SPAM
IP: 89.102.184.–
17. 4. 2013   #28
-
0
-

když potřebuješ jen jeden vstup, ostatní zapojíš na GND.

Asi děláš nějaký zmatky. Podle těch obrázků z datasheetu to není nic závratně složitého. Pro inicializaci platí Figure 20, pro další práci platí Figure 18, jak přečíst hodnotu a hned spustit další měření ukazuje Figure 16. Prostě na SPI musí chodit tyto průběhy a musí být dodrženo jejich časování - předstih CS/, přesah CS/ atd. Pro usnadnění práce bych se nejdřív zaměřil na komunikaci: Jednoduchý prográmek který pošle inicializaci včetně přečteni FF00. Pokud by mi na sběrnici toto podle průběhů napětí proběhlo, pokračoval bych dál měřením podle Figure16 - číst 3 byte: první dva jsou hodnota, třetí doplňuje počet SCLK pulzů na 24 aby proběhlo další měření. Toto bych prováděl s delší prodlevou, např. 10us. Z průběhů na SCLK a MISO lze data přečíst. Pro jednoduchý test bych připojil vstup na GND - mělo by být na výstupu 0000 a pak na VREF - na výstupu by mělo být FFFF. Do třetice bych vstup připojil přes 10k odpor na zem a podíval se na výst. hodnotu. Měla by být blízko 0000, pokud je větší a nebo hodně poskakuje, vstup se musí připojit na malou impedanci, např. výstup OZ. Do začátku si lze pomoci komplementárním párem tranzistorů jako emitorové sledovače - jen pro test, pro měření nevhodné.

Jak daleko to máš do Brna?

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, 4 hosté

Podobná vlákna

Signály mezi třídami pyqt — založil František

Update join tabulky — založil rimi

Automatické doplňování — založil Sámo

 

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