AD75019 16x16 switch matrix via SPI

Hardware die niet past in bovenstaande onderwerpen
Gebruikers-avatar
Berichten: 63
Geregistreerd: 10 Jul 2014, 14:54

AD75019 16x16 switch matrix via SPI

Berichtdoor MrHaroldA » 14 Jul 2016, 00:44

Ik probeer een AD75019 16x16 switch matrix via SPI aan te sturen. Het werkt al wel, maar is alles behalve betrouwbaar.

Dit is een voorbeeld van de data die ik via SPI naar de chip verstuur.

plain code
Shifting patchData: 012

X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 GND IN
Y0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
Y1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Y2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Y3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
GND 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0
OUT 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0


En dit gaat vaak goed, maar soms ook niet. En daar zit het probleem ;)

Dit is de functie die de boel via SPI naar buiten stuurt:

cpp code
/**
* Shift out 256 bits of data using SPI.
*/
void shiftPatch() {
int patchMatrix[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

constructPatchMatrix(patchMatrix, patchData);

// Set up the speed, data order and data mode.
SPI.beginTransaction(SPISettings(SPI_SPEED, MSBFIRST, SPI_MODE0));
for (int y = 15; y >= 0; y--) {
SPI.transfer16(patchMatrix[y]);
}
SPI.endTransaction();

// Pulse LATCH_PIN_AD75019/SS to parallel latches.
delayMicroseconds(8); // @todo: nodig? (zie datasheet t5)
digitalWrite(LATCH_PIN_AD75019, LOW);
delayMicroseconds(8); // @todo: nodig? (zie datasheet t6)
digitalWrite(LATCH_PIN_AD75019, HIGH);
}


Zoals je ziet twijfel ik al over de timing, maar zo leek hij het vaakst goed te doen. De boel zit nu overigens nog op mijn breadboard. Kan het daar mee te maken hebben? SPI-snelheid is al terug naar 125000Hz, maar dat scheelde volgens mij helemaal niets.

Afbeelding


Wat is nu wijsheid; een printje maken om de verbinding zo kort en degelijk mogelijk te maken, of me meer in de timing verdiepen?


Datasheet AD75019: http://www.analog.com/media/en/technica ... D75019.pdf

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: AD75019 16x16 switch matrix via SPI

Berichtdoor nicoverduin » 14 Jul 2016, 07:53

Hoi Harald,
WAT gaat er niet goed?
En dat linkje doet weinig.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 63
Geregistreerd: 10 Jul 2014, 14:54

Re: AD75019 16x16 switch matrix via SPI

Berichtdoor MrHaroldA » 14 Jul 2016, 09:10

nicoverduin schreef:Hoi Harold,
WAT gaat er niet goed?
En dat linkje doet weinig.


Hey Nico! Lang niet gesproken ;) Alles goed?

En een hele goede vraag; om deze setup te testen mat ik eerst met mijn DMM de verbindingen, maar dat wat nogal een klus met 16 in en outputs. Ik heb nu X1-7 met Y1-7 doorgelust, dus X1=Y1, X2=Y2, etc. X0/Y0 is niet doorgelust.

Op Y15 heb ik een verbinding naar GND gelegd, en op X15 heb ik via een weerstand een LED aangesloten.

Dit is een lege patch:

plain code
.   X0  X1  X2  X3  X4  X5  X6  X7  X8  X9  X10 X11 X12 X13 GND IN 
Y0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
GND 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0
OUT 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

X15 is daar verbonden aan Y15, en de LED gaat aan en bij het aanzetten van loop 1-7 blijft de LED branden.

plain code
.   X0  X1  X2  X3  X4  X5  X6  X7  X8  X9  X10 X11 X12 X13 GND IN 
Y0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
Y2 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Y3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
Y4 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
Y5 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
Y6 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
Y7 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
Y8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Y13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
GND 1 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0
OUT 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0

Bij het togglen van loop X0/Y0, of 8+ zou de LED uit moeten gaan, en dat doet hij < 50% van de tijd; dus soms wel, soms niet. Ik heb wel het gevoel dat als hij het eenmaal begint te doen, hij het best vaak goed doet.

Het toevoegen van de delayMicroseconds() was een redelijke verbetering in die score, maar ik wil natuurlijk 100% goed schakelen.


Mijn vermoeden is nu dat a) de test-setup hardwarematig niet goed genoeg is of b) de timing niet klopt.

Het linkje naar de datasheet werkt hier wel gewoon? Overigens kan ik geen application notes vinden van de AD75019. Informatie van de fabrikant staat hier: http://www.analog.com/en/products/switc ... 75019.html

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: AD75019 16x16 switch matrix via SPI

Berichtdoor shooter » 14 Jul 2016, 09:52

allereerst is de ON resistance max 300 ohm, ofwel daar gaat een ledje maar net op aan.
Verder gaat er als je een ledje aansluit veel te veel stroom lopen, het zijn analoge schakelaars,

https://ez.analog.com/docs/DOC-13484
maximum is 12 mA, echter typical is het maar 1 mA.
en de weerstand aan de uitgang zou dan 10 kohm moeten zijn.

Je gebruikt de array dus eigenlijk niet op de juiste manier.
beter is om dan een uln200x erachter te hangen, dan ben je van de stroom weg.

ik denk dus dat je array wel goed is, maar je meetmethode niet.
zet op de ingangen (nou ja maakt niet uit) eens een weerstand brugje dus ergens 5 V ergens 2 volt of zo
en dan op de uitgangen meten.
Verder moet de analog spanning hoger zijn dan de digital dus bijv +9 en -9 Volt en natuurlijk 5 V digitaal

en je moet zeker weten dat de SPI klaar is met zenden voor je de Pclock bedient, je geeft namelijk opdracht tot het verzenden van data in de loop, maar afhankelijk van de snelheid van de Sclock duurt het natuurlijk even, (en daar wacht je niet op) dus gewoon wachten tot buffer leeg is en dan pas latchen.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 63
Geregistreerd: 10 Jul 2014, 14:54

Re: AD75019 16x16 switch matrix via SPI

Berichtdoor MrHaroldA » 14 Jul 2016, 10:00

shooter schreef:allereerst is de ON resistance max 300 ohm, ofwel daar gaat een ledje maar net op aan.
Verder gaat er als je een ledje aansluit veel te veel stroom lopen, het zijn analoge schakelaars,

https://ez.analog.com/docs/DOC-13484
maximum is 12 mA, echter typical is het maar 1 mA.
en de weerstand aan de uitgang zou dan 10 kohm moeten zijn.

Je gebruikt de array dus eigenlijk niet op de juiste manier.
beter is om dan een uln200x erachter te hangen, dan ben je van de stroom weg.


Daar heb je een heel goed punt. Ik heb ergens nog wel een ULN liggen, eens kijken of ik die nog op het breadboard kwijt kan.

shooter schreef:ik denk dus dat je array wel goed is, maar je meetmethode niet.
zet op de ingangen (nou ja maakt niet uit) eens een weerstand brugje dus ergens 5 V ergens 2 volt of zo
en dan op de uitgangen meten.


Ik zal eerst de ULN installeren en dan kijken of het schakelen wel goed gaat.

shooter schreef:Verder moet de analog spanning hoger zijn dan de digital dus bijv +9 en -9 Volt en natuurlijk 5 V digitaal


Vdd = 12V
Vss = -12V
Vcc = 5V
DGND = GND

5V en +/-12V komen van twee verschillende stroombronnen af, maar de GNDs zijn verbonden.

shooter schreef:en je moet zeker weten dat de SPI klaar is met zenden voor je de Pclock bedient, je geeft namelijk opdracht tot het verzenden van data in de loop, maar afhankelijk van de snelheid van de Sclock duurt het natuurlijk even, (en daar wacht je niet op) dus gewoon wachten tot buffer leeg is en dan pas latchen.


Er zit een delay van 8 microseconde voor het latchen; de datasheet schrijft 65 nanoseconde voor als minimum.


Zouhet branden van het LEDje nu "crosstalk" kunnen zijn? Oftewel: te veel stroom, dus het "slaat over" op andere switches?

Gebruikers-avatar
Berichten: 63
Geregistreerd: 10 Jul 2014, 14:54

Re: AD75019 16x16 switch matrix via SPI

Berichtdoor MrHaroldA » 14 Jul 2016, 10:28

ULN2803 aangesloten, wat schakeltestjes gedaan ... 100% score! :D

... tot nu toe, we kijken het even aan ;)


Maar ENORM BEDANKT!

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: AD75019 16x16 switch matrix via SPI

Berichtdoor nicoverduin » 14 Jul 2016, 11:47

Better late than never....
@harold: met mij gaat ie prima.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: AD75019 16x16 switch matrix via SPI

Berichtdoor shooter » 15 Jul 2016, 17:01

ik bedoelde met tijd, dus niet de array maar de arduino, die moet wel klaar zijn, want als je eerder latched dan dat alle serie verzonden is loopt het allemaal uit de hand.
gelukkig is het dynamisch dus wordt alles gereset als je even wacht.
paul deelen
shooter@home.nl

Berichten: 3
Geregistreerd: 24 Okt 2016, 23:55

Re: AD75019 16x16 switch matrix via SPI

Berichtdoor EBH » 25 Okt 2016, 00:07

Hallo,

is het nog gelukt om de Audio matrix AD78019 feilloos te laten werken met jou software?

ik heb ook een arduino sketch gevonden.
http://www.dorkbotpdx.org/blog/paul/ad75019_crosspoint_analog_switch

deze code connect, maar wil helaas niet per kanaal disconnecten.
wat ik ook doe, ik krijg het niet voor elkaar.

ik wil 1 audio matrix van 16 kanalen aansturen met SPI, die per kanaal aan en uit geschakeld kan worden.

is het mogelijk dat je deze werkende code wilt delen ?

bijvoorbaat dank
edwin

Gebruikers-avatar
Berichten: 63
Geregistreerd: 10 Jul 2014, 14:54

Re: AD75019 16x16 switch matrix via SPI

Berichtdoor MrHaroldA » 25 Okt 2016, 12:15

EBH schreef:is het mogelijk dat je deze werkende code wilt delen ?


Dit is mijn 256 bits shifter:

Code: Alles selecteren
/**
 * Shift out 256 bits of data using SPI.
 */
void shiftPatch(bool mute) {
    int16_t patchMatrix[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

    constructPatchMatrix(patchMatrix, mute);

    // Set up the speed, data order and data mode.
    SPI.beginTransaction(SPISettings(SPI_SPEED, MSBFIRST, SPI_MODE0));
    for (int16_t y = 15; y >= 0; y--) {
        SPI.transfer16(patchMatrix[y]);
    }
    SPI.endTransaction();

    // Pulse MATRIX_LATCH_PIN/SS to parallel latches. See datasheet t5 and t6.
    delayMicroseconds(8);
    digitalWrite(MATRIX_LATCH_PIN, LOW);
    delayMicroseconds(8);
    digitalWrite(MATRIX_LATCH_PIN, HIGH);

    #ifdef DEBUG
        printMatrix(patchMatrix);
    #endif
}


constructPatchMatrix() vult aan de hand van een string van loops (bv: "1623ae") patchMatrix met bitjes, maar die kun je om te testen ook even met de hand zetten.

Als je hier niets aan hebt moet je even jouw code delen, misschien dat ik kan zien waar je de fout in gaat ...

Volgende

Terug naar Overige hardware

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 7 gasten