通过STM32控制AD9833模块输出相应频率的DDS波形,(方波或正弦波或三角波),并将频率显示在OLED屏幕上。
实验设备:1.STM32F103C8 ,2.AD9833模块,3.OLED,4.示波器
OLED和STM32F103C8之间是I2C通讯,AD9833和STM32F103C8之间是SPI通讯,实验了20kHz的方波输出,实物连线图如下:
示波器实测如下:
代码:
主函数:
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD9833.h"
#include "IC.h"
int main(void)
{
AD9833_Init(); //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
AD9833_WaveSeting(20000.0,0,SQU_WAVE,0 );//20KHz, ƵÂʼĴæÆ÷0£¬ÕýÏÒ²¨Êä³ö ,³õÏàλ0
IC_Init();
OLED_Init();
OLED_ShowString(1, 1, "Freq:00000Hz");
OLED_ShowString(2, 1, "Duty:00%");
while (1)
{
Delay_ms(100);
OLED_ShowNum(1, 6, IC_GetFreq(), 5);
OLED_ShowNum(2, 6, IC_GetDuty(), 2);
OLED_ShowNum(3, 2, TIM_GetCapture1(TIM3)+1, 6);
OLED_ShowNum(4, 2, TIM_GetCapture2(TIM3)+1, 6);
}
}
2)AD9833
#ifndef __AD9833_H
#define __AD9833_H
#include "stm32f10x.h" // Device header
#define TRI_WAVE 0 //Êä³öÈý½Ç²¨
#define SIN_WAVE 1 //Êä³öÕýÏÒ²¨
#define SQU_WAVE 2 //Êä³ö·½²¨
void AD9833_Init(void);
void AD9833_WaveSeting(double frequence,unsigned int frequence_SFR,unsigned int WaveMode,unsigned int Phase );
void AD9833_Init_GPIO(void);
void AD9833_AmpSet(unsigned char amp);
#endif
#include "AD9833.h"
#include "Delay.h"
#define FSYNC_1() GPIO_SetBits(GPIOB,GPIO_Pin_15)//Êä³ö¸ß
#define FSYNC_0() GPIO_ResetBits(GPIOB,GPIO_Pin_15)//Êä³öµÍ
#define SCK_1() GPIO_SetBits(GPIOB,GPIO_Pin_14)//Êä³ö¸ß
#define SCK_0() GPIO_ResetBits(GPIOB,GPIO_Pin_14)//Êä³öµÍ
#define DAT_1() GPIO_SetBits(GPIOB,GPIO_Pin_13)//Êä³ö¸ß
#define DAT_0() GPIO_ResetBits(GPIOB,GPIO_Pin_13)//Êä³öµÍ
#define CS_1() GPIO_SetBits(GPIOB,GPIO_Pin_12)//Êä³ö¸ß
#define CS_0() GPIO_ResetBits(GPIOB,GPIO_Pin_12)//Êä³öµÍ
void AD9833_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //ʹÄÜPB,PE¶Ë¿ÚʱÖÓ
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //ÍÆÍìÊä³ö
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO¿ÚËÙ¶ÈΪ50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //¸ù¾ÝÉ趨²ÎÊý³õʼ»¯GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); //PB.5 Êä³ö¸ß
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: AD9833_Write
* ¹¦ÄÜ˵Ã÷: ÏòSPI×ÜÏß·¢ËÍ16¸öbitÊý¾Ý
* ÐÎ ²Î: TxData : Êý¾Ý
* ·µ »Ø Öµ: ÎÞ
*********************************************************************************************************
*/
void AD9833_Write(unsigned int TxData)
{
uint8_t i;
SCK_0();
Delay_us(2);
SCK_1();
Delay_us(2);
FSYNC_1();
Delay_us(2);
FSYNC_0();
Delay_us(2);
for(i = 0; i < 16; i++)
{
if(TxData&0x8000)
DAT_1();
else
DAT_0();
Delay_us(2);
SCK_0();
Delay_us(2);
SCK_1();
TxData <<= 1;
}
FSYNC_1();
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: AD9833_AmpSet
* ¹¦ÄÜ˵Ã÷: ¸Ä±äÊä³öÐźŷù¶ÈÖµ
* ÐÎ ²Î: 1.amp £º·ù¶ÈÖµ 0- 255
* ·µ »Ø Öµ: ÎÞ
*********************************************************************************************************
*/
void AD9833_AmpSet(unsigned char amp)
{
unsigned char i;
unsigned int temp;
CS_0();
temp =0x1100|amp;
for(i=0;i<16;i++)
{
SCK_0();
if(temp&0x8000)
DAT_1();
else
DAT_0();
temp<<=1;
SCK_1();
Delay_us(2);
}
CS_1();
}
/*
*********************************************************************************************************
* º¯ Êý Ãû: AD9833_WaveSeting
* ¹¦ÄÜ˵Ã÷: ÏòSPI×ÜÏß·¢ËÍ16¸öbitÊý¾Ý
* ÐÎ ²Î: 1.Freq: ƵÂÊÖµ, 0.1 hz - 12Mhz
2.Freq_SFR: 0 »ò 1
3.WaveMode: TRI_WAVE(Èý½Ç²¨),SIN_WAVE(ÕýÏÒ²¨),SQU_WAVE(·½²¨)
4.Phase : ²¨ÐεijõÏàλ
* ·µ »Ø Öµ: ÎÞ
*********************************************************************************************************
*/
void AD9833_WaveSeting(double Freq,unsigned int Freq_SFR,unsigned int WaveMode,unsigned int Phase )
{
int frequence_LSB,frequence_MSB,Phs_data;
double frequence_mid,frequence_DATA;
long int frequence_hex;
/*********************************¼ÆËãÆµÂʵÄ16½øÖÆÖµ***********************************/
frequence_mid=268435456/25;//ÊʺÏ25M¾§Õñ
//Èç¹ûʱÖÓÆµÂʲ»Îª25MHZ£¬Ð޸ĸô¦µÄƵÂÊÖµ£¬µ¥Î»MHz £¬AD9833×î´óÖ§³Ö25MHz
frequence_DATA=Freq;
frequence_DATA=frequence_DATA/1000000;
frequence_DATA=frequence_DATA*frequence_mid;
frequence_hex=frequence_DATA; //Õâ¸öfrequence_hexµÄÖµÊÇ32λµÄÒ»¸öºÜ´óµÄÊý×Ö£¬ÐèÒª²ð·Ö³ÉÁ½¸ö14λ½øÐд¦Àí£»
frequence_LSB=frequence_hex; //frequence_hexµÍ16λË͸øfrequence_LSB
frequence_LSB=frequence_LSB&0x3fff;//È¥³ý×î¸ßÁ½Î»£¬16λÊý»»È¥µô¸ßλºó±ä³ÉÁË14λ
frequence_MSB=frequence_hex>>14; //frequence_hex¸ß16λË͸øfrequence_HSB
frequence_MSB=frequence_MSB&0x3fff;//È¥³ý×î¸ßÁ½Î»£¬16λÊý»»È¥µô¸ßλºó±ä³ÉÁË14λ
Phs_data=Phase|0xC000; //Ïàλֵ
AD9833_Write(0x0100); //¸´Î»AD9833,¼´RESETλΪ1
AD9833_Write(0x2100); //Ñ¡ÔñÊý¾ÝÒ»´ÎдÈ룬B28λºÍRESETλΪ1
if(Freq_SFR==0) //°ÑÊý¾ÝÉèÖõ½ÉèÖÃÆµÂʼĴæÆ÷0
{
frequence_LSB=frequence_LSB|0x4000;
frequence_MSB=frequence_MSB|0x4000;
//ʹÓÃÆµÂʼĴæÆ÷0Êä³ö²¨ÐÎ
AD9833_Write(frequence_LSB); //L14£¬Ñ¡ÔñƵÂʼĴæÆ÷0µÄµÍ14λÊý¾ÝÊäÈë
AD9833_Write(frequence_MSB); //H14 ƵÂʼĴæÆ÷µÄ¸ß14λÊý¾ÝÊäÈë
AD9833_Write(Phs_data); //ÉèÖÃÏàλ
//AD9833_Write(0x2000); /**ÉèÖÃFSELECTλΪ0£¬Ð¾Æ¬½øÈ빤×÷״̬,ƵÂʼĴæÆ÷0Êä³ö²¨ÐÎ**/
}
if(Freq_SFR==1) //°ÑÊý¾ÝÉèÖõ½ÉèÖÃÆµÂʼĴæÆ÷1
{
frequence_LSB=frequence_LSB|0x8000;
frequence_MSB=frequence_MSB|0x8000;
//ʹÓÃÆµÂʼĴæÆ÷1Êä³ö²¨ÐÎ
AD9833_Write(frequence_LSB); //L14£¬Ñ¡ÔñƵÂʼĴæÆ÷1µÄµÍ14λÊäÈë
AD9833_Write(frequence_MSB); //H14 ƵÂʼĴæÆ÷1Ϊ
AD9833_Write(Phs_data); //ÉèÖÃÏàλ
//AD9833_Write(0x2800); /**ÉèÖÃFSELECTλΪ0£¬ÉèÖÃFSELECTλΪ1£¬¼´Ê¹ÓÃÆµÂʼĴæÆ÷1µÄÖµ£¬Ð¾Æ¬½øÈ빤×÷״̬,ƵÂʼĴæÆ÷1Êä³ö²¨ÐÎ**/
}
if(WaveMode==TRI_WAVE) //Êä³öÈý½Ç²¨²¨ÐÎ
AD9833_Write(0x2002);
if(WaveMode==SQU_WAVE) //Êä³ö·½²¨²¨ÐÎ
AD9833_Write(0x2028);
if(WaveMode==SIN_WAVE) //Êä³öÕýÏÒ²¨ÐÎ
AD9833_Write(0x2000);
}