[36호]STM32F4의 DAC, DMA를 이용한 임의파형 발생기
ICT 융합 프로젝트 공모전 우수상
STM32F4의 DAC, DMA를 이용한 임의파형 발생기
글 | 단국대학교 김진우, 가천대학교 김준환
심사평
펌테크 상업적인 목적의 저가 보급형 제품으로 출시되어도 무방할 정도의 창의적인 아이디어 제품이라고 생각됩니다. 임의파형 편집 등의 기능을 가능하도록 구현한 점 등은 인상적인 부분이라고 생각합니다. 아쉬운 점은 출품작 제작 과정에 관련된 제출 서류가 미흡하여 상세한 내용을 확인할 수 없었고 이로 인해 평가에 다소 어려운 점이 있었다는 점 입니다.
뉴티씨 임베디드 개발자들은 경우에 따라 다양한 파형을 테스트해야 하는 경우가 생긴다. 이 어플리케이션은 그러한 개발자들의 수요를 충족시킬 수 있다는 점에서 높은 점수를 주고 싶다. 하지만 최근 각광받는 라즈베리파이 등 비 Windows 환경을 배려하지 않은 것은 아쉽다. 이 부분만 고쳐졌다면 리눅스 환경에서 개발하는 많은 임베디드 테스터에게 좋은 솔루션이 되었을 것 같다.
칩센 높은 수준의 기술구현에 흥미롭게 읽었습니다. 본 공모전이 ICT 융합프로젝트 공모전이라는 이름을 가지고 있지 않았다면 좀 더 높은 점수를 받았을 것 같습니다. 임의로 생성된 파형을 활용한 간단한 예시도 기재가 되었으면 좀 더 좋았을 것 같습니다. 예를 들자면 연구실용이나 개발용 임의파형 발생기보다 발생된 임의파형을 활용한 무선 전자악기 같은 ‘융합’이라는 주제나 컨셉이 필요해 보입니다. 블루투스 오디오를 활용하여 전송할 경우 레이턴시 때문에 악기로서 문제가 되는 부분을 짧은 데이터 전송으로 딜레이를 극복한다거나 하는 것도 좋지 않을까 합니다. 그 원리도 잘 설명하였으나 디바이스마트 잡지 기재가 필요한 이상, 다른학생들처럼 해당 작품을 재현하고 따라해볼 수 있도록 STM32F4(MCU)와 ESD110v2(BT)의 연결 구성 사진과 회로도, 코드 등도 필요해 보입니다.
위드로봇 실험 장비로 필요한 내용을 직접 임베디드로 구현하고, 사용자 편의성을 고려하여 PC 인터페이스 프로그램을 구현했을 뿐만 아니라 스마트폰을 이용하여 동일한 기능을 사용할 수 있도록 구성한 면에서 실용성이 무척 높은 작품이라 판단됩니다. 작품의 완성도도 무척 높으며 보고서 구성도 짧지만 핵심 내용이 모두 들어가 있었습니다. 아쉬운 점은 출력 파형이 얼마나 정밀하게 출력되는지에 대한 분석 자료가 없어 보고서 만으로는 “얼마나 잘 되었는지”를 정량적으로 판단할 근거가 없습니다. 이 부분이 추가된다면 무척 좋은 작품, 보고서라 생각합니다.
작품개요
· STM32F4 Micro Controller의 DMA와 DAC 기능을 이용하여 임의파형을 출력할 수 있는 임의파형 발생기를 제작한다.
· 사용자가 직접 파형을 생성하고 편집할 수 있는 윈도우 어플리케이션과 안드로이드 어플리케이션을 제작한다.
· 윈도우 어플리케이션 또는 안드로이드 어플리케이션을 통해서 사용자가 생성한 신호를 블루투스 통신을 이용하여 MCU로 전송하여 MCU의 디지털 핀을 통해서 신호를 출력한다.
작품 설명
주요 동작 및 특징
1) STM32F4의 DMA와 DAC 기능을 이용하여 신호 파형 출력
STM32F407의 DMA와 DAC 기능을 이용하여 사용자가 임의로 제작한 신호 파형을 I/O 핀을 통하여 출력할 수 있도록 한다. DAC(Digital-to-analog converter)를 이용하면 디지털 값을 0 ~ 3.3V 사이의 아날로그 신호로 출력할 수 있다. 그리고 DMA(Direct memory access)를 이용하면 Memory 영역과 Peripheral 영역과의 고속 데이터 전송을 구현할 수 있다. 즉, DMA를 통하여 CPU의 resource를 적게 소비하면서 고속으로 DAC에 필요한 데이터를 전송할 수 있다. 따라서 DMA와 DAC를 이용하여 고속의 아날로그 신호를 I/O핀을 통해 출력할 수 있다.
2) 윈도우 및 안드로이드 어플리케이션 제작
STM32F407의 DAC와 DMA기능을 통하여 사용자가 제작한 임의 파형을 아날로그 신호로 출력할 수 있다. 하지만 사용자가 파형을 쉽게 편집하기 위해서는 UI가 구성된 어플리케이션이 필요하다. 따라서 .Net Framework 기반의 윈도우 어플리케이션을 제작한다. 기본적으로 윈도우 어플리케이션에 필요한 기능은 사용자가 신호 파형을 생성할 수 있어야 한다. 마우스 클릭을 통해서 신호의 값을 정할 수 있으며, 한 주기에 대략 200개의 데이터가 필요하기 때문에 특정한 점만 클릭 시 자동으로 신호를 생성해주는 기능을 제공한다. 또한 c파일과 csv파일로 저장할 수 있는 기능을 제공한다. 안드로이드 어플리케이션도 추가적으로 제작하여 사용자가 굳이 윈도우 환경이 아니더라도 스마트 폰을 휴대하면 어디서든 신호를 생성하고 출력할 수 있도록 한다. 윈도우 또는 안드로이드 어플리케이션과 STM32F407간의 데이터 통신은 블루투스를 통하여 무선으로 제공하도록 제작한다.
3) 기존 함수 발생기 기능 구현
기존의 신호 발생기는 기본적으로 정현파, 톱니파, 구형파의 신호만을 제공한다. 하지만 본 과제에서 제작하는 신호 발생기는 기존의 신호 발생기에서 제공하는 정현파, 톱니파, 구형파를 포함하여 사용자가 임의로 제작한 신호 또한 출력할 수 있도록 한다. 따라서 이론상으로 모든 신호를 발생시킬 수 있다.
4) 임의파형 자동 파형 생성 기능 구현
사용자가 임의로 제작한 신호를 출력하기 위해서는 신호를 직접 그릴 수 있는 툴이 필요하다. 따라서 .Net Framework 기반의 윈도우 어플리케이션과 안드로이드 어플리케이션을 제작한다. 두 어플리케이션 모두 사용자가 직접 신호를 제작할 수 있도록 마우스 클릭과 터치를 통하여 신호를 발생할 수 있도록 한다. 하지만 사용자가 한 주기의 임의파형을 그리기 위해서 많은 수의 점을 직접 클릭하여 그려야 한다. 이는 많은 시간이 소요되므로 사용자가 원하는 파형의 주요 변곡점만 클릭하면 그 사이는 자동으로 연결해줄 수 있는 알고리즘을 적용한다.
따라서 좀 더 편하고 빠르게 파형을 생성할 수 있다. 이러한 점과 점 사이를 연결해주는 알고리즘으로 Monotone cubic interpolation과 Bezier Curve를 적용한다.
전체 시스템 구성
1) 시스템 구성도
PC 또는 안드로이드의 블루투스를 이용하여 MCU의 블루투스 모듈로 신호 데이터를 전송 후 전송된 데이터를 파싱, DMA와 DAC를 이용하여 2채널 아날로그 신호를 출력해서 사용자가 원하는 신호를 발생시킨다. 임의파형 발생기는 2채널을 지원한다
2) 윈도우 어플리케이션 개발
(1) 기본 UI 및 기능 설명
윈도우 어플리케이션을 실행시키면 기본적으로 위의 그림과 같이 실행된다. 최초 실행 시에는 그래프를 생성시킨 상태가 아니기 때문에 그래프가 표시되지 않는다. New 버튼을 통해서 그래프 생성을 위한 기본정보, 즉 데이터 개수와 최대 전압을 입력하면 그래프가 생성된다. 데이터 개수는 총 표현할 수 있는 점의 개수이면서 x축 인덱스의 개수가 된다. 최대 전압은 y축의 최대값이 된다.
New 버튼으로 데이터 개수와 최대 전압을 입력하면 입력한 정보를 기반으로 새로운 그래프가 생성된다. 그래프의 왼쪽에는 STM32F4 보드와 통신하기 위한 시리얼 통신 정보를 입력하고 시리얼 포트를 열 수 있는 메뉴들이 있다. 포트 이름, 보레이트, 데이터 비트, 스톱비트, 패리티비트 메뉴가 있다. 그 아래에는 채널 선택(기본적으로 2채널을 지원한다), 알고리즘(점과 점 사이를 이어주는 알고리즘) 선택, 그리고 주파수 입력을 위한 텍스트박스, 시리얼 통신 데이터 전송 버튼이 있다.
화면의 위쪽에는 여러 메뉴들이 있는데 다음과 같다.
New : 데이터 개수, 최대 전압을 입력하여, 새로운 그래프를 생성한다.
Open : 기존에 저장했던 그래프를 불러온다.
Close : 현재 작업중인 그래프를 닫는다.
Save : 현재 작업중인 그래프 데이터를 저장한다.
Save As : 현재 작업중인 그래프 데이터를 새로운 이름으로 저장한다.
Export to Excel : 그래프에서 생성한 파형 데이터를 엑셀파일(csv파일)로 저장한다.
Export to C Code : 그래프에서 생성한 파형 데이터를 C코드(c파일)로 저장한다.
Edit : Edit 모드, 그래프 화면 마우스 왼쪽 버튼 클릭 시 점 추가, 점을 마우스 왼쪽버튼 더블 클릭 시 해당 점 삭제, 마우스 휠로 확대/축소, 마우스 오른쪽 버튼으로 화면 이동을 한다.
Zoom In : 확대 모드로 마우스 왼쪽 버튼 클릭 시 해당 부분을 확대 한다.
Zoom Out : 축소 모드로 마우스 왼쪽 버튼 클릭 시 해당 부분을 축소 한다.
Pan : 화면 이동 모드로 마우스 왼쪽버튼으로 드래그 시 화면을 이동한다. (단, 그래프 생성시 입력한 데이터 개수와 최대 전압을 넘는 범위로는 이동이 불가능하다.)
Default View : 화면 배율을 기본 값으로 초기화한다.
Sine Wave : 사용자가 입력한 진폭을 갖는 사인 파형 신호를 생성한다.
Sawtooth Wave : 사용자가 입력한 진폭을 갖는 톱니 파형 신호를 생성한다.
Square Wave : 사용자가 입력한 진폭을 갖는 사각 파형 신호를 생성한다.
Waveform Generate : 사용자가 신호의 특정 변곡점만 클릭하고 Waveform Generate 버튼을 클릭시 해당 점과 점 사이를 자동으로 연결하여 그려준다. 이 때 사용하는 알고리즘은 그래프 왼쪽의 라디오 버튼을 통해 선택한다.
Clear : 화면을 클리어 한다.
Option : 줌 인 / 줌 아웃 배율 설정, 화면 이동시 감도 설정 등의 옵션을 설정한다.
(2) 화면 확대 / 축소 및 이동
기본적으로 그래프에서 Zoom In, Zoom Out, Pan 기능이 있지만 감도 설정, 키 설정 등이 불가능 하기 때문에 직접 위의 기능들을 구현하는 방식으로 개발하였다. 그래프의 프로퍼티중 Scale Max와 Min이 있는데, 이 값을 수정하면 그래프에서 보여지는 각 축의 최대값과 최소값을 바꿀 수 있다. 따라서 이 Scale Max와 Min 값을 가지고 Zoom In, Zoom Out, Pan 기능을 구현하였다. 위의 세 기능 모두 마우스 클릭 또는 마우스 드래그, 휠 등을 이용하여 작동할 수 있도록 하기 위해서 마우스 이벤트를 이용하였다.
기본적으로 마우스 클릭 이벤트 발생시에, 시스템으로부터 마우스 좌표를 얻어올 수 있다. 이 좌표는 전체 윈도우 폼을 기준으로 한 좌표이기 때문에 현재 그래프 상에서의 좌표로 환산한다. 위 그림의 붉은색 사각형처럼 마우스 좌표를 기준으로 가상의 사각형 박스의 각 꼭지점 좌표를 계산한다. (박스의 크기는 Zoom 배율의 설정 값에 따라 달라지게 된다.)
마우스 클릭 이벤트가 발생했을 때 사각형 박스의 각 꼭지점 좌표를 현재 그래프의 Scale Max와 Min으로 각각 설정한다. 그리고 그래프 컨트롤을 다시 그리게 하는 Refresh 메서드를 호출하면 새로 변경된 스케일의 그래프가 다시 그려지게 된다. 따라서 Zoom In이 된 상태로 보여지게 된다.
Zoom Out은 마우스 클릭 이벤트 발생시에, 현재 마우스 좌표를 기준으로 현재 그래프상에서 각 축의 Max 값과 Min 값까지의 거리 즉, 위의 그림에서 dx1, dx2, dy1, dy2를 구하고 이 길이에 Zoom 배율을 곱한 값을 새로운 그래프의 Scale Min, Max로 설정한다. Scale Max가 최대 범위를 넘거나 Scale Min이 0보다 작아질 경우에는 범위를 넘어가지 못하도록 처리를 해준다.
Pan 기능은 그래프를 확대했을 때 그래프의 다른 부분을 보기 위해서 마우스 드래그로 이동하는 것을 말한다.
마우스 다운 이벤트와 마우스 무브 이벤트를 이용하여 구현하였다. 마우스 클릭시 마우스 다운이벤트가 제일 먼저 발생하며, 이 때 현재 마우스 좌표를 저장해둔다. 그리고 클릭을 유지한 채 마우스를 움직이면 마우스 무브 이벤트가 발생한다. 이 때 아까 저장해 준 좌표와 현재 좌표 사이의 좌표값 차를 계산한다. 이는 위의 그림에서 dx, dy이다. 이 dx와 dy값에 일정 값(Pan 감도)을 곱하여 그래프의 Scale Max값과 Min 값에 더해주거나 빼줌으로써 그래프 화면의 이동을 구현할 수 있다.
(3) 기본 파형 생성
기존의 신호발생기에서 제공하는 사인파, 삼각파, 톱니파, 구형파를 사용자가 진폭만 설정하면 자동으로 생성해주도록 구현하였다.
위 그림과 같이 사인파, 삼각파, 톱니파, 구형파 등의 해당 메뉴를 클릭 시 파형의 최대 전압 값을 입력받을 수 있는 창이 뜬다. 값을 입력하고 확인을 누르면 파형이 자동으로 생성되게 된다.
사인파, 삼각파, 톱니파, 구형파에 해당하는 수식을 미리 저장해놓고 최대값을 입력 받으면 해당 값에 맞는 각 인덱스의 전압 값을 계산하여 그래프에 표시하도록 구현하였다.
(4) 자동 파형 생성
Waveform Generate 는 사용자가 파형을 생성할 때 모든 점을 다 찍어서 생성할 수 있지만 너무 시간이 많이 소요되므로 특정한 변곡점 몇 개만 찍고 나머지 부분은 자동으로 생성해주는 기능이다.
위 그림처럼 세 개의 점을 찍은 상태에서 Waveform Generate를 하게 되면 알고리즘 별로 아래와 같다.
Monotone cubic interpolation을 이용한 파형이다.
각 점을 직선으로 연결한 파형이다.
각각의 알고리즘은 문서의 다른 부분에서 설명한다. 점을 아예 찍지 않고 Waveform Generate 버튼을 누르게 되면 다음 그림과 같이 모든 점이 0값을 가지도록 그려진다.
기본적으로 파형생성을 할 때, x축 인덱스의 최소값과 최대값에서 y값이 그래프상에 그려져 있는지 아닌지 검사하고 안 그려져 있을 경우 y값이 0값을 가지도록 설정한다. 따라서 아무런 점을 찍지 않았을 때는 x=0, y=0 과 x= max_index, y=0 의 두 점이 기본적으로 자동으로 찍혀서 계산이 되기 때문에 그래프상의 모든 점에서 y값이 0으로 표시되어 생성되는 것이다.
위의 그림처럼 시작 인덱스와 끝 인덱스에서 y값을 설정해주지 않으면 0값이 기본적으로 들어 가므로 생성된 파형은 시작과 끝에서 0으로 수렴하는 모양으로 생성되게 된다.
(5) File 저장 및 불러오기
사용자가 작업하던 그래프를 저장하거나 불러올 수 있도록 현재 그래프의 상황을 저장하거나 불러올 수 있도록 하였다. 기본적으로 현재 그래프상에 표시되어 있는 점들의 좌표 정보를 저장하고 불러와야 한다. 따라서 그래프 상의 좌표 정보 데이터들을 하나의 객체로 감싸고 이를 직렬화하여 파일로 저장하고 불러 올 수 있도록 하였다.
기본적으로 C#에서 제공하는 BinaryFormatter 클래스를 사용하여 파일로 저장할 때에는 직렬화를, 파일에서 불러올 때에는 역직렬화를 하여 현재 그래프상의 데이터들을 저장하고 불러올 수 있게 하였다.
(6) Excel 또는 C코드로 내보내기
사용자가 직접 생성한 파형을 다양하게 이용할 수 있도록 엑셀 csv파일 또는 c코드 파일로 출력할 수 있도록 기능을 구현하였다.
기본적으로 csv파일은 쉼표로 각 셀의 데이터를 구분하는 방식으로 표현한다. 따라서 엑셀 csv파일로 저장할 때에는 StreamWriter 클래스를 이용하여 그래프 데이터 정보를 쉼표로 구분하여 파일로 저장하도록 하였다. c코드파일로 출력할 때에는 보통 기본적으로 MCU에서 DAC를 할 때 1차원 배열로 y값 데이터 정보를 주로 사용하기 때문에 1차원 배열로 텍스트를 생성하여 저장하도록 하였다. 역시 StreamWriter 클래스를 이용하여 저장하였다.
3) Andorid 어플리케이션 개발
(1) 기본 UI 및 기능 설명
위 그림은 처음 시작 UI이다. 1번을 클릭할 시 함수를 선택할 수 있는 리스트가 나타난다. 2는 블루투스를 켜거나 연결할 수 있고, 3, 4번은 구현한 그래프를 c, csv, txt 파일로 저장하거나 txt 파일을 불러올 수 있다. 5번은 임의 파형에서 직접 구현한 포인트를 가지고 Monotone cubic interpolation, Liner Curve, Bezier Curve 알고리즘을 이용하여 200개의 포인트를 자동으로 생성해 사용자가 쉽게 그래프를 그릴 수 있게 도와 준다. 6번은 블루투스와 연결된 임의 파형 발생기에게 200개의 임의 파형 데이터를 보내주어 임의 파형 발생기 보드에서 신호를 출력할 수 있게 해준다. 7번은 포인트를 제거 할 수 있다. 8번은 체크할 시 그래프를 수정할 수 있거나 삭제할 수 있게 해주고, 9번은 자신이 원하는 신호의 주파수를 입력 할 수 있다.
(2) 기본 파형 생성
기존 신호발생기와 같이 사인파, 톱니파, 삼각파, 구형파를 제공해준다. 함수 선택 버튼을 클릭하면 총 5가지의 리스트가 띄워진다.
사인파, 구형파, 톱니파, 삼각파 임의 파형 발생기를 선택할 수 있다.
이 함수를 가지고 Send 버튼을 클릭하면 블루투스에 연결되어 있는 임의파형 발생기보드에 데이터를 넘겨 원하는 파형을 출력할 수 있다.
(3) 자동 파형 생성
기본으로 제공된 파형뿐만 아니라 사용자가 원하는 파형을 만들어 줄 수 있게 해준다. 함수 리스트에서 Random을 선택하여 그릴 수 있다.
왼쪽 그림에 보면 빈 공간이 있다. 자신이 원하는 지점에 터치하여 오른쪽 그림처럼 원하는 그래프 모양을 그릴 수 있다. 이때, 사람이 그래프모양을 정확히 다 그리기에는 힘들거나, 번거로울 수 있다. 여기서 interpolation 알고리즘을 이용하여 자동으로 그래프를 그릴 수 있게 도와준다. Creation버튼을 클릭하면 interpolation 알고리즘이 3가지 나온다.
여기서 자신이 원하는 그래프를 그릴 수 있는 것을 클릭하여 Yes버튼을 클릭하면 자동으로 그래프를 그려준다.
왼쪽부터 사용자가 터치한 그림부터, Monotone Cubic, Liner Curve, Bezier Curve 알고리즘을 이용하여 그래프를 그릴 수 있다.
(4) File 저장 및 불러오기
사용자가 필요한 그래프를 그렸을 때 자신의 그래프를 계속 사용하고 싶을 때 저장버튼을 눌러 c코드 파일, txt파일, csv파일로 저장할 수 있다.
저장할 때 사용자가 원하는 파일로 지정을 하여 저장시킬 수 있다.
동시에 3가지 저장도 가능하다.
저장한 파일을 열어보면 함수의 그래프를 가지고 있다. csv파일을 열면 사용자가 바로 엑셀에서 그래프를 그릴 수 있게 하고, c파일은 배열에 데이터를 초기화 했다.
이렇게 불러오기 버튼을 클릭하여 저장한 파일을 불러오면 저장할 때 그렸던 그래프를 다시 그려준다.
4) STM32F의 DMA 및 DAC 기능을 이용한 신호 파형 출력
(1) 개발보드 및 블루투스 모듈 선정
개발보드로는 ST사의 STM32F407 MCU가 들어간 STM32F4DISCOVERY 보드를 사용하였다.
그리고 블루투스 모듈은 칩센사의 Parani-ESD110V2 모듈을 사용하였다. STM32F4는 32비트 MCU로 시스템 클럭은 최대 168MHz로 동작한다. 12비트 DAC, 32비트 타이머, DMA 등을 내장하고 있기 때문에 우리가 만들려는 임의파형 발생기의 메인보드로써 적합하기 때문에 선정하였다.
(2) 블루투스 통신 패킷
임의파형 발생기 개발보드와 윈도우 어플리케이션 또는 안드로이드 어플리케이션과 통신은 블루투스를 이용하여 데이터를 주고 받는다. 이 때 안드로이드 어플리케이션 또는 윈도우 어플리케이션에서 사용자가 생성한 임의 파형 데이터를 위의 그림과 같은 데이터 패킷으로 구성하여 전송하도록 구현하였다. 패킷의 각각의 항목에 대해서 설명하면 다음과 같다.
0xFF 0xFF : 데이터 패킷의 시작을 알리는 부분이다.
데이터 개수 상위 / 하위 바이트 : 시작을 알리는 0xFF, 0xFF 2바이트를 제외한 전체 데이터 패킷의 바이트 수를 나타낸다.
예를 들어서, 임의 파형 데이터의 포인트 개수가 200개라고 한다면, 기본적으로 파형 데이터는 12비트의 값(0~4095)을 가지므로 상위/하위 바이트로 나누어서 전송해야 한다. 따라서 200개의 파형 데이터는 400바이트가 되고, 채널, 주파수 상위/하위 바이트, 데이터 개수 상위 /하위 바이트의 바이트 수를 합치면 405바이트가 된다. 따라서 200개의 파형 데이터를 가지는 임의 파형을 전송하기 위해서는 총 407 바이트가 필요하고 그 중 0xFF, 0xFF 2바이트를 제외한 405라는 숫자를 데이터 개수 상위/하위 바이트로 나누어서 전송한다. 2바이트로 나누어서 전송하는 이유는 1바이트로는 0~255까지의 숫자만 표현 가능하므로 2바이트의 unsigned short int 데이터 형으로 구성하여 상위 바이트/하위 바이트로 1바이트씩 나누어서 전송한다.
주파수 상위/하위 바이트: 주파수도 1~20000(20kHz) 사이의 값이 될 수 있으므로 데이터 개수와 마찬가지로 2바이트의 unsigned short int 데이터 형으로 구성하여 상위 바이트/하위 바이트로 1바이트씩 나누어서 전송한다.
채널 : 기본적으로 임의파형 발생기는 2채널을 지원하므로 어떤 채널로 출력할 데이터인지 나타내는 채널 데이터가 필요하다. 1은 1채널, 2는 2채널을 의미한다. 따라서 1 또는 2의 값을 갖는다.
데이터 상위/하위 바이트 : 데이터 상위/하위 바이트는 임의파형 발생기 개발보드에서 12비트 DAC로 아날로그 신호로 출력할 데이터 값이다. 12비트 데이터이기 때문에 상위/하위 바이트로 나누어서 전송한다.
(3) 타이머를 이용한 DAC 트리거
DAC를 통해서 주기적인 신호를 표현하기 위해서는 DAC Conversion이 주기적으로 수행되어야 한다. 따라서 이를 위해서, 타이머의 트리거 기능을 이용한다. 우리는 STM32F4의 타이머 6/7을 이용하여 각각 채널1과 채널2의 DAC 트리거를 구현하였다.
타이머6을 DAC 채널1의 트리거로, 타이머7을 DAC 채널2의 트리거로 설정하였다. 타이머를 원하는 신호의 주파수로 동작하도록 프리스케일러와 카운터 레지스터를 설정하게 되면 Timer Trigger Output(TIMx_TRGO)이 원하는 주파수로 동작하고 DAC 인터페이스는 Timer Trigger Output의 Rising edge를 검출하여 DAC_DHRx 레지스터의 값을 DAC_DORx 레지스터로 전송한다. 따라서 원하는 주파수로 DAC Conversion이 수행되게 된다.기본적으로 타이머6/7의 메인 클럭은 시스템 클럭이 168MHz일 때 84MHz가 된다. 또한 타이머6/7의 프리스케일러와 카운터 레지스터는 16비트로 0~65535의 값을 갖게 된다.
원하는 주파수의 신호를 DAC로 트리거 하기 위해서는 아래의 공식을 통하여 원하는 주파수에 해당하는 타이머의 프리스케일러 값과 카운터 레지스터의 값을 구해야 한다.
Timer Period = Timer Frequency / Timer Prescaler / Frequency / Number of Data
Timer Period는 타이머의 카운터 레지스터의 값, Timer Frequency는 타이머의 동작 클럭으로 위의 그림에서 보듯이 타이머6/7은 시스템 클럭이 168MHz일 때 84MHz의 클럭으로 동작한다. 따라서 84000000의 고정값을 갖게 된다. Frequency는 원하는 신호의 주파수이며, Number of Data는 사용자가 편집한 파형의 데이터 개수이다.
(4) 오실로스코프에서 출력확인
위 그림에서 보듯이 오실로스코프에서 실제로 파형발생기와 같은 출력을 확인할 수 있다. 또한 임의그래프를 그려 실제로 출력해 보면 아래와 같이 나온다.
왼쪽 그림은 임의 그래프를 그린것이고 오른쪽 사진은 실제 출력했을 때 모습이다.
개발 환경
OS: Windows 7, Windows 8.1
Tool : Microsoft Visual Studio 2013, IAR Embedded Workbench, Eclipse
Language : C, C#, JAVA
단계별 제작 과정
기타
참고 문헌
1) STM32F407xx Datasheet
2) STM32F407xx Reference manual
3) http://developer.android.com/