gpt4 book ai didi

c - 需要有关带有 ATmega32-A 微 Controller 的 AD9833 波形发生器的帮助

转载 作者:行者123 更新时间:2023-11-30 14:23:44 25 4
gpt4 key购买 nike

我正在尝试使用可编程波形发生器AD9833和ATmega32-A微 Controller 来生成正弦波。(MCLK = 8MHz时钟频率)。我正在使用 USART 通信,因此如果我更改 super 终端中的频率,则波形频率必须更改。我为此编写了一些小代码,如下所示。

但是从上面的代码我正在生成正弦波,但是如果我想将信号频率更改为125KHz,那么我必须在 super 终端输入499.9KHz。如果我输入125 KHz,那么它会显示31.2KHz。我不知道为什么会这样,我犯了什么错误?而且它还在改变波形直到 500KHz 频率假设如果我输入波形频率约为 1000KHz 但信号频率没有变化它只显示 125KHz。

最后我想生成不同频率的波形。如果我在 super 终端或腻子上更改频率,那么无论我输入什么频率,它都必须生成具有该频率的波形。

这是我的第一篇文章,如果有任何语法错误,请原谅。

提前致谢。

     void unicom(void){

switch(Command){


case(WGF):
if(Param < 500)
SetWGFreq(Param);
Command = 0;
break;

case....
case....
default:
}

void main(void){
SetWGFreq(125);
-----------
--------
}

再次嗨,

这次我尝试通过 SPI 使用 SM470R1B1M-HT 微 Controller 对 AD9833 进行编程。我遵循下面“ross”解释的相同原则。看来我无法改变正弦波频率。下面是我正在尝试的代码,我设置了与之前相同的时钟配置。

void SetupSPI(void);
unsigned char spi(unsigned char data);
void SetWGFreq(unsigned int);
void setFrequencyA(unsigned long fdata);
void WG_CS_Status(int status);

int main(void)
{
GCR &= ~ZPLL_MULT4;
GCR &= ~ZPLL_CLK_DIV_PRE1;
GCR &= ~ZPLL_CLK_DIV_PRE2;
GCR &= ~ZPLL_CLK_DIV_PRE3;

PCR = CLKDIV_1; // ICLK = SYSCLK
PCR |= PENABLE; // Enable peripherals

GIODIRA |= X7;

CLKCNTL |= CLKDIR | CLKSR_ICLK;

SetupSPI();

for(;;)
{
//SetWGFreq(25);
setFrequencyA(1045200);
} // Wait in endless loop
}

void SetupSPI(void)
{
int data = 0;

SPI2CTRL1 = CHARLEN_8 + PRESCALE_4; // 8 bits per xfer
SPI2CTRL2 |= CLKMOD + MASTER + POLARITY; // We are the master
SPI2PC6 |= SOMI_FUN | SIMO_FUN | CLK_FUN;
// SPI2PC6 |= 0x0E;
// enable
SPI2CTRL2 |= SPIEN;

data = SPI2BUF;
}

unsigned char spi(unsigned char data)
{
SPI2DAT1 = data;
while(!(SPI2CTRL3 & 0x01)){} // Wait for RxFlag to get set
return (SPI2BUF & 0x000000FF); // Read SPIBUF
}

void setFrequencyA(unsigned long fdata)
{
WG_CS_Status(0);
while(GIODOUTA&X7); // Delay
spi(0x20); // Initiate loading of frequence register 0 by 28 bits.
spi(0x00);
spi(( 0x40 | (0x3F & (fdata >> 8)))); // load bit 8-13 + 0x40.
spi(fdata); // load bit 0-7
spi(( 0x40 | (0x3F & (fdata >> 22)))); // load bit 22-27 + 0x40.
spi(fdata >> 14); // load bit 14-21
spi(0); // dummy write
WG_CS_Status(1);
}
void WG_CS_Status(int status)
{
if(status == 0)
{
// Make Chip Select low
GIODOUTA &= ~X7;
}
else
{
// Make Chip select high
GIODOUTA |= X7;
}
}

我附上了该 Controller 的 SPI 指南,而不是 AD9833 编程。 SPI guide AD9833

最佳答案

当您将频率转换为 AD9833 所需的两个 14 位数字 block 时,您需要对频率寄存器的 D14 和 D15 进行“或”运算。这里有两个问题。

第一个问题是您丢失了 4 位(每次 2 位)的 freg 值。

76543210 76543210 76543210 76543210
LL000000 00000000 LL000000 00000000 //The L's are lost because they're overwritten by the addressing.

第二个问题是您需要位 15 和 14 恰好为 0x40。现在,如果根据您的频率数据已经存在,那么对数据进行“或”运算,结果可能是 0xC0。

作为一个小注意事项,我认为在分配给 fByte0-3 时没有理由使用掩码,因为您将其用作分配。

因此,结合这两个修复并简化掩码可以得出:

fByte0 = (char)freg;
fByte1 = (char)(freg>>8);
fByte1 = (fByte1 & 0x3F) | 0x40; //clears bits 15 and 14, then sets for FREQ0
fByte2 = (char)(freg>>14); //byte1 only has 6 bits, so move over by 8+6
fByte3 = (char)(freg>>22); //byte1 only has 6 bits, so move over by 8+8+6
fByte3 = (fByte3 & 0x3F) | 0x40; //clears bits 15 and 14, then sets for FREQ0

我认为这会让你到达你想去的地方。

关于c - 需要有关带有 ATmega32-A 微 Controller 的 AD9833 波形发生器的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12591117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com