OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12786|回复: 3

要产生单一频率的正弦波

[复制链接]

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-8-3
在线时间
0 小时
发表于 2013-8-10 01:19:27 | 显示全部楼层 |阅读模式
原子哥,能帮忙看看这个程序吗?我需要用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) //只循环一次
  {

    }






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-10 10:34:11 | 显示全部楼层
修改这个函数:
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);
  }
  }

}>
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-8-3
在线时间
0 小时
 楼主| 发表于 2013-8-10 12:17:23 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
好的,已经解决了,谢谢原子哥啦。
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-8-10 14:21:47 | 显示全部楼层
AD9850原子哥也用过啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-15 12:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表