討論如何提高 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]