プログラム可能な波形発生器 AD9833 と ATmega32-A マイクロ コントローラー (MCLK = 8MHz クロック周波数) を使用して正弦波を生成しようとしています。私は USART 通信を使用しているので、ハイパー ターミナルで周波数を変更すると、波形の周波数を変更する必要があります。以下に示すように、このための小さなコードを書きました。
しかし、上記のコードから正弦波を生成していますが、信号の周波数を 125KHz に変更したい場合は、ハイパーターミナルで 499.9KHz を入力する必要があります。125 KHz を入力すると、31.2KHz が表示されます。なぜそのように生成されているのか、どのような間違いを犯したのかわかりません。また、1000KHz 付近の波形の周波数を入力すると、周波数が 500KHz まで波形が変化しますが、信号の周波数に変化はなく、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;
}
}
このコントローラーと AD9833 のプログラミングに使用していない SPI ガイドを添付します。SPI ガイド AD9833