Några frågor om MCP3008 ADC
Några frågor om MCP3008 ADC
Hej. King Bundy här.
Jag har en ADC MCP3008 som jag tänker skriva eget bibliotek på. Men jag kan inte direkt förstå hur jag ska börja.
På MCP'N finns det Din, Dout, CS och SCK. Och sedan finns det Vref och VCC samt GND.
Alla GND kopplar jag ihop.
VCC kopplar jag ihop med Vref och övrig VCC på mikrokontrollern.
Din til MOSI.
Dout till MISO.
SCK till SCK
Och CS till valfri digital pinne.
När CS är låg så börjar SCK ticka på. Men vad ska jag göra då? Jag har läst databladet men jag förstod inte.
Det jag vill göra är att jag vill läsa av ett heltalsvärde t.ex 59 eller 43 från kanalerna CH. Jag ska läsa av temperatur.
Så om jag vill läsa av kanal CH1 så måste jag prata med min MCP3008 att jag vill läsa av kanal CH1? Sedan måste jag ta emot dessa ettor och nollor ifrån Dout.
Då har jag några frågor:
1. När jag sätter CS som 0 volt så börjar SCK ticka på. Hur långe ska den ticka? Ska jag låta den ticka 8 gånger?
2. Vilka pulser ska jag skicka till Din om jag vill läsa av CH3?
3. När ska jag vara beredd på att ta emot ettor och nollor ifrån Dout?
4. Behöver jag ett oscilloskop till detta?
Jag har en ADC MCP3008 som jag tänker skriva eget bibliotek på. Men jag kan inte direkt förstå hur jag ska börja.
På MCP'N finns det Din, Dout, CS och SCK. Och sedan finns det Vref och VCC samt GND.
Alla GND kopplar jag ihop.
VCC kopplar jag ihop med Vref och övrig VCC på mikrokontrollern.
Din til MOSI.
Dout till MISO.
SCK till SCK
Och CS till valfri digital pinne.
När CS är låg så börjar SCK ticka på. Men vad ska jag göra då? Jag har läst databladet men jag förstod inte.
Det jag vill göra är att jag vill läsa av ett heltalsvärde t.ex 59 eller 43 från kanalerna CH. Jag ska läsa av temperatur.
Så om jag vill läsa av kanal CH1 så måste jag prata med min MCP3008 att jag vill läsa av kanal CH1? Sedan måste jag ta emot dessa ettor och nollor ifrån Dout.
Då har jag några frågor:
1. När jag sätter CS som 0 volt så börjar SCK ticka på. Hur långe ska den ticka? Ska jag låta den ticka 8 gånger?
2. Vilka pulser ska jag skicka till Din om jag vill läsa av CH3?
3. När ska jag vara beredd på att ta emot ettor och nollor ifrån Dout?
4. Behöver jag ett oscilloskop till detta?
- Synesthesia
- Inlägg: 663
- Blev medlem: 22 januari 2010, 19:14:10
- Ort: Mellan Göteborg och Kungsbacka
Re: Några frågor om MCP3008 ADC
1. Du måste ju ha så många clock så du kan läsa av hela värdet, som det ser ut i databladet minst 17 "clock". Se FIGURE 5-1, sidan 20 i databladet.
2. Tabell "TABLE 5-2" på sidan 19 säger "1011" för CH3. Enligt "FIGURE 5-1" bryr den sig bara om startbit + de 4 första bitarna -> skicka 0x1b och 2 byte till (2 byte som kan vara vad som helst, t.ex 0).
3. Efter du fått första höga pulsen på Dout efter CS gick låg, se "FIGURE 5-1". Som i sin tur verkar komma 6 "clock" efter CS gick låg (eller egentligen efter du skickar första biten data till MCP3008, till "Din").
4. Det går bra utan oscilloskop om allt fungerar och du ser att du kan läsa av det som kommer från SPI-interfacet, om du behöver leta fel kan ett oscilloskop underlätta.
Datablad: http://ww1.microchip.com/downloads/en/D ... 21295d.pdf (om vi inte skulle ha samma version)
2. Tabell "TABLE 5-2" på sidan 19 säger "1011" för CH3. Enligt "FIGURE 5-1" bryr den sig bara om startbit + de 4 första bitarna -> skicka 0x1b och 2 byte till (2 byte som kan vara vad som helst, t.ex 0).
3. Efter du fått första höga pulsen på Dout efter CS gick låg, se "FIGURE 5-1". Som i sin tur verkar komma 6 "clock" efter CS gick låg (eller egentligen efter du skickar första biten data till MCP3008, till "Din").
4. Det går bra utan oscilloskop om allt fungerar och du ser att du kan läsa av det som kommer från SPI-interfacet, om du behöver leta fel kan ett oscilloskop underlätta.
Datablad: http://ww1.microchip.com/downloads/en/D ... 21295d.pdf (om vi inte skulle ha samma version)
Re: Några frågor om MCP3008 ADC
Tja:
Vilket utvecklingssystem har du tänkt att använda?
Vilket språk har du tänkt använda?
Vilken processor har du tänkt använda?
Nej du behöver inget oscilloskop för att skriva koden, däremot kan en logik analysator vara bra för att hitta felen du gör.
Som en liten hint, de flesta utvecklingssystem har befintlig kod för just SPI-kommunikation, så det finns ingen anledning att hitta på nya saker.
Vilket utvecklingssystem har du tänkt att använda?
Vilket språk har du tänkt använda?
Vilken processor har du tänkt använda?
Nej du behöver inget oscilloskop för att skriva koden, däremot kan en logik analysator vara bra för att hitta felen du gör.
Som en liten hint, de flesta utvecklingssystem har befintlig kod för just SPI-kommunikation, så det finns ingen anledning att hitta på nya saker.
Re: Några frågor om MCP3008 ADC
Mitt utvecklingssystem är Codesys.TomasL skrev:Tja:
Vilket utvecklingssystem har du tänkt att använda?
Vilket språk har du tänkt använda?
Vilken processor har du tänkt använda?
Nej du behöver inget oscilloskop för att skriva koden, däremot kan en logik analysator vara bra för att hitta felen du gör.
Som en liten hint, de flesta utvecklingssystem har befintlig kod för just SPI-kommunikation, så det finns ingen anledning att hitta på nya saker.
Språket är PLC.
Enheten är Raspberry PI B+.
Jag tänkte just hitta på hjulet på nytt för att lära mig SPI.
Codesys har färdigt SPI att använda.
Re: Några frågor om MCP3008 ADC
PLC är naturligtvis inget språk.
Du får läsa CodeSys manual hur man gör.
Men generellt, man sätter upp hårdvaran för SPI, initierar Mottagning/Sändning och Skickar/Tar emot så många bitar man vill
Du får läsa CodeSys manual hur man gör.
Men generellt, man sätter upp hårdvaran för SPI, initierar Mottagning/Sändning och Skickar/Tar emot så många bitar man vill
Re: Några frågor om MCP3008 ADC
Att använda codesys har jag inget problem med. Det är snarare när och hur mycket jag ska prata med 3008 över SPI.TomasL skrev:PLC är naturligtvis inget språk.
Du får läsa CodeSys manual hur man gör.
Men generellt, man sätter upp hårdvaran för SPI, initierar Mottagning/Sändning och Skickar/Tar emot så många bitar man vill
Jag vet exempelvis inte hur många iterationer som SCK ska göra. Jag vet inte heller hur många iterationer som jag ska skicka från MOSI till Din om jag vill läsa utav Ch7 . Jag vet inte när jag ska läsa från Dout till MISO.
- Synesthesia
- Inlägg: 663
- Blev medlem: 22 januari 2010, 19:14:10
- Ort: Mellan Göteborg och Kungsbacka
Re: Några frågor om MCP3008 ADC
1. Du måste ju ha så många clock så du kan läsa av hela värdet, som det ser ut i databladet minst 17 "clock". Se FIGURE 5-1, sidan 20 i databladet.
3 byte på SPI borde räcka, ger 24 SCK-klockpulser.
Skicka 0x1b, 0x0, 0x0 till ADC'n för CH3, SPI-interfacet svarar samtidigt som du skickar.
3 byte på SPI borde räcka, ger 24 SCK-klockpulser.
Skicka 0x1b, 0x0, 0x0 till ADC'n för CH3, SPI-interfacet svarar samtidigt som du skickar.
Re: Några frågor om MCP3008 ADC
Okej. Jag har alltså kollat på figur 1-1 hela tiden.
Men figur 5-1 tolkar jag som att när CS går från hög till låg så börjar CLK ticka på med en minimumpulsintervall på tsucs = 100 ns.
Efter CLK har pulserat en hög puls och går till låg så skickar jag 1001 ifrån MOSI till Din.
Därefter när CLK har pulserat 6 höga pulser så börjar jag läsa av ifrån Dout till MISO. Då kommer jag få ett 10-bit värde, vilket är ett värde mellan 0 till 1023. Sant eller falska värden. Första värdet kommer vara 0, vilket blir 11 bitar, men första nollan räknas ju inte när man får ett decimaltal. t.ex. 001 och 000001 ger samma tal.
Efter 17 höga pulser så gör jag så CS blir hög igen.
Har jag rätt?
Vad är neutralläga för Din och Dout? Dout måste väll vara hög hela tiden då Null Bit ger en nolla när Dout börjar prata.
Din måste väll låg tills SGL/DIFF och D2, D1, D0 börjar transporteras ifrån MOSI till Din?
Men figur 5-1 tolkar jag som att när CS går från hög till låg så börjar CLK ticka på med en minimumpulsintervall på tsucs = 100 ns.
Efter CLK har pulserat en hög puls och går till låg så skickar jag 1001 ifrån MOSI till Din.
Därefter när CLK har pulserat 6 höga pulser så börjar jag läsa av ifrån Dout till MISO. Då kommer jag få ett 10-bit värde, vilket är ett värde mellan 0 till 1023. Sant eller falska värden. Första värdet kommer vara 0, vilket blir 11 bitar, men första nollan räknas ju inte när man får ett decimaltal. t.ex. 001 och 000001 ger samma tal.
Efter 17 höga pulser så gör jag så CS blir hög igen.
Har jag rätt?
Vad är neutralläga för Din och Dout? Dout måste väll vara hög hela tiden då Null Bit ger en nolla när Dout börjar prata.
Din måste väll låg tills SGL/DIFF och D2, D1, D0 börjar transporteras ifrån MOSI till Din?
- Synesthesia
- Inlägg: 663
- Blev medlem: 22 januari 2010, 19:14:10
- Ort: Mellan Göteborg och Kungsbacka
Re: Några frågor om MCP3008 ADC
Figur 1-1 visar bara timingen, inte vad du skall skicka eller tar emot. Tsucs visar inte hastigheten på klockpulserna, bara tiden från att CS gick låg till första CLK gick hög. Sätt CS låg, vänta tills det blivit 100µS om det behövs, starta sedan CLK. Det är Thi och Tlo som tillsammans visar hastigheten på CLK.
MOSI till Din: du måste först skicka startbit = "1" innan du skickar annan data till ADC'n så skall du skicka 1001 så blir det att skicka 11001. Och eftersom man skickar 8 bitar i taget (och mest signifikant först) så blir det att skicka 11001000 (som blir CH1 enligt datablad). Varje gång du skickar något till SPI som gör den 8 klockpulser i taget. Och varje gång du skickar något med SPI så tar den samtidigt emot data. Sedan får du data från ADC'n efter 6 klockpulser som du skrev. CS sätter du själv hög igen när du är klar, inte nödvändigtvis efter 17 pulser, bara minst 17 pulser, eftersom man skickar 8 bitar i taget borde det vara lagom att sätta CS hög efter 24 bitar.
Det finns ingen säker nivå för "neutralläge". För Dout kan du räkna med att "HI-Z" kan vara vad som helst, du måste maska bort de bitarna. För Din där det står "dont care" betyder det att ADC'n struntar i vad du skickar just där.
MOSI till Din: du måste först skicka startbit = "1" innan du skickar annan data till ADC'n så skall du skicka 1001 så blir det att skicka 11001. Och eftersom man skickar 8 bitar i taget (och mest signifikant först) så blir det att skicka 11001000 (som blir CH1 enligt datablad). Varje gång du skickar något till SPI som gör den 8 klockpulser i taget. Och varje gång du skickar något med SPI så tar den samtidigt emot data. Sedan får du data från ADC'n efter 6 klockpulser som du skrev. CS sätter du själv hög igen när du är klar, inte nödvändigtvis efter 17 pulser, bara minst 17 pulser, eftersom man skickar 8 bitar i taget borde det vara lagom att sätta CS hög efter 24 bitar.
Det finns ingen säker nivå för "neutralläge". För Dout kan du räkna med att "HI-Z" kan vara vad som helst, du måste maska bort de bitarna. För Din där det står "dont care" betyder det att ADC'n struntar i vad du skickar just där.
Re: Några frågor om MCP3008 ADC
Okej. Jag förstår att jag måste först ha MOSI som låg innan jag skickar startbit på 1. Där efter så skickar jag SGL/DIFF som är 1 (i detta fall syftar jag på CH1). Sedan när jag MOSI får låg signal så är det D2. Men hur blir det då efter D1 om D1 ska också vara låg? Hur vet min ADC att jag skickar två 11 eller två 00 efter varandra? Hur vet jag att jag får 00 eller 000 ? Är det min SPI clocka som säger åt mig att nu är det en ny position och läs av NU! ?
Vadå skickar 8 bitar i taget? Jag skickar ju 11001 för att välja CH1 och 11001 är 5 bitar.
Vad menar du med 8 clockpulser i taget? Så fort jag skickar något till min SPI så dröjer det 6 clockpulser ifrån CS = 0 tills jag får första låga bit ifrån MISO.
Vadå skickar 8 bitar i taget? Jag skickar ju 11001 för att välja CH1 och 11001 är 5 bitar.
Vad menar du med 8 clockpulser i taget? Så fort jag skickar något till min SPI så dröjer det 6 clockpulser ifrån CS = 0 tills jag får första låga bit ifrån MISO.
- SeniorLemuren
- Inlägg: 8407
- Blev medlem: 26 maj 2009, 12:20:37
- Ort: Kristinehamn
- Synesthesia
- Inlägg: 663
- Blev medlem: 22 januari 2010, 19:14:10
- Ort: Mellan Göteborg och Kungsbacka
Re: Några frågor om MCP3008 ADC
Varje gång MOSI/Din är låg och kör en klockcykel läser ADC'n in "0", och varje MOSI/Din är hög och kör en klockcykel läser ADC'n in "1".
Det är samma sak när du läser från ADC'n, den skickar också ut data samtidigt som man kör en klockcykel, om den har något att skicka: är MISO/Dout låg efter en klockcykel har ADC'n skickat "0", är MISO/Dout hög efter en klockcykel har ADC'n skickat "1".
Så för att skicka "11001" till ADC'n blir det så här:
Sätt MOSI/Din hög
sätt klock låg
sätt klock hög
låt MOSI/Din vara hög (igen)
sätt klock låg
sätt klock hög
Sätt MOSI/Din låg
sätt klock låg
sätt klock hög
låt MOSI/Din vara låg (igen)
sätt klock låg
sätt klock hög
Sätt MOSI/Din hög
sätt klock låg
sätt klock hög
sedan fortsätter man att läsa det från ADC'n
(samma som visas i figur 5-1 i databladet)
Jag trodde du skulle använda SPI-interface eftersom du skrev "Codesys har färdigt SPI att använda." och ett SPI-interface brukar skicka och ta emot 8 bitar i taget.
Det är samma sak när du läser från ADC'n, den skickar också ut data samtidigt som man kör en klockcykel, om den har något att skicka: är MISO/Dout låg efter en klockcykel har ADC'n skickat "0", är MISO/Dout hög efter en klockcykel har ADC'n skickat "1".
Så för att skicka "11001" till ADC'n blir det så här:
Sätt MOSI/Din hög
sätt klock låg
sätt klock hög
låt MOSI/Din vara hög (igen)
sätt klock låg
sätt klock hög
Sätt MOSI/Din låg
sätt klock låg
sätt klock hög
låt MOSI/Din vara låg (igen)
sätt klock låg
sätt klock hög
Sätt MOSI/Din hög
sätt klock låg
sätt klock hög
sedan fortsätter man att läsa det från ADC'n
(samma som visas i figur 5-1 i databladet)
Jag trodde du skulle använda SPI-interface eftersom du skrev "Codesys har färdigt SPI att använda." och ett SPI-interface brukar skicka och ta emot 8 bitar i taget.
Re: Några frågor om MCP3008 ADC
Mycket bra förklarat. Jag ska genast labba lite med min ADC. Då följer jag bara cyklarna ifrån SCK för att avgöra om det har kommit en extra nolla efter föregående nolla
eller etta.
Jo. Codesys har inbyggt SPI men jag ville lära mig hur SPI fungerar. Tackar.
Självklar så ska jag använda MOSI, SCK, och MISO från min Raspberry när dem finns där.
Kan jag använda MOSI, SCK och MISO för att manuellt sätta dessa som höga och låga vid andra tillfällen? Typ som att dessa skulle fungera som vanliga digitala.
Hos ATMEGA gör det så. Men nu kör jag ARM.

Jo. Codesys har inbyggt SPI men jag ville lära mig hur SPI fungerar. Tackar.
Självklar så ska jag använda MOSI, SCK, och MISO från min Raspberry när dem finns där.
Kan jag använda MOSI, SCK och MISO för att manuellt sätta dessa som höga och låga vid andra tillfällen? Typ som att dessa skulle fungera som vanliga digitala.
Hos ATMEGA gör det så. Men nu kör jag ARM.
- Synesthesia
- Inlägg: 663
- Blev medlem: 22 januari 2010, 19:14:10
- Ort: Mellan Göteborg och Kungsbacka
Re: Några frågor om MCP3008 ADC
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 var för sig som du vill.
Senast redigerad av Synesthesia 5 juni 2016, 19:28:31, redigerad totalt 1 gång.