Några frågor om MCP3008 ADC

Övriga diskussioner relaterade till komponenter. Exempelvis radiorör, A/D, kontaktdon eller sensorer.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

Synesthesia skrev:Ja du kan sätta MOSI, SCK, och MISO som portpinnar (GPIO09..GPIO11) istället för att använda SPI-interfacet och sätta dom höga/låga varför sig som du vill.
Jag testar först tolka dessa som vanliga digitala. Sedan testar jag med SPI interface
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

Nu har jag lite problem med min kod - tror jag.
Jag får bara 0 på variabeln temperatur, oavsett om jag kopplar CH0 till VCC eller CH1 till GND. Det är som att den inte känner utav. Som jag inte får något svar.

Här är mina filer. Jag kallar dem .plc i filformat här. Det är relativ enkelt kod att fälja. temperatur.plc har en variabel som ska antingen bli 0 eller 1023 beroende på hur jag kopplar kanal CH1 till VCC eller GND. I temperatur.plc finns det en funktion som heter SPI. Denna funktion anropas med argumentet input := FALSE;

I SPI.plc så testas om variabeln input är FALSE i en IF-sats. Om det är så så följ koden. Börja räkna koden igenom en while-sats och kolla om CLK är FALSE eller TRUE. Om CLK går ifrån FALSE till TRUE så ska COUNT adderas med 1, men om CLK går ifrån FALSE -> FALSE eller TRUE -> TRUE så händer det inget med COUNT.

För varje COUNT så betyder det att CLK har just blivit låg och då ska en ny bit skickas eller tas emot.

Efter en array vid namn tempBit som innehåller 11 stycken booleanska värden så skickas den till ASCII.plc där en enkel FOR-loop konverterar 10101011010101 till ett decimaltal.

Här är min koppling.

Kod: Markera allt

VDD   3.3V
VREF  3.3V
AGND  GROUND
CLK   GPIO26 - input
DOUT  GPIO19  (MISO) - input
DIN   GPIO13  (MOSI) - output
CS    GPIO17 - output
DGND  GROUND
temperatur.plc

Kod: Markera allt

PROGRAM Temperatur
VAR
	// Temperaturvariabel
	temperatur: REAL; 
	input: BOOL;
	
END_VAR

// Kalla på temperatursensorn hos CH0 på MCP3008.

input := FALSE;
temperatur :=  SPI(input);

SPI.plc

Kod: Markera allt

FUNCTION SPI : INT
VAR_INPUT
	input: BOOL;
END_VAR
VAR
	temperature: REAL;
	// counter
	COUNT: INT;
	// Array
	tempBit: ARRAY [0..11] OF BOOL;
	// Flagga
	FLAG: BOOL;
END_VAR

// OM CS är FALSE så börjar CLK ticka. 

IF input = FALSE THEN
	// Börja räkna CLK till 17
	// Sätt en räknare och en flagga
	COUNT := 0;
	FLAG := TRUE;
	
	// Gör så CS är FALSE.
	GVL.CS := input;
	
	WHILE COUNT <= 17 DO
		IF GVL.CLK = FALSE THEN
			// Om CLK är FALSE
			FLAG := TRUE; // Lås upp. 
			
			IF COUNT = 0 THEN
				// Skicka startbit 
				GVL.MOSI := TRUE;
			ELSIF COUNT = 1 THEN
				// Skicka SGL/DIFF bit
				GVL.MOSI := TRUE;
			ELSIF COUNT = 2 THEN
				// Skicka D2
				GVL.MOSI := FALSE;
			ELSIF COUNT = 3 THEN
				// Skicka D1
				GVL.MOSI := FALSE;
			ELSIF COUNT = 4 THEN
				// Skicka D0
				GVL.MOSI := FALSE;
			
			// COUNT 5 är bara ett mellanrum 	
				
			ELSIF COUNT = 6 THEN
				// Ta emot Null bit
				tempBit[0] := GVL.MISO;
			ELSIF COUNT = 7 THEN
				// Ta emot B9
				tempBit[1] := GVL.MISO;
			ELSIF COUNT = 8 THEN
				// Ta emot B8
				tempBit[2] := GVL.MISO;
			ELSIF COUNT = 9 THEN
				// Ta emot B7
				tempBit[3] := GVL.MISO;
			ELSIF COUNT = 10 THEN
				// Ta emot B6
				tempBit[4] := GVL.MISO;
			ELSIF COUNT = 11 THEN
				// Ta emot B5
				tempBit[5] := GVL.MISO;
			ELSIF COUNT = 12 THEN
				// Ta emot B4
				tempBit[6] := GVL.MISO;
			ELSIF COUNT = 13 THEN
				// Ta emot B3
				tempBit[7] := GVL.MISO;
			ELSIF COUNT = 14 THEN
				// Ta emot B2
				tempBit[8] := GVL.MISO;
			ELSIF COUNT = 15 THEN
				// Ta emot B1
				tempBit[9] := GVL.MISO;
			ELSIF COUNT = 16 THEN
				// Ta emot B0
				tempBit[10] := GVL.MISO;
			ELSIF COUNT = 17 THEN
				// Sätt CS till TRUE - Stäng av
				GVL.CS := TRUE;
			END_IF
		ELSE
			// Om CLK är TRUE
			IF FLAG = TRUE THEN
				COUNT := COUNT + 1; // Räkna
				FLAG := FALSE; // Lås! 
			END_IF
		END_IF
	END_WHILE
	
	// Nu är data mottaget. Räkna ut det nu!
	SPI := ASCII(tempBit);
END_IF

ASCII.plc

Kod: Markera allt

FUNCTION ASCII : INT
VAR_INPUT
	tempBit: ARRAY [0..11] OF BOOL;
END_VAR
VAR
	i: INT; 
	// Summa
	SUM: INT;
	A: INT;
END_VAR

FOR i := 0 TO 11 BY 1 DO
	IF tempBit[i] = TRUE THEN
		A := 1;
	ELSE
		A := 0;
	END_IF
	SUM := SUM + A*POW(2, 11-i);
END_FOR

ASCII := SUM;

Senast redigerad av Al_Bundy 6 juni 2016, 11:48:52, redigerad totalt 3 gånger.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46931
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av TomasL »

Du har troligen missat att SPI kan gå i fyra olika sins emellan mer eller mindre inkompatibla Moder.
https://en.wikipedia.org/wiki/Serial_Pe ... erface_Bus

Det som skiljer dem åt är Klockans polaritet, dvs om den är vilande nolla eller etta samt om data samplas på främre eller bakre flanken.

Du måste alltså fastställa vilken Mode din SPI-krets använder och sedan konfigurera processorn i enlighet med detta (eller om du använder SW-SPI så måste ditt program emulera detta)
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

Och hur gör jag det i Codesys? :shock:
Jag som trodde SPI var enkelt och inga krångligheter.

Det enda jag gör är att jag sätter CS som låg och sedan så kollar jag om CLK är hög eller låg och där efter räknar när CLK går ifrån låg till hög.
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Några frågor om MCP3008 ADC

Inlägg av Icecap »

Och är det AD-omvandlaren som är SPI-master? Och därmed ger klockpulserna...
De gångar jag har använd SPI är det alltid µC'n som är mastern och ger klock-pulserna.

SPI är enkelt, det är du som krånglar.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

Icecap skrev:Och är det AD-omvandlaren som är SPI-master? Och därmed ger klockpulserna...
De gångar jag har använd SPI är det alltid µC'n som är mastern och ger klock-pulserna.

SPI är enkelt, det är du som krånglar.
Vänta lite! Ni menar att det är min paj som ger clockpulser ? Och inte tvärt om?

ADCn är slaven. Och pajen är mastern.

Jo. Jag vet att jag krånglar.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46931
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av TomasL »

Ja pajen är master
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

Men så min paj ska pulsera till ADCn?
Jag trodde att när CS är låg så börjar ADCN pulsera till CLK på mastern.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Några frågor om MCP3008 ADC

Inlägg av Micke_s »

Blockdiagrammet på sidan 1 av MCP3008 så ser man pilen innåt på alla utom data out.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

Jaha. Då är det bara skriva om koden.
Tror ni det går bra om man har 100 ms för varje puls?

Totalt 200 ms för en cykel.
Det står i databladet minst 100 ns, men jag kan inte ha en delay i 100 ns på min plc.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46931
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av TomasL »

SPI kan i princip köras från några få Hz upp till flera MHz, dock får du titta i databladen vilka restriktioner som finns.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Några frågor om MCP3008 ADC

Inlägg av Micke_s »

Har inte codesys färdigt exempel för MCP3008?
http://store.codesys.com/codesys-contro ... re=default

Typ:
'c:\Users\<YourWindowsUserName>\CODESYS Control for Raspberry PI\2.1.1.0\MCP3008Temperature.project'

Har du hittat detta? http://forum.codesys.com/viewtopic.php?f=23&t=6247
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

Micke_s skrev:Har inte codesys färdigt exempel för MCP3008?
http://store.codesys.com/codesys-contro ... re=default

Typ:
'c:\Users\<YourWindowsUserName>\CODESYS Control for Raspberry PI\2.1.1.0\MCP3008Temperature.project'

Har du hittat detta? http://forum.codesys.com/viewtopic.php?f=23&t=6247
Jag har kollat på detta och testat det. Jag har dock inte fått detta fungera för att jag har lagt mer tid på att försöka bygga en SPI ifrån grunden. :)

Jag har skrivit om min kod och nu så ska jag testa den. Återkommer.
Användarvisningsbild
Al_Bundy
Inlägg: 2889
Blev medlem: 11 september 2012, 23:59:50
Ort: The U.S - Chicago
Kontakt:

Re: Några frågor om MCP3008 ADC

Inlägg av Al_Bundy »

TomasL skrev:SPI kan i princip köras från några få Hz upp till flera MHz, dock får du titta i databladen vilka restriktioner som finns.
Kan jag inte köra 100 ms som CLK låg och 100 ms som CLK hög?
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Några frågor om MCP3008 ADC

Inlägg av Icecap »

Det står fortfarande i databladet. Det är ganska säkert angivit minimum och maximum tid/frekvens.
Skriv svar