ADG732 hjälp..

Övriga diskussioner relaterade till komponenter. Exempelvis radiorör, A/D, kontaktdon eller sensorer.
Användarvisningsbild
toffie
Inlägg: 1888
Blev medlem: 22 juli 2004, 21:38:07
Ort: Töreboda / Stockholm
Kontakt:

ADG732 hjälp..

Inlägg av toffie »

Hej på er igen,

Nu när jag äntligen har ritat klart kretsen så har jag börjat fundera på hur kretsen skall användas.
Datablad för kretsen återfinnes här;
http://www.analog.com/static/imported-f ... 26_732.pdf

Kort beskrivning;
The ADG726/ADG732 are monolithic CMOS 32-channel/dual 16-channel analog multiplexers. The ADG732 switches one of 32 inputs (S1-S32) to a common output, D, as determined by the 5-bit binary address lines A0, A1, A2, A3, and A4. The ADG726 switches one of 16 inputs as determined by the 4-bit binary address lines A0, A1, A2, and A3.
Den krets jag är intresserad av är då ADG732.
Som jag förstår så har kretsen 32 analoga in-kanaler, kör man in en kombination av höga/låga signaler på A0-A4
så ska man kunna få ut värdet från vardera kanal på pinne D på kretsen ADG732.

Pinnen D är sedan kopplad till en AVR som sedan får koda av signalen.
Så långt har jag väl rätt?

Om vi sedan tittar på sidan 7 i databladet, Tabell II, så har vi där en tabell med "adresserna" för pinnarna A0-A4.
Jag förmodar att dessa är i hex-värde, dvs 1,2,4,8,16 osv. Vad tror ni?

Om man då tar exempelvis kanal 11 så ska ADG732 pinnarna vara som följer; A0 hög, A1 låg, A2 hög, A3 låg, A4 hög.
Eller är det tvärtom? Jag är inte så bra på vilket hög eller låg är, men jag anser att jag kan göra så att
uC pinnarna blir 1 eller 0, bara att jag inte vet vilket som är vilket i text.

Ok, så till pinne 11 har vi kopplat en potentiometer som kanske för tillfället ger ut ett värde på 2.5V.
Hur kommer då värdet se ut på pinnen D som sitter på ADG732, kopplat till AVR uCn?

Sen, hur anser ni att ni skulle läsa av ADG732? Köra en loop som ändrar A0-A4 till varje olik adress
för att sen läsa av pinne D för varje iteration eller finns det något annat sätt att göra det på?
Jag har läst igenom databladet en hel del och kan inte hitta någonstans att "så fort en input pinne ändras, dvs en potentiometer,
så skickar ADG732 den informationen på pinne D". Så det lär nog inte finnas någon sådan funktion?

Om ni undrar vad i hela friden jag försöker göra så tänkte jag koppla in ett par stycken potentiometrar till ADG732
som i sin tur skickar information till en AVR krets som i sin tur är kopplad till en dator som tar emot informationen
via ett RS232 interface dvs UART.

Jag vet att det går, men det finns ingen direkt hjälp i ämnet men jag vill förstå så därför ber jag er om
hjälp för att komma vidare i mina tester :)

Tack på förhand till de som känner sig manade att hjälpa lilla mig :)
hatten
Inlägg: 94
Blev medlem: 9 maj 2008, 22:16:23
Ort: Uppsala

Re: ADG732 hjälp..

Inlägg av hatten »

Du verkar ha förstått kretsens funktion, i stora drag, men jag repeterar lite för övertydlighetens skull.

Din MUX kopplar 1 av 32 insignaler till output-pinnen D. Vilken signal som kopplas ut beror på bitarna A0-A4 (5 bitar ger 2^5 = 32 möjliga kombinationer) samt några andra kontrollpinnar, enligt tabell 2. Själva bitmönstret är väldigt logiskt, A=0 ger S1, A=1 ger S2, A=2 ger S3 och så vidare upp till A=31 som ger S32. Här kan man tycka att AD helt enkelt borde ha döpt ingångarna till S0-S31 istället. För att koppla ut port 11, som du säger, ska A0-A4 visa det decimala värdet 10 vilket binärt skrivs 0b01010. Däremot har du kastat om det där med låg och hög; tänk dig att du ser signalerna på ett oscilloskop, då blir 0V lågt och 5V högt.


Ok, så till pinne 11 har vi kopplat en potentiometer som kanske för tillfället ger ut ett värde på 2.5V.
Hur kommer då värdet se ut på pinnen D som sitter på ADG732, kopplat till AVR uCn?

Eftersom det är analoga signaler du vill titta på vill du inte använda mikrodatorns vanliga digitala I/O-funktioner. Du bör istället sampla signalen med den inbyggda AD-omvandlaren.


Sen, hur anser ni att ni skulle läsa av ADG732? Köra en loop som ändrar A0-A4 till varje olik adress
för att sen läsa av pinne D för varje iteration eller finns det något annat sätt att göra det på?

Enklast blir att koppla in alla potentiometrar "i följd" från S1 och uppåt, då behöver ditt program bara öka adressen med 1 vid varje iteration.


Jag vet att det går, men det finns ingen direkt hjälp i ämnet men jag vill förstå så därför ber jag er om
hjälp för att komma vidare i mina tester :)

Det finns massor av hjälp i ämnet! För ADC, USART och mycket mer kan du läsa AVR Freaks utmärkta tutorials.
Användarvisningsbild
toffie
Inlägg: 1888
Blev medlem: 22 juli 2004, 21:38:07
Ort: Töreboda / Stockholm
Kontakt:

Re: ADG732 hjälp..

Inlägg av toffie »

Tack för dina svar hatten!
Först och främst måste jag säga att du förklarar bra, men jag förstår inte riktigt vad du menar med A=0 upp till A=31..
Det kan inte vara adress pinnarna, eftersom det bara finns A0 till A4.. Så hur kommer de in i bilden?
Menar du "Adress" som A kanske? Så adress 10 (A10 / 0b01010) är pinne 2 dvs S11?

Jag kom på att jag nog aldrig hållt på med binär räkning i C, får läsa mer om det tror jag.
Det vill säga, hur man adderar 1 till "adressen" för varje iteration :D
För att "räkna" binärt har jag ju koll på, från höger så blir 5 bitar; 1, 2, 4, 8, 16.. (16,8,4,2,1) inte sant?

Är det så enkelt att man kör något liknande; "adress = 0b01010 + 1"
Eller är jag helt ute och cyklar?

-
Alternativt till "enklast" är ju att man kollar ifall värdet är ett visst "standardvärde".. Men där kom jag på mig själv att
det förmodligen inte fungerar om man inte jordar S pinnarna på ADG732 då de i sådant fall blir hängande i luften om det
inte finns någon potentiometer inkopplad.. Vilket gör att värdet "in" kommer flukturera, har jag rätt?
Det står ju ingenting om att kretsen har någon typ av avkänning för ej inkopplade pinnar, så den nollar dem eller så.

-
Från första början skrev jag siffrorna tvärtom, men som med allt där hjärnan får lite tid att tänka och man inte
känner sig så säker så ändrar man för att man tror att man har fel ;)

-
Jahaa! Så, vad jag egentligen gör med kretsen är att istället för att koppla in 32 stycken potentiometrar till vardera
egen pinne på en mikrocontroller (vilket blir väldigt overkill) så använder man ADG732 som en förgreningsdosa och får
ut exakt samma värde från pottarna som om man kopplade in dem direkt på varsin pinne på mikrocontrollern?
Bara att man får ett värde åt gången eftersom man måste byta adress för att kunna läsa av andra pottar på ADG732 kretsen?


Så i grunden räcker det med att jag har en kod för att läsa av endast EN pot men att jag sedan sätter den i en loop och läser
av in-pinnen vid varje iteration och lagrar dessa i en array? För jag lär ju inte kunna skicka ut datan lika snabbt på UART
som jag kan läsa av ADG732, inte sant?

Plus att det kanske är smartare att skicka iväg hela arrayen efter man har läst av hela ADG732?
Eller tar det kanske för "lång" tid och är jag då tvungen att vänta med nästa avläsning av kretsen för att se till så all
data har skickats iväg till datorn? Samtliga pottar ska läsas av ett program på datorn i realtid, dvs "precis direkt" när man
skruvar på dem. Vilket sätt kan vara bäst i detta fallet?

Möjligtvis får man prova båda sätten och se vilket som fungerar tillfredsställande.

-
Jag ber om ursäkt för sista delen i mitt föregående meddelande, UART / ADC var inte det jag menade att jag hade problem med
utan det var helt och hållet kretsen ADG732, precis som nu efter jag skrivit detta inlägg så känns hjärnan alldeles mosig.
Så jag skrev lite luddigt! ( Vilket jag säkert gjort i detta inlägg också, ursäkta i förskott! )

Men hur som helst, tack för dina svar! Det känns verkligen som jag kommit framåt, även om jag inte satt mig och skrivit
någon kod eller så, men bara att kunna tänka lite klarare är helt underbart! :)
hatten
Inlägg: 94
Blev medlem: 9 maj 2008, 22:16:23
Ort: Uppsala

Re: ADG732 hjälp..

Inlägg av hatten »

Ingen orsak.

Det jag menar med "A=31" är såklart att bitarna A0, A1, .., A4 ska visa det decimala värdet 31, binärt 0b11111.

Jag kom på att jag nog aldrig hållt på med binär räkning i C /.../ från höger så blir 5 bitar; 1, 2, 4, 8, 16.. (16,8,4,2,1) inte sant?
Det är absolut nödvändigt att kunna, även om din mikrodator automatiskt sköter det binära åt dig - det är lite så en dator fungerar :wink:
Allt du behöver göra är att addera 1 till din adress-variabel, modulo antalet inkopplade potentiometrar; (adress++)%NUM_DEVICES; och lägg ut den nya adressen på pinnarna. Men visst ska du lära dig mer om binära tal och binär aritmetik!


Alternativt till "enklast" är ju att man kollar ifall värdet är ett visst "standardvärde" /.../ Vilket gör att värdet "in" kommer flukturera, har jag rätt?
Det är i mina ögon ingen snygg lösning, är det inte meningen att vridpottarna ska kunna ge alla möjliga värden? Och ja, om du inte kopplar oanvända pinnar till något (GND är bra) så kommer de att flyta, så länge du inte kopplar in någon pull-up/down.


Jahaa! Så, vad jag egentligen gör med kretsen är /.../ samma värde från pottarna som om man kopplade in dem direkt på varsin pinne på mikrocontrollern?
Precis, du sparar värdefulla MCU-pinnar, och besparingen blir större desto fler pottar du kopplar in. Notera dock att kretsen blir en förgreningsdosa med 4 Ohms resistans - det spelar nog inte så stor roll i din tillämpning men kan göra det i andra fall.


Så i grunden räcker det med att jag har en kod /.../ inte kunna skicka ut datan lika snabbt på UART
som jag kan läsa av ADG732, inte sant?

Ja, du läser ju bara av D-pinnen. Vet ej hur snabbt du klockar din MCU eller UART men ja, normalt är det UART som sätter begränsningen. Vilken hastighet som krävs för att det ska kännas som "realtid" vet jag inte men sikta på att skicka uppdateringar till datorn ~10ggr/sekund så borde det bli helt okej!
Skriv svar