標(biāo)題:
stm32串行驅(qū)動AD9910源碼(產(chǎn)生頻率可控正弦波)12864顯示
[打印本頁]
作者:
liufei123456
時間:
2018-11-8 11:21
標(biāo)題:
stm32串行驅(qū)動AD9910源碼(產(chǎn)生頻率可控正弦波)12864顯示
stm32f103驅(qū)動DDS模塊ad9910,產(chǎn)生頻率可控正弦波,相位和幅值也可以通過程序配置,但是不建議,我試了一下會出現(xiàn)幅值不穩(wěn)的情況
單片機源程序如下:
#include "stm32_config.h"
#include "AD9910.h"
extern uchar cfr2[4]; //cfr2控制字
extern uchar cfr1[4]; //cfr1控制字
char str[30]; //顯示緩存
extern u8 _return;
int main(void)
{
u16 i=0;
unsigned long int freq = 1000000;
delay_init(72); //初始化延時函數(shù)
Init_ad9910();
Freq_convert(30000000);
Write_Amplitude(600); //寫幅度,輸入范圍:1-650 mV
while(1)
{
Freq_convert(freq);
freq = freq + 1000000;
if(freq > 40000000)
{
freq = 1000000;
}
delay_ms(200);
}
}
/*
if(PAin(0) == 0)
{
delay_ms(5);
cfr1[0] = 0x00; //RAM 失能
cfr2[1] = 0x00; //DRG 失能
Txcfr(); //發(fā)送cfrx控制字
Write_Amplitude(500); //寫幅度,輸入范圍:1-650 mV
Freq_convert(100000); //寫頻率,輸入范圍:1-400 000 000Hz
}
if(PAin(8) == 0)
{
delay_ms(5);
cfr1[0] = 0x00; //RAM 失能
cfr2[1]=0x0e; //DRG 使能
Txcfr(); //發(fā)送cfrx控制字
Write_Amplitude(500); //寫幅度,輸入范圍:1-650 mV
//掃頻波下限頻率,上限頻率,頻率步進(單位:Hz),步進時間間隔(單位:us)
SweepFre(100, 100000, 10, 240000); //步進時間范圍:4*(1~65536)ns
}
if(PDin(3) == 0)
{
delay_ms(5);
Square_wave(200); //方波,采樣時間間隔輸入范圍:4*(1~65536)ns
cfr1[0] = 0xc0; //RAM 使能,幅度控制
cfr2[1] = 0x00; //DRG 失能
Txcfr(); //發(fā)送cfrx控制字
}
*/
復(fù)制代碼
/**********************************************************
康威電子
顯示:12864
接口:按鍵接口請參照key.h
時間:2015/11/3
版本:1.0
作者:康威電子
其他:程序借鑒正點原子,添加自己的驅(qū)動,未經(jīng)作者許可,不得用于其它任何用途
**********************************************************/
#include "stm32f10x.h"
#include "AD9910.h"
#include "delay.h"
#include "sys.h"
/*-----------------------------------------------
名稱:AD9910串行驅(qū)動
編寫:Liu
日期:2014.6
修改:無
內(nèi)容:
------------------------------------------------*/
uchar cfr1[]={0x00,0x40,0x00,0x00}; //cfr1控制字
uchar cfr2[]={0x01,0x00,0x00,0x00}; //cfr2控制字
const uchar cfr3[]={0x05,0x0F,0x41,0x32}; //cfr3控制字 40M輸入 25倍頻 VC0=101 ICP=001;
uchar profile11[]={0x3f,0xff,0x00,0x00,0x25,0x09,0x7b,0x42}; //profile1控制字 0x25,0x09,0x7b,0x42
//01振幅控制 23相位控制 4567頻率調(diào)諧字
uchar drgparameter[20]={0x00}; //DRG參數(shù)
uchar ramprofile0[8] = {0x00}; //ramprofile0控制字
extern const unsigned char ramdata_Square[4096];
void AD9110_IOInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure ;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA, ENABLE); //使能PA,PB端口時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6| GPIO_Pin_7| GPIO_Pin_8| GPIO_Pin_9| GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init(GPIOB ,&GPIO_InitStructure) ;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3| GPIO_Pin_4| GPIO_Pin_5| GPIO_Pin_6 | GPIO_Pin_7| GPIO_Pin_8; //A2,A4,A5,A6,A8
GPIO_Init(GPIOA ,&GPIO_InitStructure) ;
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All^(GPIO_Pin_14| GPIO_Pin_15); //除了C14,C15,其他都選
// GPIO_Init(GPIOC ,&GPIO_InitStructure) ;
}
//=====================================================================
//======================ad9910初始化程序===============================
void Init_ad9910(void)
{
AD9110_IOInit();//IO初始化
AD9910_PWR = 0;//軟件拉低
PROFILE2=PROFILE1=PROFILE0=0;
DRCTL=0;DRHOLD=0;
MAS_REST=1;
delay_ms(5);
MAS_REST=0;
Txcfr();
}
//=====================================================================
//======================發(fā)送8位數(shù)據(jù)程序================================
void txd_8bit(uchar txdat)
{
uchar i,sbt;
sbt=0x80;
SCLK=0;
for (i=0;i<8;i++)
{
if ((txdat & sbt)==0)
AD9910_SDIO=0;
else
AD9910_SDIO=1;
SCLK=1;
sbt=sbt>>1;
SCLK=0;
}
}
//=====================================================================
//======================ad9910發(fā)送cfrx控制字程序=======================
void Txcfr(void)
{
uchar m,k;
CS=0;
txd_8bit(0x00); //發(fā)送CFR1控制字地址
for (m=0;m<4;m++)
txd_8bit(cfr1[m]);
CS=1;
for (k=0;k<10;k++);
CS=0;
txd_8bit(0x01); //發(fā)送CFR2控制字地址
for (m=0;m<4;m++)
txd_8bit(cfr2[m]);
CS=1;
for (k=0;k<10;k++);
CS=0;
txd_8bit(0x02); //發(fā)送CFR3控制字地址
for (m=0;m<4;m++)
txd_8bit(cfr3[m]);
CS=1;
for (k=0;k<10;k++);
UP_DAT=1;
for(k=0;k<10;k++);
UP_DAT=0;
delay_ms(1);
}
//=====================================================================
//===================ad9910發(fā)送profile0控制字程序======================
void Txprofile(void)
{
uchar m,k;
CS=0;
txd_8bit(0x0e); //發(fā)送profile0控制字地址
for (m=0;m<8;m++)
txd_8bit(profile11[m]);
CS=1;
for(k=0;k<10;k++);
UP_DAT=1;
for(k=0;k<10;k++);
UP_DAT=0;
delay_ms(1);
}
//=====================================================================
//===================計算頻偏字、頻率字和發(fā)送程序======================
void Freq_convert(ulong Freq)
{
ulong Temp;
if(Freq > 400000000)
Freq = 400000000;
Temp=(ulong)Freq*4.294967296; //將輸入頻率因子分為四個字節(jié) 4.294967296=(2^32)/1000000000 (1G 是內(nèi)部時鐘速度)
profile11[7]=(uchar)Temp;
profile11[6]=(uchar)(Temp>>8);
profile11[5]=(uchar)(Temp>>16);
profile11[4]=(uchar)(Temp>>24);
Txprofile();
}
//=====================================================================
//===================計算幅度字和發(fā)送程序==============================
void Write_Amplitude(uint Amp)
{
ulong Temp;
Temp = (ulong)Amp*25.20615385; //將輸入幅度因子分為兩個字節(jié) 25.20615385=(2^14)/650
if(Temp > 0x3fff)
Temp = 0x3fff;
Temp &= 0x3fff;
profile11[1]=(uchar)Temp;
profile11[0]=(uchar)(Temp>>8);
Txprofile();
}
//=====================================================================
//======================ad9910發(fā)送DRG參數(shù)程序==========================
void Txdrg(void)
{
uchar m,k;
CS=0;
txd_8bit(0x0b); //發(fā)送數(shù)字斜坡限制地址0x0b
for (m=0;m<8;m++)
txd_8bit(drgparameter[m]);
CS=1;
for(k=0;k<10;k++);
CS=0;
txd_8bit(0x0c); //發(fā)送數(shù)字斜坡步長地址0x0c
for (m=8;m<16;m++)
txd_8bit(drgparameter[m]);
CS=1;
for(k=0;k<10;k++);
CS=0;
txd_8bit(0x0d); //發(fā)送數(shù)字斜坡速率地址0x0d
for (m=16;m<20;m++)
txd_8bit(drgparameter[m]);
CS=1;
for(k=0;k<10;k++);
UP_DAT=1;
for(k=0;k<10;k++);
UP_DAT=0;
delay_ms(1);
}
//=====================================================================
//=====================掃頻波參數(shù)設(shè)置和發(fā)送程序========================
void SweepFre(ulong SweepMinFre, ulong SweepMaxFre, ulong SweepStepFre, ulong SweepTime)
{
ulong Temp1, Temp2, ITemp3, DTemp3, ITemp4, DTemp4;
Temp1 = (ulong)SweepMinFre*4.294967296;
if(SweepMaxFre > 400000000)
SweepMaxFre = 400000000;
Temp2 = (ulong)SweepMaxFre*4.294967296;
if(SweepStepFre > 400000000)
SweepStepFre = 400000000;
ITemp3 = (ulong)SweepStepFre*4.294967296;
DTemp3 = ITemp3;
ITemp4 = (ulong)SweepTime/4; //1GHz/4, 單位:ns
if(ITemp4 > 0xffff)
ITemp4 = 0xffff;
DTemp4 = ITemp4;
//掃頻上下限
drgparameter[7]=(uchar)Temp1;
drgparameter[6]=(uchar)(Temp1>>8);
drgparameter[5]=(uchar)(Temp1>>16);
drgparameter[4]=(uchar)(Temp1>>24);
drgparameter[3]=(uchar)Temp2;
drgparameter[2]=(uchar)(Temp2>>8);
drgparameter[1]=(uchar)(Temp2>>16);
drgparameter[0]=(uchar)(Temp2>>24);
//頻率步進(單位:Hz)
drgparameter[15]=(uchar)ITemp3;
drgparameter[14]=(uchar)(ITemp3>>8);
drgparameter[13]=(uchar)(ITemp3>>16);
drgparameter[12]=(uchar)(ITemp3>>24);
drgparameter[11]=(uchar)DTemp3;
drgparameter[10]=(uchar)(DTemp3>>8);
drgparameter[9]=(uchar)(DTemp3>>16);
drgparameter[8]=(uchar)(DTemp3>>24);
//步進時間間隔(單位:us)
drgparameter[19]=(uchar)ITemp4;
drgparameter[18]=(uchar)(ITemp4>>8);
drgparameter[17]=(uchar)DTemp4;
drgparameter[16]=(uchar)(DTemp4>>8);
//發(fā)送DRG參數(shù)
Txdrg();
}
//=====================================================================
//=================ad9910發(fā)送ramprofile0控制字程序=====================
void Txramprofile(void)
{
uchar m,k;
CS=0;
txd_8bit(0x0e); //發(fā)送ramprofile0控制字地址
for (m=0;m<8;m++)
txd_8bit(ramprofile0[m]);
CS=1;
for(k=0;k<10;k++);
UP_DAT=1;
for(k=0;k<10;k++);
UP_DAT=0;
delay_ms(1);
}
//=====================================================================
//=======================ad9910發(fā)送ramdata程序=========================
void Txramdata(void)
{
uint m,k;
CS=0;
txd_8bit(0x16); //發(fā)送ram控制字地址
for (m=0; m<4096; m++)
txd_8bit(ramdata_Square[m]);
CS=1;
for(k=0;k<10;k++);
UP_DAT=1;
for(k=0;k<10;k++);
UP_DAT=0;
delay_ms(1);
}
//=====================================================================
//=======================方波參數(shù)設(shè)置和發(fā)送程序========================
void Square_wave(uint Sample_interval)//方波
{
ulong Temp;
Temp = Sample_interval/4; //1GHz/4, 采樣間隔范圍:4*(1~65536)ns
if(Temp > 0xffff)
Temp = 0xffff;
ramprofile0[7] = 0x24;
ramprofile0[6] = 0x00;
ramprofile0[5] = 0x00;
ramprofile0[4] = 0xc0;
ramprofile0[3] = 0x0f;
ramprofile0[2] = (uchar)Temp;
ramprofile0[1] = (uchar)(Temp>>8);
ramprofile0[0] = 0x00;
Txramprofile();
Txramdata();
}
//=====================================================================
復(fù)制代碼
所有資料51hei提供下載:
9910.rar
(333.58 KB, 下載次數(shù): 220)
2018-11-8 15:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
haohaya
時間:
2018-11-13 09:32
學(xué)習(xí)一下
作者:
愛學(xué)習(xí)的晶晶
時間:
2019-8-5 09:51
嚶嚶嚶,想要這個程序
作者:
四十分
時間:
2019-8-5 16:09
請問為什么我用方波的程序產(chǎn)生的是三角波呢?
作者:
嘿嘿哈哈哈哈
時間:
2019-8-5 17:43
感謝樓主
作者:
13952502304
時間:
2020-3-7 17:40
大哥麻煩問下改幅值的話該再哪改
作者:
13952502304
時間:
2020-3-7 19:46
麻煩問一下IO對應(yīng)怎么接啊
作者:
13952502304
時間:
2020-3-7 19:58
四十分 發(fā)表于 2019-8-5 16:09
請問為什么我用方波的程序產(chǎn)生的是三角波呢?
麻煩問一下這個接口怎么接
作者:
13952502304
時間:
2020-3-9 20:56
四十分 發(fā)表于 2019-8-5 16:09
請問為什么我用方波的程序產(chǎn)生的是三角波呢?
請問一下主函數(shù)里面該怎么調(diào)用
作者:
TunVa
時間:
2020-12-4 20:11
麻煩問一下端口是怎么接的
作者:
LB666666
時間:
2024-4-9 10:48
想知道有沒有說明接口怎么接
作者:
LB666666
時間:
2024-4-10 09:27
這個寫著是rct6的下了是ze的,這兩個能通用?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1