Я пытаюсь генерировать синусоиду, используя программируемый генератор сигналов AD9833 с микроконтроллером ATmega32-A (тактовая частота MCLK = 8 МГц). Я использую связь USART, поэтому, если я изменяю частоту в гипертерминале, частота сигнала должна измениться. Я написал для этого небольшой код, как показано ниже.
но из приведенного выше кода я генерирую синусоидальную волну, но если я хочу изменить частоту сигнала на 125 кГц, мне нужно ввести 499,9 кГц в гипертерминале. Если я введу 125 кГц, то он показывает 31,2 кГц. Я не знаю, почему он так генерируется и какую ошибку я сделал? а также он изменяет форму волны до частоты 500 кГц. Предположим, если я ввожу частоту формы волны около 1000 кГц, но частота сигнала не меняется, он показывает только 125 кГц.
наконец, я хочу генерировать форму волны с разной частотой. Если я изменяю частоту в гипертерминале или замазке, то любая частота, которую я ввожу, должна генерировать форму волны с этой частотой.
Это мой первый пост, так что если есть грамматические ошибки, прошу меня извинить.
Заранее спасибо.
void unicom(void){
switch(Command){
case(WGF):
if(Param < 500)
SetWGFreq(Param);
Command = 0;
break;
case....
case....
default:
}
void main(void){
SetWGFreq(125);
-----------
--------
}
Привет еще раз,
На этот раз я пытаюсь запрограммировать AD9833 с микроконтроллером SM470R1B1M-HT через SPI. Я следую тому же принципу, что и «росс» ниже. Кажется, я не могу изменить частоту синусоиды. Ниже приведен код, который я пытаюсь использовать, я установил ту же конфигурацию с часами, что и раньше.
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. /a> AD9833