#include 'pbdata.h'
const uchar cfr1[4] = {0x00,0x40,0x00,x00};//CF1控制字 [22] = 1:反sinc滤波器有效
uchar cfr2[4] = {0x01,0x00,0x00,0x00};//CF2控制字[23] = 1:内部I/O更新有效
const uchar cfr3[4] = {0x05,0x0f,0x41,0x32};CF3控制字,40M输入,25倍频,PDF工作,输入分频器工作,设置PLL电流,频段
uchar profile0[8] = {0x3f,0xff,0x00,0x00,0x25,0x09,0x7b,0x42};//
// 01振幅控制,23相位控制,4567,频率调谐字
// 高字节 低字节
uchar drgparameter[20] = {0};//DRG参数
void AD9910_IOInit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA |RCC_APB 2Periph_GPIOC,ENABLE);
GPIO_INitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_INitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_INitStructure.GPIO_Mode_Out_PP;
GPIO_INit(GPIOB,&GPIO_INitStructure);
GPIO_INitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_2;
GPIO_INitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_INitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_INitStructure);
GPIO_INitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
GPIO_INitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
GPIO_INit(GPIOA,&GPIO_INitStructure);
GPIO_INitStructure.GPIO_Pin = GPIO_Pin_ALL^(GPIO_Pin_14 | GPIO_Pin_15);
GPIO_INitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_INitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
}
//================================================================
//==================发送8位数据程序=====================================
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初始化程序===========================
void Init_ad9910(void)
{
uchar k,m;
AD9910_IOInit();
AD9910_PWR = 0;//1开启省电模式,0关闭
PROFILE2 = PROFILE1 = PROFILE0 = 0;
DRCTL = 1; DRHOLD = 0;//DRCTL:数字斜坡控制,数字输入(高电平有效)控制斜率极性;DRHOLD:数字斜坡保持(高电平有效) DRG即数字斜坡发生器
MAS_REST = 1;//主机复位,高电平有效,所有储存元件清0,寄存器设置位默认值
delay_ms(5);
MAS_REST = 0;
CS = 0;
txd_8bit(0x00);//CFR1控制字地址
for(m = 0; m < 4; m ++)
txd_8bit(cfr1[m]);
CS = 1;
for(k = 0; k < 10; k ++)
;
CS = 0;
txd_8bit(0x01);//CFR2控制字
for(m = 0; m < 4; m ++)
txd_8bit(cfr2[m]);
CS =1;
for(k = 0; k < 10; k ++)
;
CS = 0;
txd_8bit(0x02);//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发送频率值程序===========================
void txfrc(void)
{
uchar m,k;
CS = 0;
txd_8bit(0x0e);
for(m = 0; m < 8; m ++)
txd_8bit(profile0[m]);
CS = 1;
for(k = 0; k < 10; k ++);
UP_DAT = 1;
for(k = 0; k < 10; k ++);
UP_DAT = 0;
delay_ms(1);
}
//============================================================
//======================计算频偏字,频率字和发送程序===================
void Freq_convert(ulong Freq)
{
ulong temp;
if(Freq > 400_000_000)//400M
Freq = 400000000;
Temp = (ulong)Freq *4.294967296;//FTW = freq *(2^32/1G),1G是输入时钟
profile0[7] = (uchar)temp;
profile0[6] = (uchar)(temp >> 8);
profile0[5] = (uchar)(temp >> 16);
profile0[4] = (uchar)(temp >> 24);
txfrc();
}
//==========================================================================
//=========================计算幅度字和发送程序===================================
void write_Amplitude(uint Amp)
{
ulong temp;
tmep = (ulong)Amp * 25.20615385;//将输入幅度因子分为两个字节,25.20615385 = 2^14/650;
if(temp > 3fff)
temp = 0x3fff;
temp &= 0x3fff;
profile0[1] = (uchar)Temp;
profile0[0] = (uchar)(temp >> 8);
txfrc();
}
//=============================================================================
//==========================ad9910发送DRG参数程序==================================
void txdrg(void )
{
uchar m ,k;
CS = 0;
txd_8bit(0x0b);发送数字斜坡限制地址0x0b;
for(m = 0; m < 8; m ++)
txd_8bit(drgparameter[m]);
CS = 1;
for(k = 0; k < 10; k ++);
CS = 0;
txd_8bit(0x0c);//发送数字斜坡步长地址0x0c
for(m = 0 ; m < 16; m ++)
txd_8bit(drgparameter[m]);
CS =1;
for(k = 0; k < 10; k ++);
CS = 0;
txd_8bit(0x0d);//发送数字斜坡速率地址0x0d
for(m = 0; 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);
}
//====================================================================
//=========================扫频波参数设置和发送程序==========================
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)SweetMaxFre * 4.294967296;
if(SweepStepFre > 400000000)
SweepStepFre = 400000000;
ITemp3 = (ulong)SweepStepFre * 4.294967296;
DTemp3 = ITemp3;
ITemp4 = (ulong)SweepTime * 250;//250 = 1000MHz / 4;单位us 为什么除以4?DDS时钟位1/4Fer t = 4p/freq;p是步进间隔
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[11] = (uchar) (DTemp3 >> 16);
drgparameter[10] = (uchar) (DTemp3 >> 24);
//步进时间间隔(单位:us)
drgparameter[19] = (uchar)ITemp4;
drgparameter[18] = (uchar)(ITemp4 >> 8);
drgparameter[17] = (uchar)(DTemp4);
drgparameter[16] = (uchar)(DTemp4 >> 8);
//发送DGR参数
Txdrg();
//=============================================================================
}
//====================================================================
AD9910 MAIN函数
//=====================================================================
#include 'pbdata.h'
void RCC_Configuration(void);
//void GPIO_Configuration(void);
extern uchar cfr2[4];//cfr2控制字
int main(void)
{
RCC_Configuration();//系统时钟初始化
//GPIO_Configuration();//端口时钟初始化
delay_init(72);
Init_ad9910();
//初始状态:100hz,vpp=100mV
Freq_convert(300000000);//写频率,输入范围1 ~400 000 000hz
Write_Amplitude(150);//写幅度,幅度范围 1~650mV
while(1)
{
if(PAin(0) == 0)
{
delay_ms(5);
cfr2[1] = 0x00;//DRG 失能
Init_ad9910();
Write_Amplitude(100)//写幅度,幅度范围1~650mV
Freq_convert(300000000);//写频率,输入范围1~400000000hz
}
// if(PAin(8) == 0)
// {
// delay_ms(5);
// cfr2[1] = 0x0e;//DRG使能
// Init_ad9910();
// Write_Amplitude(500);x写幅度,幅度范围1~650mv
// //扫频波下限频率,上限频率,频率步进(单位hz),步进时间间隔(单位us)
// SweepFre(1000,100000,10,240);//步进时间范围1~262us
// }
}
}
void RCC_Configuration(void)
{
SystemInit();
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能APB2外设(GPIOB)时钟
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_PIN = GP

余淏
- 粉丝: 68
最新资源
- 基于Eggjs框架构建的Tron区块链游戏后端系统_集成智能合约交互与用户管理功能_通过RESTfulAPI提供游戏逻辑处理与链上操作服务_支持用户注册登录资产查询交易记录与游.zip
- DbflowApp项目极简说明_基于DBFlow424的Android数据库操作框架_提供高效ORM功能与多数据库支持_通过注解处理器实现快速数据操作_包含增删改查封装_异步与.zip
- 基于React前端与Koa2后端构建的登录注册系统_实现用户名实时异步验证与密码安全校验功能_通过MongoDB数据库存储用户信息并采用Fetch进行前后端数据交互_用于快速搭建具.zip
- 基于深度Q网络强化学习算法的相变储能系统优化控制模型_相变材料热管理_储能效率提升_智能决策框架_动态环境适应_多目标优化_实时调控策略_能源管理系统_数据驱动控制_强化学习训练_.zip
- 在 Bob App 插件中调用 Yi 大模型 API 的相关说明 在 Bob 应用插件里使用 Yi 大模型 API 的方法介绍 关于 Bob App 插件中 Yi 大模型 API 的使用指南 如何在
- comment_ef47114f12000b15a684f08d51bed9b6.png
- 基于 YouTube、B 站等平台及网页,用零一万物或 Ollama 本地模型构建可自定义输出格式的高质量大语言模型训练数据集
- FT-Data Ranker:大语言模型微调数据处理竞赛(1B 模型赛道与 7B 模型赛道)
- 丫丫是以Moss作为基座模型,使用LoRA技术进行指令微调的尝试 由黄泓森,陈启源 @ 华中师范大学 主要完成 同时他也是骆驼开源中文大模型的一个子项目
- 易语言大漠插件中英模块7.2424
- 深入理解比特与码元的关系
- comfyui的InternVL2插件,InternVL2是当前不错的开源多模态大语言模型,在文档vqa上表现很好
- comfyui的InternVL2插件,InternVL2是当前不错的开源多模态大语言模型,在文档vqa上表现很好
- 适用于视觉丰富文档的大模型 RAG 系统
- 南京师范大学大学生创新训练计划项目:大模型与知识图谱(LLM meet KG)
- 专门用于视觉丰富文档(VRDs)的大模型RAG系统
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



- 1
- 2
前往页