로그인회원등록 내글장바구니주문조회현재접속자
 상품 검색








 게시판 검색





 
 
회원등록 비번분실


온라인 입금계좌
ㆍ기업은행
ㆍ219-043192-01-028
ㆍ이건영

      거래은행 바로가기
 
 Sensor Applications
아듀이노 응용소스
작성자 avrtools™        
작성일 2018/03/08
첨부#1 i2c_stretch.zip (1KB) (Down:10)
ㆍ추천: 0  ㆍ조회: 110   
  STM32F103C 12비트 정현파 DDS V2
STM32F103C 기판으로 TFT-LCD Scope를 만들다 보니, 검사용 정현파의 품질도 개선이 필요했다.
V1은 12비트 DAC를 사용하지만 8비트 분해능으로 불만이 있었다.


정현파 step을 128에서 256으로 Step noise도 줄이고, 이번 기회에 성능을 올려 속도도 개선했다.
교류 임피던스 측정용 신호인 1KHz 정현파는 주파수 정확도 보다는 파형의 품질이 더 중요하기 때문이다.

 먼저 128 step을 256으로 올리려면 DAC 출력변경 주기를 128KHz에서 256KHz로 올려야 한다.
주파수 오차가 조금 나오지만 진행하기로 했다. 먼저 DAC는 2선식 I2C 버스를 설정해야 한다.
12비트 I2C DAC MCP4752는 STM32 CPU의 PB6과 PB7에 연결해야 한다.

 
외부에서 DAC_device I2C2로 변경해 보았지만, 라이브러리는 구동포트가 클래스2로 변경되지 않는다.
#define DAC_device I2C2  // 사용할 STM32의 CPU 핀은 I2C2 이다. <-- 포기, (PB11, PB10으로 연결안됨) 

#define DAC_device I2C1 // 사용할 STM32의 CPU 핀은 I2C1 이다.
#define DAC_address 0x62 // MCP4725는 I2C 주소가 0x62 이다.
#include "i2c_stretch.h" // 최대한 고속 드라이버로 연결한다

  DAC를 연결하는 I2C 버스의 구동주기는 128KHz에서 256KHZ로 변경해야 한다.
Timer2의 분주기는 9MHz를 35로 나누면 257.143KHz로 256KHz에 가장 근사된 값으로 된다.
257.143KHz의 step으로 DAC의 출력을 256번 변경하면 257.143KHz/256 =1.005KHz가 나온다.
Timer2의 1번째 clock에서 Timer2의 OC값과 일치하면 Timer2 IRQ를 발생시킨다. 
DAC clock을 초기화에서  DAC의 구동 clcok은 Timer2를 사용한다.

void init_DAC_Timer2()
{
  nvic_irq_set_priority(NVIC_TIMER2, 0); //정현파의 품질을 위해 IRQ는 최우선순위로 한다.
  Timer2.setChannel1Mode(TIMER_OUTPUTCOMPARE); //IRQ 발생은 Timer2 OC를 사용한다.
  Timer2.setPrescaleFactor(8); // CPU clock 72MHz를 8로 분주하여 9MHz를 Timer2 분주기로 넣는다.
  Timer2.setOverflow(35);
  Timer2.setCompare1(1); // interrupt position is 1/35 of timer2
  Timer2.attachCompare1Interrupt(timer2_IRQ_Handler);
};

 DAC를 연결하는 I2C 포트를 최대한 빠른 I2C driver를 사용한다.
DAC 초기화 함수는 1.2MHz의 속도로 i2c interface를 연결한다.
DAC의 I2C 클래스는 I2C1 이고 주소는 0x62 이다. (DAC A0=GND)

void start_DDS() // start DAC with 1.2MHz high speed i2c interface
{
  if(i2c_str_IsError(DAC_device) | !i2c_str_PortEnabled(DAC_device))
  {
    i2c_str_InitPort(DAC_device, I2C_STRETCH_DIV_1200KHZ); // I2C Clock =1200KHz
    i2c_str_StartSending(DAC_device, DAC_address);
  }
};

 DDS 발생용 256개의 Lookup Table은 Flash에 저장하여 SRAM을 절약한다.
const PROGMEM uint16_t dac_sine_8Bit[256] =
{
0x800,0x832,0x864,0x896,0x8c8,0x8fa,0x92c,0x95e,0x98f,0x9c0,0x9f1,0xa22,0xa52,0xa82,0xab1,0xae0,
0xb0f,0xb3d,0xb6b,0xb98,0xbc5,0xbf1,0xc1c,0xc47,0xc71,0xc9a,0xcc3,0xceb,0xd12,0xd39,0xd5f,0xd83,
0xda7,0xdca,0xded,0xe0e,0xe2e,0xe4e,0xe6c,0xe8a,0xea6,0xec1,0xedc,0xef5,0xf0d,0xf24,0xf3a,0xf4f,
0xf63,0xf76,0xf87,0xf98,0xfa7,0xfb5,0xfc2,0xfcd,0xfd8,0xfe1,0xfe9,0xff0,0xff5,0xff9,0xffd,0xffe,

0xfff,0xffe,0xffd,0xff9,0xff5,0xff0,0xfe9,0xfe1,0xfd8,0xfcd,0xfc2,0xfb5,0xfa7,0xf98,0xf87,0xf76,
0xf63,0xf4f,0xf3a,0xf24,0xf0d,0xef5,0xedc,0xec1,0xea6,0xe8a,0xe6c,0xe4e,0xe2e,0xe0e,0xded,0xdca,
0xda7,0xd83,0xd5f,0xd39,0xd12,0xceb,0xcc3,0xc9a,0xc71,0xc47,0xc1c,0xbf1,0xbc5,0xb98,0xb6b,0xb3d,
0xb0f,0xae0,0xab1,0xa82,0xa52,0xa22,0x9f1,0x9c0,0x98f,0x95e,0x92c,0x8fa,0x8c8,0x896,0x864,0x832,

0x800,0x7cd,0x79b,0x769,0x737,0x705,0x6d3,0x6a1,0x670,0x63f,0x60e,0x5dd,0x5ad,0x57d,0x54e,0x51f,
0x4f0,0x4c2,0x494,0x467,0x43a,0x40e,0x3e3,0x3b8,0x38e,0x365,0x33c,0x314,0x2ed,0x2c6,0x2a0,0x27c,
0x258,0x235,0x212,0x1f1,0x1d1,0x1b1,0x193,0x175,0x159,0x13e,0x123,0x10a,0xf2,0xdb,0xc5,0xb0,
0x9c,0x89,0x78,0x67,0x58,0x4a,0x3d,0x32,0x27,0x1e,0x16,0xf,0xa,0x6,0x2,0x1,

0x0,0x1,0x2,0x6,0xa,0xf,0x16,0x1e,0x27,0x32,0x3d,0x4a,0x58,0x67,0x78,0x89,
0x9c,0xb0,0xc5,0xdb,0xf2,0x10a,0x123,0x13e,0x159,0x175,0x193,0x1b1,0x1d1,0x1f1,0x212,0x235,
0x258,0x27c,0x2a0,0x2c6,0x2ed,0x314,0x33c,0x365,0x38e,0x3b8,0x3e3,0x40e,0x43a,0x467,0x494,0x4c2,
0x4f0,0x51f,0x54e,0x57d,0x5ad,0x5dd,0x60e,0x63f,0x670,0x6a1,0x6d3,0x705,0x737,0x769,0x79b,0x7cd
};

 Timer2의 256KHz IRQ 처리함수(Handler)는 다음과 같다.
정현파 DDS 파형을 만드는실제의 IRQ 함수는 1초에 256,000번 실행된다.

워낙 많은 횟수를 실행하기 때문에 가로채기 처리함수에서는 1개의 명령이라도 줄여야 했다.

Table값은 한번에 2바이트를 읽어서 1 byte 씩 2개를 I2C 포트로 전송한다 (12비트 Table은 2 바이트다)
포인터는 1 byte 이므로 256 step에서 ++로만 돌려주면 별도로 조정할 필요가 없으므로,
그만큼 처리시간이 줄어든다. 이것은 주함수에서 여유가 더 생긴다는 뜻이다.

byte sine_Pos =0; // Look up table 포인터 =1 byte 
void timer2_IRQ_Handler()
{
  i2c_str_sendBytes(DAC_device, dac_sine_8Bit[sine_Pos] >>8, dac_sine_8Bit[sine_Pos++] &0xFF);
};

 setup()의 적당한 위치에 다음과 같이 DAC를 초기화하고 작동을 시작한다.
주함수에서는 아무런 하위함수의 호출이 필요없이 DAC는 Timer2 IRQ만으로 작동된다.

void setup()
{
  init_DAC_Timer2(); // init interval Timer2 IRQ for external DAC
  start_DDS(); // start 1Khz sine wave DDS to MCP4725 by interrupt handller
};


DDS 주파수를 2배로 올렸는데, 주함수 성능은 내려가지 않았고, DDS 파형은 매우 깔끔하게 나온다.

 
 
사진은 1KHz 정현파 DDS 출력을 분해능 125us/div에서 Trigger Level을 0Vac로 포착한 파형이다.
DAC에서 나온 정현파가 LPF도 없이 이정도로 나온다면 파형의 품질은 무조건 OK다.  
우측상단의 측정값이 6과 7이 중복된 것은 LCD 표시속도가 카메라보다 빠르기 때문이다.

저역통과 여과기(LPF)의 회로와 특성
낮은 신호 주파수에 높은 주파수의 잡음이 혼입된 경우 LPF로 제거가 가능하다.
 
LPF는 Bessel Filter로 R1=R2, C1=C2 이며, 차단주파수 fc는 통과 주파수 진폭이 1/2로 낮아지는 주파수이다.
측정할 신호파형의 변형을 방지하기 위해, LPF 차단주파수는 2배 이상의 높은 주파수로 만들어야 한다.  
 
특성표를 보면 동일한 LPF를 직렬로 만이 사용할 수록 신호주파수의 손실과 위상지연이 줄어들고
차단하는 잡음은 주파수가 높아질수록 급격하게 감소하는 좋은 특성을 보여준다.
 
다음은 펄스잡음이 섞인 1KHz DDS 출력을 2차 LPF를 사용하여 깨끗한 정현파로 만드는 회로이다.
용도는 교류 임피던스를 측정하는 검출회로로 단전원 OPamp MCP6284를 사용한다.  
 


A0는 DUT의 구동전압을 검출하고, A1은 I-V 변환출력으로 DUT의 전류를 전압으로 변환하여 검출한다.
녹색으로 표시된 2개의 저항은 DUT의 값에 따라 전압과 전류의 검출 증폭도를 변경하는 용도이다,
일반적으로 Analog Multiplexer를 사용하여 1K 저항을 1K, 10K, 100K, 1M로 변경하여 증폭도를 바꾼다.

 첨부파일 #1: Adafruit_ILI9431.h

 이 펌웨어 소스를 응용한 장치의 개발이나, 주문형 펌웨어가 들어간 모듈 주문 받습니다.
 주의 : 이 자료의 무단 복제 및 무단 배포를 금지합니다.
이 프로그램은 무료 소프트웨어로, 신체와 재산 상의 어떤 위험과 손해를 보상하지 않습니다.
이 프로그램은 GNU 무료 소프트웨어 배포규정을 따릅니다.
 AVRTOOLS™
   
윗글 아듀이노 응용소스 게시판
아래글 STM32F103C ILI9341 TFTLCD Scope V2
    N         제목    글쓴이 작성일 조회 추천
아듀이노 응용소스 게시판 avrtools™ 2016/02/05 (금) 423 0
41 STM32F103C 12비트 정현파 DDS V2 avrtools™ 2018/03/08 (목) 110 0
40 STM32F103C ILI9341 TFTLCD Scope V2 avrtools™ 2018/03/05 (월) 133 0
39 STM32F103C 32비트 ARM-CPU 2채널 Scope avrtools™ 2018/02/25 (일) 138 0
38 STM32F103C의 ILI9341 ILI9163 TFT-LCD 연결방법 avrtools™ 2018/02/19 (월) 137 0
37 STM32F103C+MCP4725 DDS 1KHz 정현파 발생기 avrtools™ 2018/02/18 (일) 136 0
36 STM32F103C 기판의 1~8CH ADC DMA 전송 avrtools™ 2018/02/17 (토) 137 0
35 STM32F103C 기판의 SSD1306 OLED 구동 avrtools™ 2018/02/16 (금) 133 0
34 STM32F103C ARM32 기판의 독립 IDE 소개 avrtools™ 2018/02/14 (수) 167 0
33 STM32F103C ARM32 기판의 Bootloader 개조 avrtools™ 2018/02/14 (수) 175 0
32 ESP32+OLED 기판과 PWM generator avrtools™ 2018/02/11 (일) 136 0
31 Wemos-Lolin32 Audio FFT Analyzer 제작 avrtools™ 2018/02/07 (수) 141 0
30 DUE SAM3X8E Audio FFT Analyzer 제작 avrtools™ 2018/01/30 (화) 155 0
29 AD5933 LCR-Impedance Analyzer 제작 avrtools™ 2012/03/17 (토) 661 0
28 ESP-01 펌웨어 업그레이드와 WiFi 2 Relay Control avrtools™ 2017/12/24 (일) 133 0
27 ESP12E-devKit로 만드는 WiFi 4 Relay 제어장치 avrtools™ 2017/12/23 (토) 155 0
26 M328-mini로 만드는 Touch 용량검출센서 avrtools™ 2017/12/19 (화) 142 0
25 ESP8266 MQTT Relay Control avrtools™ 2016/03/03 (목) 626 0
24 2 채널 ESP8266 WiFi Switch의 제작 avrtools™ 2016/02/25 (목) 784 0
23 ESP-12E SDK 0.9.5 사용방법 avrtools™ 2016/02/18 (목) 672 0
22 ESP8266 ESP-12E WiFi 센서 서버의 제작 avrtools™ 2016/02/17 (수) 635 0
21 Arduino DS3231 RTC to 5110 LCD avrtools™ 2016/02/16 (화) 643 0
20 ESP8266 Weather Server의 제작 avrtools™ 2016/02/15 (월) 678 0
19 Arduino 온습도 센서 DHT-22 avrtools™ 2016/02/12 (금) 558 0
18 ESP8266 WiFi 펌웨어 업그레이드 avrtools™ 2016/02/11 (목) 878 0
17 Arduion ESP8266 WiFi 설정 방법 avrtools™ 2016/02/10 (수) 859 0
16 Arduino 정전용량식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 477 0
15 Arduino 전극식 수분센서의 분석과 제작 avrtools™ 2016/02/07 (일) 623 0
14 Arduino 정밀 전력계의 ADC avrtools™ 2016/02/02 (화) 903 0
13 Arduino 정밀 전력계의 LPF avrtools™ 2016/02/02 (화) 616 0
12 Ardunio 16비트 ADC Data Logger avrtools™ 2016/01/31 (일) 512 0
11 Arduino AC/DC Power Meter의 제작 avrtools™ 2016/01/29 (금) 1019 0
10 Arduino 교류 역율계(power factor)의 제작 avrtools™ 2016/01/29 (금) 651 0
9 Arduino DUE Pezo-SPeaker LCQ Meter 소스 avrtools™ 2016/01/24 (일) 425 0
8 QTouch ADC 근접검출 스위치 avrtools™ 2016/01/21 (목) 652 0
7 Arduino 음성인식 Speech/Voice Recognition avrtools™ 2013/09/14 (토) 1872 0
6 Arduino Uno로 만드는 3축 CNC avrtools™ 2013/09/10 (화) 2812 0
5 Arduino로 만드는 mySpectral 분광기 avrtools™ 2013/09/04 (수) 2335 0
4 8채널 12비트 ADC MCP3208 오실로스코프 avrtools™ 2012/03/29 (목) 708 0
3 교류저항 (impedance) 측정 AD5933 avrtools™ 2012/03/17 (토) 648 0
2 Arduino DMX512 수신기 제작 avrtools™ 2012/03/15 (목) 3922 0
1 TSL2561 조도 측정기의 제작 avrtools™ 2011/09/11 (일) 2874 0
1

바구니 : 0
 보관함 : 0
오늘뷰 : 0
HOME   |   회사소개   |   제휴안내   |   회사위치   |   서비스이용 약관   |   개인정보 보호정책   |   사이트맵
17015 경기도 용인시 기흥구 동백중앙로16번길 16-25, 508호. 전화 : 031-282-3310
사업자 등록번호 : 697-47-00075 / 대표 : 이건영 / 업태 : 제조업 / 종목 : LED조명, LED전원, 제어장치.
개인정보 관리책임자 : 홈페이지 관리자 . Copyright ⓒ2016 아크레즈 (ACLEDS INC.)
HOME TOP PREVNEXT 0 0 0