2012-10-29 2 views
1

마이크로 컨트롤러 신세기에서 작업 중이지만 볼륨 인 벨롭 생성에 문제가 있습니다. 나는 순간에이 코드를 가지고 :
to_dac =(SinTable[lut_pos] * (volume))>>8;MCU에서 효율적인 진폭 변조 (C)

그것은 잘 작동하지만 해상도가 정말 나쁜 내가 어떻게가가로 아직도 (충분히 빨리 실행할 수있는 방법으로 그것을 개선하는 아무 생각이 없다

The waveform

Here is an MP3 how it sound now: (note: the DAC is on a breadboard and there is no Low pass filter at the output so there is some excess noise)

,536 :이 지금지고있어 결과입니다

) 모든 샘플에 대해 미리 형성 할 수

MSP430 장치를 사용하고 있습니다. (실제로는 MSP430G2553이지만 실제로 필요한 경우 MSP430F5510 (더 많은 메모리, 더 빠른 속도)을 사용할 수 있습니다. 예제를 살펴 보았지만 모두 부동 소수점 변수를 사용합니다. 죄(); 함수 및 기타 math.h에서하지만, 그 사람의 명품을 가지고 있지 않다 ...

편집 : 나는 완전한 바보 였고 또 다른 코드 조각은 진폭 범위의 낮은 해상도를 가졌지 만 그럼에도 불구하고 진폭 변조를위한 다른 솔루션을 위해 열려 있습니다.

+0

부동 소수점 없음 - 고정 소수점 수학 또는 정수를 사용하고 있습니까? 8 비트 소수 구성 요소가있는 고정 소수점 형식을 사용한다고 가정해야합니까? – Throwback1986

+0

오실레이터는 NCO를 기반으로합니다. 32 비트 위상 누산기 마녀가 8 비트까지 잘려져 있으며, 룩업 테이블 (lut_pos)의 위치입니다. 나는 사인파의 진폭 제어를위한 더 나은 방법을 발견했다. 단지 2 개의 사인파를 다른 위상과 함께 추가하여 최소한의 수학으로 진폭 제어를 제공한다. '((SinTable [lut_pos [0]] + SinTable [lut_p_phase [0]]))' –

답변

0

코드의 나머지 부분과 하드웨어 설정을 확인해야하지만, 나는 당신이 중반 레일 인 가상 접지를 가지고 있다고 가정 할 것입니까? 그렇다면 SinTable []이 기준 접지를 기준으로합니다 (즉, 12 비트 DAC의 경우 가상 접지 출력은 2048, Vcc는 4095, Gnd는 0이됩니다. 볼륨을 곱하면 가상 지상.

는 bitshift 이유를 잘 모르겠어요

if (SinTable[lut_pos] >= 2048) { 
    out = 2048 + (SinTable[lut_pos]-2048)*volume; 
} else { 
    out = 2048 - (2048-SinTable[lut_pos])*volume; 
} 
to_dac = out>>8; 

..이 시도,하지만 당신은 사전에 SinTable를 확장하여 자신에게 수고를 덜 수 있습니다.

0

이 나는 ​​MSP430G2553 데이터 시트 &보고 DAC를 찾을 수 없습니다. 외부 DAC를 사용하고 있습니까?

최신 MCU에는 DMA가 지원되는 고속 DAC가 있습니다. DMA에 명령을내어 ADC에 데이터를 보내는 것보다 메모리에 테이블을 채울 수 있습니다 (하나 이상의 죄 ​​기간).

이렇게하면 CPU에 다른 작업을 수행하는 데 더 많은 여유 시간을 줄 수 있습니다.