마하전자기술연구소 LOGO

제품검색 고객센터053-604-2355
기술자료실

Home > 기술자료실 기술자료실

제 목 38. CPLD와 PIC에 의한 시그널 제네레이터
첨부파일

 

                  CPLD로 제작한 100 nsec에서 1 sec의 펄스 발신 블록과 PIC를
                  접속한 시그널 제네레이터입니다. 한층 더 USB로 PC와 접속
                  해 리모콘을 할 수 있습니다.

 


 CPLD와 PIC에 의한 시그널 제네레이터

 CPLD의 펄스 발진 블록과 PIC를 조합했다
 펄스 제네레이터입니다. USB로 PC와도 접속해
 리모콘을 할 수 있습니다.


【개요】

CPLD의 펄스 발진 블록과PIC을 조합한 펄스 제네레이터로,
USB그리고 PC와도 접속해 리모트 콘트롤을 할 수 있습니다.
CPLD의 펄스 발진 블록은, VHDL의 페이지로로 설명한 것을
그대로 사용하고 있습니다.

아래와 같은 사진은 본신호 발생 장치의 완성한 외관과 전면 패널의 상세합니다.
전면 패널에 수동 설정용의 디지스잇치가 줄지어 있습니다.








【기능 사양】

(1) 펄스 출력 사양
 펄스 신호의 출력은 아래 표와 같은 2 단계의 범위에서 출력 할 수 있습니다.
 이 단계는
, external clock를 1배와 1/10배로 전환해 넓은 펄스폭의
 출력 범위를 커버하도록(듯이) 하고 있습니다.

모드 출력 펄스폭 펄스폭잘게 썰기 듀티 범위 듀티 잘게 썰기

리모트

모드

100nsec~100msec

(10MHz~20Hz)

100nsec 0~100% 100nsec
100 msec~1sec
(20 Hz~1Hz)
1μsec 0~100% 1μsec
수동 모드 100 nsec~100msec
(10 MHz~10Hz)
100nsec 50% 고정 없음

 출력 신호 종류와 인터페이스
   신호 출력:   TTL레벨
  감시용용 출력: TTL레벨

(2) 수동 조작 사양
 펄스폭설정은 디지스잇치에 의한 10 진수 6자리수의 메뉴얼 설정으로,
 설정을 변경하면(자) 즉출력에 반영됩니다.

 100nsec
(으)로부터99,999,900nsec100msec까지 설정이 가능합니다.
 리모트와 수동과의 변환은 자동적으로 실시하는 것으로 해 후발 우선으로 합니다.


(3)리모트 조작 사양
 펄스폭, 듀티와도 수동 설정과 같은 디지스잇치에 의한다
 설정으로 해, 펄스폭은 10 진수 7자리수, 듀티는 10 진수 3자리수로%설정
 (으)로 합니다.
 리모트 설정에서는
100nsec(으)로부터999,999,900nsec1sec까지 설정이 가능과
 합니다.

(4) 스위프 기능
 리모트에서는 자동 이체 기능을 가져, 설정한 개시 펄스폭과 종료 펄스폭,
 한층 더 새겨 스텝과 시간 간격을 지정하면, 일정시간 간격으로 차례차례 펄스폭을
 증가시키면서 출력합니다.

【유니트의 구성】

 신호 발생 장치의 전체 구성은 밑그림과 같이 되어 있습니다. 신호 발생 그 자체는
CPLD
그리고 실시해, 그것을PIC16F876그리고 제어합니다. 또 PC와의USB인터
페이스에는,
USB콘트롤러의USBN9603(을)를 사용 이것도 역시PIC16F876그리고
컨트롤 하고 있습니다.

 한층 더 수동 설정용의 디지스잇치가 합계 6자리수분 있습니다만, 이것의 다이나
믹스 왈가닥 제어도
PIC16F876그리고 실행하고 있습니다.








【회로 구성】

신호 출력 유니트는 기판이 되고 있어 그 회로는 밑그림과 같이 되어 있습니다.
USBN9603(와)과PIC의 사이는 정석 대로SPI통신으로 접속하고 있습니다.
CPLD(와)과PIC의 사이는 시리얼 통신으로 접속하고 있습니다만 전용의 인터페이스
되고 있습니다.
CPLD의 클락에는20MHz의 수정 발신기를 사용하고 있습니다.
전원은 3 단자 레귤레이터를 사용합니다만,
CPLD의 소비 전류가100mA근처
약간 많기 때문에 큰 1
A클래스의7805(을)를 사용 방열기를 붙이고 있습니다.







아래와 같은 파일은 WinDraft, WinBoard용의 회로도와 패턴도입니다.
다운로드해 해동해 사용해 주세요.

  ★ 회로도 파일(WinDraft용)
  ★ 패턴도 파일(WinBoard용)


짠 유니트 기판의 외관은 아래와 같이 사진과 같이 됩니다. USB 콘트롤러
(은)는 플랫 패키지 타입이므로, 기판의 패턴면에 직접은 다 붙이고 해
있습니다.









【디바이스측 프로그램】

C언어판의 USB 기본 프로그램에, 각 엔드 포인트의 유저 처리부를
추가해 작성합니다.
엔드 포인트의 구성은 아래 표와 같이 하고 있습니다. IN/OUT의 견해는 호스트측으로부터
본 입출력이 되고 있습니다.
USBN9603는 최대로 엔드 포인트가 컨트롤+6개까지 사용할 수 있습니다. 기본 데바
의자 프로그램에서는, 전부를 사용할 수 있게 되어 있습니다만, 범용 I/O로서 사용해
있는 것은, 아래 표와 같이 컨트롤+4개입니다.

파이프 No 엔드 포인트 IN/OUT 처리 함수 용도
없음 0 IN/OUT 컨트롤 전송
배치용
0 1 벌크 IN do_tx1( ) 미사용
1 2 벌크 OUT do_rx1( ) 커멘드 출력
2 3 벌크 IN do_tx2( ) 미사용
3 4 벌크 OUT do_rx2( )
4 5 벌크 IN do_tx3( )
5 6 벌크 OUT do_rx3( )

디바이스의 프로그램은 C언어 베이스가 되고 있습니다. C언어로 작성한 USB의
기본 프로그램에 유저 처리 부분을 추가하고 있습니다.
프로그램의 구성으로서는 아래와 같은 4개(살)이 되고 있습니다.
  
  sysgen2.c  :본체 프로그램
  usbmain.h  :USB 처리 기본 디바이스 프로그램 모듈(module)
  usbn960x.h :USBN9603의 레지스터류의 정의 파일
  usbdef.h   :USB 관련의 정수와 디바이스 디스크립터를 정의한 파일

이하로부터 디바이스측의 상기 프로그램을 다운로드 할 수 있기 때문에
해동해, CCS의 C컴파일러로 사용해 주세요. MPLAB에 통합해 컴파일
하는 것이 편리합니다.

  ★ USB 접속 범용 I/O디바이스 프로그램   (3/3 Verup)
  

메인 프로그램으로 USB 처리 메인 링크 모듈을 인클루드 하면,
그리고는, 유저 처리 부분만큼을 메인 프로그램으로 작성하면 좋게
되어 있습니다.
메인 프로그램으로 유저 처리부로서 추가한 부분은 아래와 같이가 되고 있습니다.

(1) 메인 처리의 기본 부분
  메인 처리로서 기본이 되는 부분에서, 여기서 USB의 버퍼의 사이즈 지정과
  usbmain.h라고 하는 USB 처리의 메인 함수를 링크하고 있습니다.
  그리고는 자신의 하드웨어 관련의 설정을 추가해, 마지막에 USB 초기화 함수
  의 init_usb( )를 콜 한 뒤, 메인 루프가 됩니다.
  메인의 아이돌 루프에서는 실행 해야 할것이 있습니다. 우선 펄스폭
 설정의 디지스잇치의 설정치를 다이내믹스 왈가닥으로 읽어들여
 
DIGIT[i]의 배열 변수에 자리수마다 격납합니다.
 읽기가 완료하면(자) 그것을 바이너리 수치로 변환합니다. 이 때 최대치
 하지만
999,999(이)가 되어long형태로 늦게 되기 때문에,CCS컴파일러의
 최신판(
Version3)으로 추가된”int32”이라고 한다32비트의 정수형을 사용해
 했다.
 그리고 이 값이 전회와 같은지 어떤지를 체크해, 같으면 굳이 조작
 되어 있지 않은 것으로서 아무것도 하지 않고, 최초의 디지스잇치 입력 처리에
 돌아와 반복합니다.

 수치가 전회와 다르고 있으면 조작을 하셨다고 하는 것이므로, 그 값을
 
CPLD에 출력합니다. 그 출력하는 함수는 수신 처리의 함수와 같은 처리입니다
 의로 유용하고 있습니다. 출력이 완료하면(자) 이번 값을 새롭게 전회치로서 두어
 고쳐 다음번에 대비하고 나서 최초로 돌아와 반복합니다.
 출력할 때 듀티치는 고정으로 50%로 하고 있습니다.


(2) 펄스폭설정 제어(파이프 1)
 파이프 1의 수신 처리에서는 수신한 데이터R1_DAT[n]에는 펄스폭설정의
 데이터가 들어가 있습니다. 이 1바이트째의 데이터
R1_DAT[0]
(은)는 클락의
 전환용의 데이터이므로, 이 내용의 0이나 0이 아닌 것처럼 따라
HILO신호를
 제어하고 있습니다. 그 후의
R1_DAT[1](으)로부터R1_DAT[2]까지의 3바이트는
 펄스폭설정치이므로, 그 데이터를 그대로
CPLD에 출력합니다.

(3) 듀티 제어(파이프 3)
 
파이프 3의 수신 처리에서는 수신 데이터R2_DAT[0](으)로부터R2_DAT[2]까지
 듀티의 설정치가 들어가 있기 때문에 이것도 그대로
CPLD에 출력
 합니다.


(4) 설정치 즉시 송신(파이프 5)
 파이프 5의 수신 처리는, 디지스잇치의 설정치 읽을 커멘드입니다
 (으)로부터, 현재 읽어들인 수치를 3바이트의 데이터로 고쳐 파이프 2로 송신 출력
 해 반송합니다. 이 송신은 단지
usb_send2()그렇다고 하는 함수를 부를 뿐입니다.


【시그널 제네레이터 제어 프로그램】   

이 펄스 신호 발생 장치를USB그리고 리모트 콘트롤하기 위한 PC
옆의 프로그램을 만듭시다.
USB의 드라이버는, 카시와노씨작의 범용USB드라이버에 벤더ID(을)를 추가해
사용하기 때문에,
USB주위에서 특별히 만들지 않으면 안 되는 것은 없습니다.
이것도 모두
Visual Basic그리고 작성합니다.
우선 기능입니다만, 밑그림의 폼을 베이스로 해 아래와 같은 기능을 실현합니다.

(1)
펄스폭과 듀티의 제어
 화면상의 디지스잇치의 각 형 위(▲), 아래()스윗치를 누르는 것으로
 펄스폭과 듀티치를 설정합니다. 설정을 변경하면 그 값이 곧
 장치에 출력되고 반영됩니다.


(2)
스위프 제어
 개시 펄스폭
(From), 종료 펄스폭(To), 펄스폭증분(Step), 인터벌
 시간
(Interval)(을)를 설정해 「개시」버튼을 누르면, 지정 시간 간격으로 증분마다
 펄스폭이 증가해 출력되어 차례차례 펄스폭이 넓어집니다.
 그리고 종료 펄스폭이 되면 종료합니다.
 도중에 「정지」버튼을 누르면 언제라도 종료합니다.

(3)장치측 디지스잇치의 읽기
 읽기 버튼을 누르면(자), 그 때의 디지스잇치의 내용을USB경유로 입력
 해 10 진수로 표시합니다.

 이 폼의 각 컴퍼넌트는 그림과 같은 오브젝트로 구성되어
있습니다. 디지스잇치를 구성하는 오브젝트는 자리수 마다 인덱스가
붙어 있어 배열의 취급이 되어 있습니다.
그리고 디지스잇치의 오름새 화살표를 누를 때에 표시 숫자가 증가해 하향 화살표
누를 때에 표시 숫자가 작아집니다. 한층 더 이 화살표를 누른 이벤트로,
설정되어 있는 펄스폭과 듀티치가 신호 발생 장치로 설정 출력됩니다.








 본프로젝트에는 2개의 코드 모듈이 있습니다. 표준 모듈과
폼 모듈입니다. 아래와 같이로부터 다운로드할 수 있습니다.

  ★시그널 제네레이터 프로젝트 파일 일식


 표준 모듈은, 상투적인
USB관련의 선언 뿐이므로 외로부터
카피해 사용하는 것이 가능합니다. 단,
USB의 핸들명은 변경하는 것이
알기 쉬워지므로, 기능에 맞추어 변경합니다.

 다음은 폼 모듈의 (분)편의 코드입니다만, 각각의 컴퍼넌트의
이벤트에 대해서 작성해 갑니다.
 우선은, 폼의 오픈, 클로우즈시의 처리입니다. 우선 폼을 오픈
했을 때에는
USB의 접속을 오픈해 파이프를 확보해 핸들치를 얻습니다.
이것이 확보 가능한 실 나무는 에러로서 메세지를 표시해 프로그램은
강제 종료가 됩니다.
 
폼을 클로우즈 할 경우에는, 오픈했다USB(을)를 파이프도 포함해
잊지 않게 클로우즈 해 잘라버리고 나서 프로그램을 종료합니다.
똑같이 「종료」버튼을 눌렀을 때에도 모두를 클로우즈 하고 나서 종료시키고
.


 다음은, 디지스잇치의 처리로 향상되어 화살표 버튼을 누른 이벤트때의
처리입니다.
우선 어느 자리수의 수치 업(오름새 화살표 버튼)을 눌러도 배열 정의에
되어 있으므로 같은 이벤트가 발생합니다. 구별은 인덱스치로 붙입니다.
따라서 어느 자리수여도 모두 공통의 처리로 할 수가 있어
index값으로 구별되어
처리됩니다.
 실제의 처리는, 우선 대응하는 자리수의 수치를+1합니다. 이 때 이미 9때에는
0에 되돌립니다. 이 후, 전형으로부터 설정치를
10진수로서 요구합니다만, 최상정도자리수가
0보다 클 때에는 최하정도자리수를 무시해 상위 6자리수만의 취급해로 해 클락
설정을 1/10으로 합니다.
이것이 구해지면(자), 3바이트의 바이너리치로 변환하고 나서 파이프 1으로 송신합니다.
계속되어 듀티치도 설정%치와 펄스폭치로부터 설정치를 요구해 역시
3바이트의 바이너리치로 변환하고 나서 파이프 3으로 출력하고 있습니다.
 디지스잇치의 다운 버튼을 눌렀을 때의 처리도 수치를-1하는 것만으로
후의 송신 처리는 완전히 동일합니다.

 다음은 스위프 기능의 코드부에서, 「개시」와「정지」버튼의 이벤트 처리와
됩니다. 우선 「개시」버튼이 밀렸을 때에는 개시 펄스폭
(From)에 입력되고
(이)라고 있는 데이터를 체크해
OK(이)라면 그것을 최초의 펄스폭으로서 파이프 1으로 출력
합니다.
 계속되어 듀티는 항상 50%로 하기 때문에 펄스폭의 1/2의 값을 파이프 3
그리고 출력합니다. 그 후로 타이머가 입력된 인터벌의 값으로 스타트 합니다.
이 이후는 타이머의 이벤트로 처리되게 됩니다.

 「정지」버튼이 밀렸을 때에는, 단순하게 타이머를 정지시키고 있을 뿐입니다.

 다음은 타이머의 이벤트 처리 부분입니다. 여기에서는 현재의 펄스폭증분
(Step)
입력되고 있는 값을 가산해, 종료 펄스폭을 넘지 않은지, 1초를 넘어
없으면, 다음의 펄스폭으로서 출력합니다.
듀티도 같은 50%로서 출력합니다. 넘었을 때에는 스위프 기능의 종료
(으)로서 메세지를 표시해 타이머를 정지시킵니다.



【외관】

기판을 케이스에 실장합니다만 그 실장 방법을 설명합니다.
디지스잇치의
BCD출력부는 전형을 리드 선으로 정리해 배선해 버립니다.
그리고 그
BCD4비트분과 각 형의 6개를 정리해 연결기 접속으로 기판과
접속합니다. 듀티 설정용으로 로터리 엔코더를 접속할 수 있는 연결기
하지만 준비되어 있어, 로터리 엔코더 본체도 패널에 달고 있습니다만
이번은 사용하고 있지 않습니다.

 전원은AC어댑터등으로부터 공급하는 것으로서 직접 기판에 입력하고 있습니다.
이 때 다이오드를 1개 직렬에 삽입하고 있습니다만, 이것은
AC어댑터등의
극성 실수로부터 보호하는 목적이기 때문에입니다.
 USB의 접속은 연결기가 됩니다만, 기판에 직접 연결기를 실장하고 있습니다
의로, 배면으로부터
USB케이블을 삽입할 수 있도록(듯이) 배치해, 배면 패널에 조금
큰 네모진 구멍을 뚫고 있습니다. 이것으로 배면으로부터 직접 케이블을 삽입할 수 있습니다.
아래와 같이가 조립 후의 외관입니다.


전원을 간략화했습니다 잘라 하고 있다.
USB 연결기의 앞의 패널에는 큰 네모지다
구멍을 뚫고 있다.




디지스잇치 주위의 배선, 자리수의 BCD 출력은 파라 접속
로터리 엔코더는 미사용


목록보기

www.1chip.com, www.1chip.co.kr
www.micom114.com
자료실바로가기

대구광역시 북구 산격2동 1629 산업용재관 10동 13호 (2층) / Tel. 053-604-2355 / Fax. 053-383-2354 / E-mail. maha@paran.com