DAC(Digital-to-Analog Converter)를 다룰 때, 시험용으로 사인파(Sine Wave) 신호를 생성하는 경우가 많다. 하지만 실시간으로 sin() 함수를 사용하는 것은 연산 부하가 크기 때문에, 대부분 LUT(Look-Up Table) 방식을 활용한다.
첫번째 방법
아래 사이트를 이용하면 최소값(min), 최대값(max), 샘플 개수(N) 등을 입력하여 자동으로 사인파 LUT 배열을 생성해 준다.
https://deepbluembedded.com/sine-lookup-table-generator-calculator/
https://www.daycounter.com/Calculators/Sine-Generator-Calculator.phtml
const uint16_t sineLookupTable[] = {
2048, 2177, 2305, 2432, 2557, 2681, 2802, 2920,
3035, 3145, 3252, 3353, 3450, 3541, 3626, 3705,
3777, 3843, 3901, 3952, 3996, 4032, 4060, 4080,
4092, 4096, 4092, 4080, 4060, 4032, 3996, 3952,
3901, 3843, 3777, 3705, 3626, 3541, 3450, 3353,
3252, 3145, 3035, 2920, 2802, 2681, 2557, 2432,
2305, 2177, 2048, 1919, 1791, 1664, 1539, 1415,
1294, 1176, 1061, 951, 844, 743, 646, 555,
470, 391, 319, 253, 195, 144, 100, 64,
36, 16, 4, 0, 4, 16, 36, 64,
100, 144, 195, 253, 319, 391, 470, 555,
646, 743, 844, 951, 1061, 1176, 1294, 1415,
1539, 1664, 1791, 1919};
두번째 방법
직접 sin() 함수를 사용하여 코드에서 LUT 배열을 초기화하는 방법이다. 초기 실행 시 한 번만 sin()연산을 수행하여 한 주기의 sine wave LUT를 생성하고, 이후에는 LUT 값을 그대로 사용하여 빠른 성능을 유지할 수 있다.
#include <math.h>
#include <stdint.h>
#include <stdio.h>
#define SAMPLES 100 // 샘플 개수
#define AMPLITUDE 1024 // 진폭
#define DC_OFFSET 1024 // DC 오프셋
#define PI 3.14159265359
uint16_t sine_table[SAMPLES];
void generate_sine_table() {
for (int i = 0; i < SAMPLES; i++) {
float angle = (2.0 * PI * i) / SAMPLES;
sine_table[i] = (uint16_t)(AMPLITUDE * sin(angle) + DC_OFFSET);
}
}
void main(void) {
// 초기화
generate_sine_table();
while (1);
}
__interrupt void cpuTimer0ISR(void)
{
DAC_setShadowValue(DAC_BASE, sine_table[index]);
index++;
if (index >= SAMPLES)
index = 0;
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
위와 같이 초기화 하면 0에서 2048까지 스윙하는 100개의 샘플 포인트를 가진 한 주기의 사인파 배열이 생성된다. 만약 DAC 출력주파수가 1kHz라면 샘플이 100개이므 10Hz의 사인파 신호가 출력된다.
'임베디드 개발 > 펌웨어' 카테고리의 다른 글
최적의 I2C 풀업 저항 선택 방법 (0) | 2025.04.27 |
---|---|
RJ-45 커넥터 핀아웃 (10/100BASE-T, 1000BASE-T 연결 방법) (0) | 2025.04.15 |
디지털 필터 (Moving Average, Exponential Filter) (0) | 2025.04.09 |
타코미터 센서 (Tachometer) (0) | 2025.03.24 |
CH341A 프로그래머 사용하기 (0) | 2025.02.24 |