|
本帖最后由 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
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|