ESP32 및 MCP3008에서 SPI 학습
여기에 연결하는 장치로서 10 bit x 8 채널의 AD 컨버터 MCP3008 이 수중에 있었으므로 그것을 사용했습니다.
환경
연결
신호명
MCP3008 PIN
MCP3008 신호명
케이블
ESP32 GPIO
ESP32 신호명
VDD
16
VDD
오렌지
3V3
3V3
15
VREF
VDD
14
AGND
DGND에 연결
SCK
13
CLK
황색
IO18
VSPCLK
미소
12
DOUT
보라색
IO19
VSPIQ
MOSI
11
DIN
재
IO23
VSPID
CS
10
CS/SHDN
녹색
IO5
VSPICS0
GND
9
DGND
블랙
GND
GND
MCP3008에는 아날로그 입력 포트가 CH0 ~ CH7인 8채널이 있습니다. 각각 10비트의 분해능으로 AD 변환을 실시해, SPI로 마이크로컴퓨터 등에 캡처할 수 있습니다. 테스트를 위해 CH0에 1kΩ의 저항을 붙여 VDD에 연결해 보았습니다.
MCP3008의 SPI 설정
데이터 시트에서 전송에 필요한 설정을 읽어보십시오.
데이터 시트에서 전송에 필요한 설정을 읽어보십시오.
시작 비트로 1비트 전송하지만 SPI 라이브러리는 8비트 단위로 전송합니다. 그러기 전에 7비트의 0을 넣어 전송합니다.
다음 8비트에서는 다음과 같이 데이터가 송수신됩니다.
bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
SGL/DIFF
D2
D1
D0
?
0
B9
B8
여기서 bit7 ~ bit4는 MCP3008에 대한 입력입니다. SGL/DIFF는 단일 종단 입력과 작동 입력의 비트입니다. 1이면 싱글 엔드, 0이면 작동 입력입니다.
이번에는 싱글 엔드 입력을 사용합니다. 이 경우 D2/D1/D0은 채널 지정, CH0이면 D2=0, D1=0, D0=0. CH1이라면 D2=0, D1=0, D0=1.
bit2 ~ bit0은 MCP3008의 출력입니다. bit2는 항상 0, B9 및 B8에서 10bit의 AD 변환 값 중 상위 2 비트입니다.
또한 다음 8 비트에서 다음과 같이 MCP3008에서 계속되는 B7 ~ B0의 나머지 8 비트가 출력됩니다.
bit7
bit6
bit5
bit4
bit3
bit2
bit1
bit0
B7
B6
B5
B4
B3
B2
B1
B0
이 전송이 끝나도 CS 신호가 Low 만났을 경우에는, 다음의 7bit가 MSBFIRST 전송으로서 행해집니다.
B1
B2
B3
B4
B5
B6
B7
SPI 전송 모드
모드
CPOL (클럭 극성)
CPHA (클럭 위상)
0
0
0
1
0
1
2
1
0
3
1
1
클록 극성은 0 : 아이들 Lo 펄스 High 1 : 아이들 High 펄스 Lo
클럭 위상은 0 : 펄스 팁에서 전송 1 : 펄스 후단에서 전송
따라서 MCP3008은 SPI의 모드 0 또는 모드 3을 사용합니다.
ESP32의 SPI 설정
ESP32 는 VSPI, HSPI 의 2 개의 SPI 채널이 있습니다만, SPI 라이브러리라면 VSPI 쪽이 사용된다고 합니다.
게다가 SPI의 포트 할당은 변경 가능한 것 같습니다만, 이번은 디폴트의 설정을 사용하고 있습니다.
속도는 SPISettings 매개 변수로 설정합니다. 이번에는 1000000으로 설정하여 최대 1MHz로 구동하게 됩니다.
코드
#include <SPI.h>
#define SS 5
float Vref = 3.3 ;
SPISettings settings(1000000,MSBFIRST,SPI_MODE1);
void setup() {
pinMode(SS, OUTPUT);
Serial.begin(115200);
SPI.begin();
}
void loop(){
byte single = 1 << 7; // Single...1 /Diff...0
byte channel = 0;
byte buffer1 = single | ( channel << 4 ) ;
byte buffer2 = 0 ;
float volt;
unsigned int getdata;
SPI.beginTransaction(settings);
digitalWrite(SS, LOW);
SPI.transfer( 0b00000001); // Start bit
buffer1 = SPI.transfer(buffer1); // CH0 singleEnd
buffer2 = SPI.transfer(buffer2);
digitalWrite(SS, HIGH);
SPI.endTransaction();
getdata = ((buffer1 & 0x03) *256) + buffer2;
volt = getdata*Vref /1024;
Serial.print( getdata );
Serial.println( ": " +String(volt,3) + "V");
delay(1000);
delay(1000);
}
실행 결과
1023: 3.297V
1023: 3.297V
1023: 3.297V
7: 0.023V
23: 0.074V
0: 0.000V
0: 0.000V
0: 0.000V
154: 0.496V
1023: 3.297V
1023: 3.297V
1023: 3.297V
1023: 3.297V
1023: 3.297V
1023: 3.297V
・
・
・
CH0에 접속한 저항을 VDD에서 GND로 다시 연결하고 다시 VDD에 접속했을 때의 값입니다.
Reference
이 문제에 관하여(ESP32 및 MCP3008에서 SPI 학습), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/nanbuwks/items/9a9169a2afbad95ae7ca
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
ESP32 는 VSPI, HSPI 의 2 개의 SPI 채널이 있습니다만, SPI 라이브러리라면 VSPI 쪽이 사용된다고 합니다.
게다가 SPI의 포트 할당은 변경 가능한 것 같습니다만, 이번은 디폴트의 설정을 사용하고 있습니다.
속도는 SPISettings 매개 변수로 설정합니다. 이번에는 1000000으로 설정하여 최대 1MHz로 구동하게 됩니다.
코드
#include <SPI.h>
#define SS 5
float Vref = 3.3 ;
SPISettings settings(1000000,MSBFIRST,SPI_MODE1);
void setup() {
pinMode(SS, OUTPUT);
Serial.begin(115200);
SPI.begin();
}
void loop(){
byte single = 1 << 7; // Single...1 /Diff...0
byte channel = 0;
byte buffer1 = single | ( channel << 4 ) ;
byte buffer2 = 0 ;
float volt;
unsigned int getdata;
SPI.beginTransaction(settings);
digitalWrite(SS, LOW);
SPI.transfer( 0b00000001); // Start bit
buffer1 = SPI.transfer(buffer1); // CH0 singleEnd
buffer2 = SPI.transfer(buffer2);
digitalWrite(SS, HIGH);
SPI.endTransaction();
getdata = ((buffer1 & 0x03) *256) + buffer2;
volt = getdata*Vref /1024;
Serial.print( getdata );
Serial.println( ": " +String(volt,3) + "V");
delay(1000);
delay(1000);
}
실행 결과
1023: 3.297V
1023: 3.297V
1023: 3.297V
7: 0.023V
23: 0.074V
0: 0.000V
0: 0.000V
0: 0.000V
154: 0.496V
1023: 3.297V
1023: 3.297V
1023: 3.297V
1023: 3.297V
1023: 3.297V
1023: 3.297V
・
・
・
CH0에 접속한 저항을 VDD에서 GND로 다시 연결하고 다시 VDD에 접속했을 때의 값입니다.
Reference
이 문제에 관하여(ESP32 및 MCP3008에서 SPI 학습), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/nanbuwks/items/9a9169a2afbad95ae7ca
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#include <SPI.h>
#define SS 5
float Vref = 3.3 ;
SPISettings settings(1000000,MSBFIRST,SPI_MODE1);
void setup() {
pinMode(SS, OUTPUT);
Serial.begin(115200);
SPI.begin();
}
void loop(){
byte single = 1 << 7; // Single...1 /Diff...0
byte channel = 0;
byte buffer1 = single | ( channel << 4 ) ;
byte buffer2 = 0 ;
float volt;
unsigned int getdata;
SPI.beginTransaction(settings);
digitalWrite(SS, LOW);
SPI.transfer( 0b00000001); // Start bit
buffer1 = SPI.transfer(buffer1); // CH0 singleEnd
buffer2 = SPI.transfer(buffer2);
digitalWrite(SS, HIGH);
SPI.endTransaction();
getdata = ((buffer1 & 0x03) *256) + buffer2;
volt = getdata*Vref /1024;
Serial.print( getdata );
Serial.println( ": " +String(volt,3) + "V");
delay(1000);
delay(1000);
}
1023: 3.297V
1023: 3.297V
1023: 3.297V
7: 0.023V
23: 0.074V
0: 0.000V
0: 0.000V
0: 0.000V
154: 0.496V
1023: 3.297V
1023: 3.297V
1023: 3.297V
1023: 3.297V
1023: 3.297V
1023: 3.297V
・
・
・
CH0에 접속한 저항을 VDD에서 GND로 다시 연결하고 다시 VDD에 접속했을 때의 값입니다.
Reference
이 문제에 관하여(ESP32 및 MCP3008에서 SPI 학습), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nanbuwks/items/9a9169a2afbad95ae7ca텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)