eddiewwm 发表于 2019-9-11 16:52:11

討論如何提高 LGT8F328P D/A 波形頻率

本帖最后由 eddiewwm 于 2019-9-11 17:28 编辑

在一個群組看到有人提供以下討論網址,討論如何提高 LGT8F328P D/A 波形頻率,很有參考價值。
https://www.avrfreaks.net/forum/success-story-lgt8f328p-linux

原內容不是使用 arduino,以下是整理後的 arduino 程序:
#define F_CPU 32000000UL

#include <util/delay.h>
#include <avr/power.h>
#include <avr/pgmspace.h>
#include "lgtx8p.h"

unsigned char x = 0;
unsigned char y = 0;
unsigned char * ylist = (char *) 0x100;

void setup() {
// put your setup code here, to run once:
// set div to /1 (default /8), so speed increases from 4Mhz to 32Mhz
clock_prescale_set(clock_div_1);

// DACEN: enable DAC
// DAOE: let the DAC output reach DAO port (PD4)
DACON = (1 << DACEN) | (1 << DAOE);
//RCMCAL = 255; // for overclock to 42MHz

// Create fancy waveform
do {
/*    //generate fancy waveform start
    y = x < 128 ?
      // first half
      // Create "M" part of waveform
      ( x < 64 ? 255 - x : x + 128 ) :
      // second half
      // Create inverted "U" part of waveform
      ( __builtin_sin((x - 128) * 3.1415 / 128.0) * 128 );
    //generate fancy waveform End
*/
    //y = 128 + __builtin_sin(x * 3.1415 / 128.0) * 128; //generate sine waveform
    y = x; //generate linear waveform
    *ylist++ = y;
} while (x++ < 0xFF);
}

void loop() {
// Replay the waveform
asm volatile ( " clr r30 ; ZL is 0\n"
               " ldi r31,0x1 ; ZH is 1 (data address base is 0x100) \n"
               " ldi r28,0xA1 ; YL will contain DACL\n"
               " clr r29 ; YH is 0\n"
               ".loop: \n"
               " ld r25, Z ; get byte from address at Z\n"
               " inc r30 ; increment ZL and let it roll :) \n"
               " st Y, r25 ; DALR is 0xA1 \n"
               " rjmp .loop \n");
}*注意:以上程序要用 copy/paste 方式放在 arduino 內,不可用這裡提供的 "复制代码" 按鍵複制,因可能會造成編譯失敗。**

波形失真雖然很大,但文章的技術觀念很有用。
Fancy Waveform


Sine Waveform


Linear Waveform
页: [1]
查看完整版本: 討論如何提高 LGT8F328P D/A 波形頻率