본문 바로가기

프로그래밍/프로그래밍_여러가지

아두이노 - PE43712 Attenuator SPI 통신

반응형

 

PE43712 Attenuator SPI 통신

 

Peregrine Semiconductor 라는 회사의 PE43712 Attenuator 를 컨트롤 해보자.

PE43712는 RF 신호를 원하는 dB 만큼 줄여주는 감쇠기이다.

감쇠 범위는 0 ~ 31.75 dB 이다.

PE43712의 통신 방식은 두가지 이다. 병렬(Parallel)과 직렬(Serial).

이 두가지 중 직렬(Serial) 방식 통신을 하려고 한다.

직렬 방식 통신은 SPI 통신이다.

 

아래는 PE43712와 ATmega328P-AU 회로도이다.

PE43712에 필요한 SPI통신 신호선은

-칩 선택신호

-SCK 클럭신호

-MOSI 데이타 신호

이렇게 세가지이다. MCU로 입력되는 MISO는 필요없기 때문에 사용하지 않는다.

 

PE43712의 SPI 통신 타이밍도를 보자.

LE가 칩선택 신호이고

CLK가 SCK,

SI가 MOSI 신호이다.

 

먼저 MCU에서 LE 칩선택 신호를 LOW로 보내주고,

그 다음 클럭과 16bit 데이타를 보내면 PE43712가 클럭에 맞춰서 데이타를 읽어들인다.

마지막으로 LE 칩선택 신호를 HIGH로 보내주면 끝.

 

보내야 할 데이타의 형식을 알아보자.

 

1. 데이타는 8bit(주소) + 8bit(데이타), 전부 16bit이고 16bit를 연속으로 보내면 된다.

2. 데이타의 MSB와 LSB 중에 LSB를 먼저 보내야 한다.

3. 처음 보내야 하는 8bit 데이타는 Attenuation 값이다. 간단한 계산을 하고 전송해야 한다.

   : 실제 보내는 데이타 = 원하는 Atten 값 x 4

   : 원하는 Atten 값은 0.25 단위이다. 4를 곱했을 때 소숫점 아래 수가 없어야 한다.

   : D7 bit는 반드시 0이어야 한다.

4. 이어서 보내는 두번째 8bit는 주소값이다.

   : A8~A3 은 0이든 1이든 상관없다.

   : A2~A0 는 회로적으로 정해진 주소값이랑 같아야 한다.

 

 

아두이노 코드를 보자.

// ATMEGA328P-AU 사용
// Bootloader : Arduino Pro Mini -> 3.3v, 8Mhz 부트로더 사용해야함
// 회로도핀 : 회로네트네임 : 부품핀네임 : 아두이노IDE핀
//    13    :   SPI_nSS_1  :     PB1    :     9
//    14    :   SPI_nSS_2  :     PB2    :     10
//    15    :   SPI_MOSI   :     PB3    :     11 
//    17    :   SPI_SCK    :     PB5    :     13

#include <SPI.h>

#define SPI_nSS_1  9    // PE43712 #1 Select pin
unsigned int convert_data;  // PE43712에 입력 위한 Atten 계산 결과값 변수

void setPE43712_1(float Atten_value){  // PE43712 #1 에 입력 위한 Atten 계산 함수
  convert_data = Atten_value * 4;  // PE43712 데이타시트의 계산방법
  digitalWrite(SPI_nSS_1, LOW);  // Chip #1 선택
  SPI.transfer(convert_data);   // Attenuation Word
  SPI.transfer(0b11111110);   // Address Word: A7~A3=don't care, A2=1, A1=1, A0=0
  digitalWrite(SPI_nSS_1, HIGH);  // Chip #1 선택해제
}

void setup() {
  pinMode(SPI_nSS_1, OUTPUT);
  digitalWrite(SPI_nSS_1, HIGH);
  SPI.beginTransaction(SPISettings(100000, LSBFIRST, SPI_MODE0)); // 1MHz, PE43712 use LSBFIRST in
  SPI.begin();
  delay(1000);
}

void loop() {
  setPE43712_1(0);  // PE43712 #1 attenuation 값 입력(0 ~ 31.75), 소수점은 x.25 단위.
  delay(2000);
  setPE43712_1(5);  // PE43712 #1 attenuation 값 입력(0 ~ 31.75), 소수점은 x.25 단위.
  delay(2000);
}

위 코드는 2초 단위로 Atten값을 0과 5로 반복해서 바꾸어 주는 코드이다.

SPI.beginTransaction() 함수 안에서 LSBFIRST를 설정해 주었다.

setPE43712_1() 함수 안에서 원하는 Atten값을 x4 해주었고

Address 값은 회로도와 같은 A2=1, A1=1, A0=0 를 보내주도록 되어 있다.

 

스펙트럼분석기로 측정한 결과 화면을 보자고 하고 싶지만,,

그림으로 대신한다. 아마도 대략 그림과 같이 5dBm 차이로 2초마다 바뀔 것이다.

 

 

 

 

반응형