原子哥,能帮忙看看这个程序吗?我需要用stm32控制AD9850产生一个单一频率的正弦波,现在这个程序产生的结果是频率从0开始增加直到55KHZ,然后再回来从0增加到55KHZ,如此循环,请问我要怎么改才能让它频率不变啊?
/*-------------------------------------------------------------------------------------ad9850.c-------------------------------------------------------------------------------------------*/
#include "ad9850.h"
#include "delay.h"
unsigned char freq[4]={0x31,0x26,0xe9,0x78};//频率控制字
u8 FTW[4];
void init_ad9850_port(void)
{
RCC->APB2ENR|=1<<4; //使能PORTC时钟
RCC->APB2ENR|=1<<6; //使能PORTC时钟
GPIOE->CRL&=0XFFFFFFF0;
GPIOE->CRL|=0X00000003;//PE0 推挽输出 最大速度50M
GPIOE->CRH&=0X00000000;
GPIOE->CRH|=0X33333333;//PE0 推挽输出 最大速度50M
GPIOC->CRH&=0XFFFF0000;
GPIOC->CRH|=0X00003333;//PC11~13推挽输出 最大速度50M
}
/*******************************/
//写数据子程序
/*******************************/
void S_wr_byte(unsigned char temp)
{
unsigned char i,j;
for(i=0;i<8;i++)
{
j=temp&0x01;
if(j)
DATA=1;
else
DATA=0;
temp>>=1;
W_CLK=1;
W_CLK=0;
}
}
/*******************************/
//写控制字子程序
/*******************************/
void S_wr_ctrl(unsigned char *ctr)
{
unsigned char j;
for(j=4;j>0;j--)
{
S_wr_byte(ctr[j-1]);
}
S_wr_byte(0x00);
FQ_UD=1;
FQ_UD=0;
}
void calculate_contral_word(float frequence)
{
long fw;
fw=(long)(frequence*4294967.296/125);//将本振转化为十进制数
FTW[0]=0;
FTW[3]=(unsigned char)fw ;
FTW[2]=(unsigned char)(fw>>8);
FTW[1]=(unsigned char)(fw>>16);
FTW[0]=(unsigned char)(fw>>24);//将频率值转化为8为十六进制数
S_wr_ctrl(FTW);
// Wr_AD9850(init); //令dds产生信号
// delay();
}
void scan_frequence(float start_freq,float end_freq,float step_freq)
{
float freq;
freq=start_freq;
while(1)
{ freq=start_freq;
while(freq<end_freq)
{
calculate_contral_word(freq);
S_wr_ctrl(FTW);
freq+=step_freq;
delay_ms(50);
}
}
}
/*-------------------------------------------------------------------------------------ad9850.h------------------------------------------------------------------*/
#ifndef __AD9850_H
#define __AD9850_H
#include "sys.h"
//my ad9852 port
#define REST PCout(11) //PC11 (标识C4)
#define W_CLK PCout(9) //PC9 (标识C6)
#define FQ_UD PCout(8) //PC8 (标识C7)
#define DATA PCout(10) //PC10 (标识C5)
//weiwei ad9852 port
/*
#define REST PCout(8) //PC8 (标识C7)
#define W_CLK PCout(10) //PC10 (标识C5)
#define FQ_UD PCout(9) //PC9 (标识C6)
#define DATA PCout(7) //PC7 (标识C8)
*/
//unsigned char freq[4]={0x31,0x26,0xe9,0x78};//频率控制字
void init_ad9850_port(void); //端口初始化
void S_wr_byte(unsigned char temp); //写数据
void S_wr_ctrl(unsigned char *ctr); //写控制字
void Init_AD9850(void); //ad9850 初始化
void calculate_contral_word(float frequence);
void scan_frequence(float start_freq,float end_freq,float step_freq);
#endif
/*-------------------------------------------------------------------------------------------main.c--------------------------------------------------------------------------*/
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "ad9850.h"
extern unsigned char freq[4];
extern unsigned char FTW[4];
nt main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化为9600
init_ad9850_port();
Init_AD9850();
// calculate_contral_word(10000.0);
scan_frequence(0.0,55000.0,50.0);
while(1) //只循环一次
{
}
}
|