標(biāo)題:
STM32單片機控制AD9959 DDS和編碼輸出數(shù)字信號 正弦波點頻輸出源程序
[打印本頁]
作者:
兩人鵬34
時間:
2022-5-25 16:21
標(biāo)題:
STM32單片機控制AD9959 DDS和編碼輸出數(shù)字信號 正弦波點頻輸出源程序
通過STM32控制DDS輸出頻率,通過按鍵控制輸入十進(jìn)制四位數(shù)字并進(jìn)行BCD編碼,輸出結(jié)果由LCD12864點陣液晶屏顯示
制作出來的實物圖如下:
DDS.jpg
(1.84 MB, 下載次數(shù): 54)
下載附件
2022-5-25 16:20 上傳
單片機源程序如下:
功能:stm32f103rct6控制,25MHz時鐘, AD9959正弦波點頻輸出,范圍0-200M,
顯示:12864cog
接口:控制接口請參照AD9959.h 按鍵接口請參照key.h
#include "stm32_config.h"
#include "stdio.h"
#include "led.h"
#include "lcd.h"
#include "AD9959.h"
#include "key.h"
#include "timer.h"
#include "task_manage.h"
#define Code_Freq 20 //編碼輸出頻率
u8 delay_time = 1000/Code_Freq; //編碼延時時間
extern u8 _return;
int main(void)
{
MY_NVIC_PriorityGroup_Config(NVIC_PriorityGroup_2); //設(shè)置中斷分組
delay_init(72); //初始化延時函數(shù)
LED_Init(); //初始化LED接口
key_init();
Init_AD9959();
Timerx_Init(99,71);
initial_lcd();
delay_ms(300);
Timer2_Init(delay_time*5,7199); //輸出定時器初始化
Write_frequence(0,SinFre[0]);
while(1)
{
KeyRead();
Set_PointFre(Keycode, 0);
if(_return)
{
_return=0;
LCD_Refresh_Gram();
}
KEY_EXIT();
}
}
復(fù)制代碼
#include "AD9959.H"
#include "task_manage.h"
u8 CSR_DATA0[1] = {0x10}; // 開 CH0
u8 CSR_DATA1[1] = {0x20}; // 開 CH1
u8 CSR_DATA2[1] = {0x40}; // 開 CH2
u8 CSR_DATA3[1] = {0x80}; // 開 CH3
u8 FR2_DATA[2] = {0x20,0x00};//default Value = 0x0000
u8 CFR_DATA[3] = {0x00,0x03,0x02};//default Value = 0x000302
u8 CPOW0_DATA[2] = {0x00,0x00};//default Value = 0x0000 @ = POW/2^14*360
u8 LSRR_DATA[2] = {0x00,0x00};//default Value = 0x----
u8 RDW_DATA[4] = {0x00,0x00,0x00,0x00};//default Value = 0x--------
u8 FDW_DATA[4] = {0x00,0x00,0x00,0x00};//default Value = 0x--------
//AD9959初始化
void Init_AD9959(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
u8 FR1_DATA[3] = {0xD0,0x00,0x00};//20倍頻 Charge pump control = 75uA FR1<23> -- VCO gain control =0時 system clock below 160 MHz;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE); //PA,PB,PC端口時鐘使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_2|GPIO_Pin_7|GPIO_Pin_6|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;//初始化管腳PA2.3.4.5.6.7.8.9.10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //IO口速度為2MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIOA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10;//初始化管腳PB0.1.10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //IO口速度為2MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIOB
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //初始化管腳PC0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //IO口速度為2MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIOC
Intserve(); //IO口初始化
IntReset(); //AD9959復(fù)位
WriteData_AD9959(FR1_ADD,3,FR1_DATA,1);//寫功能寄存器1
WriteData_AD9959(FR2_ADD,2,FR2_DATA,1);
// WriteData_AD9959(CFR_ADD,3,CFR_DATA,1);
// WriteData_AD9959(CPOW0_ADD,2,CPOW0_DATA,0);
// WriteData_AD9959(ACR_ADD,3,ACR_DATA,0);
// WriteData_AD9959(LSRR_ADD,2,LSRR_DATA,0);
// WriteData_AD9959(RDW_ADD,2,RDW_DATA,0);
// WriteData_AD9959(FDW_ADD,4,FDW_DATA,1);
//寫入初始頻率
Write_frequence(3,SinFre[3]);
Write_frequence(0,SinFre[0]);
Write_frequence(1,SinFre[1]);
Write_frequence(2,SinFre[2]);
Write_Phase(3, SinPhr[3]);
Write_Phase(0, SinPhr[0]);
Write_Phase(1, SinPhr[1]);
Write_Phase(2, SinPhr[2]);
Write_Amplitude(3, SinAmp[3]);
Write_Amplitude(0, SinAmp[0]);
Write_Amplitude(1, SinAmp[1]);
Write_Amplitude(2, SinAmp[2]);
}
//延時
void delay1 (u32 length)
{
length = length*12;
while(length--);
}
//IO口初始化
void Intserve(void)
{
AD9959_PWR=0;
CS = 1;
SCLK = 0;
UPDATE = 0;
PS0 = 0;
PS1 = 0;
PS2 = 0;
PS3 = 0;
SDIO0 = 0;
SDIO1 = 0;
SDIO2 = 0;
SDIO3 = 0;
}
//AD9959復(fù)位
void IntReset(void)
{
Reset = 0;
delay1(1);
Reset = 1;
delay1(30);
Reset = 0;
}
//AD9959更新數(shù)據(jù)
void IO_Update(void)
{
UPDATE = 0;
delay1(2);
UPDATE = 1;
delay1(4);
UPDATE = 0;
}
/*--------------------------------------------
函數(shù)功能:控制器通過SPI向AD9959寫數(shù)據(jù)
RegisterAddress: 寄存器地址
NumberofRegisters: 所含字節(jié)數(shù)
*RegisterData: 數(shù)據(jù)起始地址
temp: 是否更新IO寄存器
----------------------------------------------*/
void WriteData_AD9959(u8 RegisterAddress, u8 NumberofRegisters, u8 *RegisterData,u8 temp)
{
u8 ControlValue = 0;
u8 ValueToWrite = 0;
u8 RegisterIndex = 0;
u8 i = 0;
ControlValue = RegisterAddress;
//寫入地址
SCLK = 0;
CS = 0;
for(i=0; i<8; i++)
{
SCLK = 0;
if(0x80 == (ControlValue & 0x80))
SDIO0= 1;
else
SDIO0= 0;
SCLK = 1;
ControlValue <<= 1;
}
SCLK = 0;
//寫入數(shù)據(jù)
for (RegisterIndex=0; RegisterIndex<NumberofRegisters; RegisterIndex++)
{
ValueToWrite = RegisterData[RegisterIndex];
for (i=0; i<8; i++)
{
SCLK = 0;
if(0x80 == (ValueToWrite & 0x80))
SDIO0= 1;
else
SDIO0= 0;
SCLK = 1;
ValueToWrite <<= 1;
}
SCLK = 0;
}
if(temp != 0)
IO_Update();
CS = 1;
}
/*---------------------------------------
函數(shù)功能:設(shè)置通道輸出頻率
Channel: 輸出通道
Freq: 輸出頻率
---------------------------------------*/
void Write_frequence(u8 Channel,u32 Freq)
{
u8 CFTW0_DATA[4] ={0x00,0x00,0x00,0x00}; //中間變量
u32 Temp;
Temp=(u32)Freq*8.589934592; //將輸入頻率因子分為四個字節(jié) 8.589934592=(2^32)/500000000 其中500M=25M*20(倍頻數(shù)可編程)
CFTW0_DATA[3]=(u8)Temp;
CFTW0_DATA[2]=(u8)(Temp>>8);
CFTW0_DATA[1]=(u8)(Temp>>16);
CFTW0_DATA[0]=(u8)(Temp>>24);
if(Channel==0)
{
WriteData_AD9959(CSR_ADD,1,CSR_DATA0,1);//控制寄存器寫入CH0通道
WriteData_AD9959(CFTW0_ADD,4,CFTW0_DATA,1);//CTW0 address 0x04.輸出CH0設(shè)定頻率
}
else if(Channel==1)
{
WriteData_AD9959(CSR_ADD,1,CSR_DATA1,1);//控制寄存器寫入CH1通道
WriteData_AD9959(CFTW0_ADD,4,CFTW0_DATA,1);//CTW0 address 0x04.輸出CH1設(shè)定頻率
}
else if(Channel==2)
{
WriteData_AD9959(CSR_ADD,1,CSR_DATA2,1);//控制寄存器寫入CH2通道
WriteData_AD9959(CFTW0_ADD,4,CFTW0_DATA,1);//CTW0 address 0x04.輸出CH2設(shè)定頻率
}
else if(Channel==3)
{
WriteData_AD9959(CSR_ADD,1,CSR_DATA3,1);//控制寄存器寫入CH3通道
WriteData_AD9959(CFTW0_ADD,4,CFTW0_DATA,1);//CTW0 address 0x04.輸出CH3設(shè)定頻率
}
}
/*---------------------------------------
函數(shù)功能:設(shè)置通道輸出幅度
Channel: 輸出通道
Ampli: 輸出幅度
---------------------------------------*/
void Write_Amplitude(u8 Channel, u16 Ampli)
{
u16 A_temp;//=0x23ff;
u8 ACR_DATA[3] = {0x00,0x00,0x00};//default Value = 0x--0000 Rest = 18.91/Iout
A_temp=Ampli|0x1000;
ACR_DATA[2] = (u8)A_temp; //低位數(shù)據(jù)
ACR_DATA[1] = (u8)(A_temp>>8); //高位數(shù)據(jù)
if(Channel==0)
{
WriteData_AD9959(CSR_ADD,1,CSR_DATA0,1);
WriteData_AD9959(ACR_ADD,3,ACR_DATA,1);
}
else if(Channel==1)
{
WriteData_AD9959(CSR_ADD,1,CSR_DATA1,1);
WriteData_AD9959(ACR_ADD,3,ACR_DATA,1);
}
else if(Channel==2)
{
WriteData_AD9959(CSR_ADD,1,CSR_DATA2,1);
WriteData_AD9959(ACR_ADD,3,ACR_DATA,1);
}
else if(Channel==3)
{
WriteData_AD9959(CSR_ADD,1,CSR_DATA3,1);
WriteData_AD9959(ACR_ADD,3,ACR_DATA,1);
}
}
/*---------------------------------------
函數(shù)功能:設(shè)置通道輸出相位
Channel: 輸出通道
Phase: 輸出相位,范圍:0~16383(對應(yīng)角度:0°~360°)
---------------------------------------*/
void Write_Phase(u8 Channel,u16 Phase)
{
u16 P_temp=0;
P_temp=(u16)Phase;
CPOW0_DATA[1]=(u8)P_temp;
CPOW0_DATA[0]=(u8)(P_temp>>8);
if(Channel==0)
{
WriteData_AD9959(CSR_ADD,1,CSR_DATA0,1);
WriteData_AD9959(CPOW0_ADD,2,CPOW0_DATA,1);
}
else if(Channel==1)
{
WriteData_AD9959(CSR_ADD,1,CSR_DATA1,1);
WriteData_AD9959(CPOW0_ADD,2,CPOW0_DATA,1);
}
else if(Channel==2)
{
WriteData_AD9959(CSR_ADD,1,CSR_DATA2,1);
WriteData_AD9959(CPOW0_ADD,2,CPOW0_DATA,1);
}
else if(Channel==3)
{
WriteData_AD9959(CSR_ADD,1,CSR_DATA3,1);
WriteData_AD9959(CPOW0_ADD,2,CPOW0_DATA,1);
}
}
復(fù)制代碼
Keil5代碼下載(僅供參考):
代碼.7z
(230.54 KB, 下載次數(shù): 36)
2022-5-25 16:33 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1