我試圖使用可編程波形發生器AD9833用ATmega32的-A的微控制器,用於產生正弦波AD9833波形發生器。(MCLK = 8MHz的時鐘頻率)。我使用USART通信,所以如果我改變超級終端的頻率,那麼波形頻率必須改變。 我寫了如下所示的小代碼。需要幫助與ATmega32的-A微控制器
但是從上面的代碼我產生正弦波,但如果我想改變信號頻率到125KHz那麼我必須在超級終端輸入499.9KHz。如果我輸入125KHz,那麼它顯示31.2KHz。我不知道爲什麼它會像這樣產生,我做了什麼錯誤?並且它正在改變波形直到500KHz的頻率假設如果我輸入1000KHz左右的波形頻率,但沒有信號頻率改變它只顯示125KHz。
最後我想生成具有不同頻率的波形。如果我改變超級終端或膩子的頻率,那麼我輸入它的頻率必須以那個頻率產生波形。
這是我的第一篇文章,所以如果任何語法錯誤都沒有,那麼請原諒我。
在此先感謝。
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單片機編程AD9833。我正在按照下面的「羅斯」所解釋的原則。 看來我無法改變正弦波頻率。 下面是我正在嘗試的代碼,我用以前的時鐘設置相同的配置。
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;
}
}
我附上了SPI引導我休耕此控制器和AD9833編程不是。 SPI guideAD9833
非常感謝,現在我明白我做了什麼錯誤。它運作良好。 – verendra
抱歉再次提問。我有一點疑問。我在開關盒中調用這個函數,所以它的工作良好,但是問題出在主函數中,當沒有來自超級終端的輸入時,我已經將頻率設置爲125kHz,但是顯示小於50KHz的問題是什麼?你可以看看我編輯的代碼。 – verendra
我看到了編輯,但我不確定問題出在哪裏。你還記得在main()中設置階段嗎?我會檢查是否有其他寄存器忘記配置...否則,我對unicom()函數有點困惑。在WGF的情況下,你爲什麼總是將命令設置爲0?那應該是隻有當價值低於500? – Ross