DDS信号发生器(stm32+ad9850)

硬件

正点原子精英板、ad9850、杜邦线
请添加图片描述

软件

/********************************************
函数名称:AD9850_Delay
功    能:AD9850延时函数
参    数:z - 延时长度
返回值  :无
*********************************************/
void AD9850_Delay(unsigned int z)
{
    for(;z>0;z--)
    {;}
}

/*--------------------并行模式-----------------------*/
#ifdef MODE_PARALLEL   
/********************************************
函数名称:AD9850_Reset_Parallel
功    能:在并行模式下复位AD9850
参    数:无
返回值  :无
*********************************************/
void AD9850_Reset_Parallel(void)
{
    AD9850_WCLK_CLR ;
    AD9850_FQUD_CLR ;
    //RST信号
    AD9850_RST_CLR ;
    AD9850_RST_SET ;
    AD9850_Delay(0xFFFF) ;
    AD9850_RST_CLR ;
}

/********************************************
函数名称:AD9850_Write_Parallel
功    能:在并行模式下写AD9850寄存器
参    数:W0 - W0寄存器的值
          freq - 频率值
返回值  :无
*********************************************/
void AD9850_Write_Parallel(unsigned char W0,unsigned long freq)//W0是用来设置相位的
{
    unsigned char wdata ;//写入数据(一次8位)
        unsigned long  y ;
			y=4294967296.0/125;//4294967296是2的32次方
			y*=(((float)freq)/1000000); //y(频率控制字)的计算公式:y = (freq * 4294967296)/125M
	
    wdata=W0 ;  //写w0
    GPIO_Write(AD9850_DATA_PORT ,wdata) ;   
		AD9850_WCLK_SET ;  
		AD9850_WCLK_CLR ;
		delay_ms(1);
    
    wdata=y>>24 ;  //写w1(从高位开始写入)
    GPIO_Write(AD9850_DATA_PORT ,wdata) ; 
		AD9850_WCLK_SET ;  
		AD9850_WCLK_CLR ;
	 
    	delay_ms(1);
    wdata=y>>16 ;  //写w2
    GPIO_Write(AD9850_DATA_PORT ,wdata) ;
		AD9850_WCLK_SET;
    AD9850_WCLK_CLR ;
		
    	delay_ms(1);
    wdata=y>>8 ;  //写w3
    GPIO_Write(AD9850_DATA_PORT ,wdata) ;
		AD9850_WCLK_SET;
		AD9850_WCLK_CLR ;
		
    	delay_ms(1);
    wdata=y>>0 ;  //写w4
		GPIO_Write(AD9850_DATA_PORT ,wdata) ;  
		AD9850_WCLK_SET;		
    AD9850_WCLK_CLR ;
	
    	delay_ms(1);
		 AD9850_FQUD_SET ;   //移入使能
    AD9850_Delay(0xFFFF) ;
		AD9850_FQUD_CLR ;  
   
}
#endif /* MODE_PARALLEL */
/*------------------------并行模式-------------------------*/
/*---------------------------------------------------------*/

/*------------------------串行模式-------------------------*/
#ifdef MODE_SEIAL
/********************************************
函数名称:AD9850_Reset_Sreial
功    能:在串行模式下复位AD9850
参    数:无
返回值  :无
*********************************************/
/********************************************
函数名称:AD9850_Write_Serial
功    能:在串行模式下写AD9850寄存器
参    数:W0 - W0寄存器的值
          freq - 频率值
返回值  :无
*********************************************/
void AD9850_Write_Serial(unsigned char W0,unsigned long freq)
{
    unsigned char i,wdata ;
     unsigned long  y ;
	y=4294967296.0/125;
	y*=(((float)freq)/1000000);
	    
    wdata = y>>0 ;   //写w4
	    AD9850_WCLK_CLR ;
    AD9850_FQUD_CLR ;
    //RST信号
    AD9850_RST_CLR ;
    AD9850_RST_SET ;
//    AD9850_Delay(0xFFFF) ;
	delay_ms(3);
    AD9850_RST_CLR ;
    //WCLK信号
    AD9850_WCLK_CLR ;
    AD9850_WCLK_SET ;
//    AD9850_Delay(0xFFFF) ;
	delay_ms(3);
    AD9850_WCLK_CLR ;
    //FQUD信号
    AD9850_FQUD_CLR ;
    AD9850_FQUD_SET ;
//    AD9850_Delay(0xFFFF) ;
	delay_ms(3);
    AD9850_FQUD_CLR ;
    for(i=0 ;i<8 ;i++)
    {
        if(wdata & 0x01)
          AD9850_DATA_Write_1 ;
        else
          AD9850_DATA_Write_0 ;
        AD9850_WCLK_SET ;
        wdata >>= 1 ;
        AD9850_WCLK_CLR ;
    }
    wdata = y>>8 ;  //写w3
     for(i=0 ;i<8 ;i++)
    {
        if(wdata & 0x01)
          AD9850_DATA_Write_1 ;
        else
          AD9850_DATA_Write_0 ;
        AD9850_WCLK_SET ;
        wdata >>= 1 ;
        AD9850_WCLK_CLR ;
    }
    wdata = y>>16 ;  //写w2
     for(i=0 ;i<8 ;i++)
    {
        if(wdata & 0x01)
          AD9850_DATA_Write_1 ;
        else
          AD9850_DATA_Write_0 ;
        AD9850_WCLK_SET ;
        wdata >>= 1 ;
        AD9850_WCLK_CLR ;
    }
    wdata = y>>24 ;  //写w1
     for(i=0 ;i<8 ;i++)
    {
        if(wdata & 0x01)
          AD9850_DATA_Write_1 ;
        else
          AD9850_DATA_Write_0 ;
        AD9850_WCLK_SET ;
        wdata >>= 1 ;
        AD9850_WCLK_CLR ;
    }
    wdata = W0 ;  //写w0
     for(i=0 ;i<8 ;i++)
    {
        if(wdata & 0x01)
          AD9850_DATA_Write_1 ;
        else
          AD9850_DATA_Write_0 ;
        AD9850_WCLK_SET ;
        wdata >>= 1 ;
        AD9850_WCLK_CLR ;
    }
    
    AD9850_FQUD_SET ;  //移入使能
//    AD9850_Delay(0xFFFF) ;
    AD9850_FQUD_CLR ;
}
#endif /* MODE_SERIAL */

/*------------------------串行模式-------------------------*/
/*---------------------------------------------------------*/

/********************************************
函数名称:Init_AD9834(主要是初始化GPIO)
功    能:初始化AD9834
参    数:无
返回值  :无
*********************************************/
void Init_AD9850(void)
{
#ifdef MODE_SEIAL   //串行模式
    GPIO_InitTypeDef GPIO_InitStructure ;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
    GPIO_InitStructure.GPIO_Pin = AD9850_WCLK | AD9850_FQUD | AD9850_RST | AD9850_DATA ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(AD9850_CONTROL_PORT ,&GPIO_InitStructure) ;
    
#endif
    
#ifdef MODE_PARALLEL //并行模式
	
    GPIO_InitTypeDef GPIO_InitStructure ;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO , ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);//?
    GPIO_InitStructure.GPIO_Pin = AD9850_WCLK | AD9850_FQUD | AD9850_RST ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
    GPIO_Init(AD9850_CONTROL_PORT ,&GPIO_InitStructure) ;
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All ;//可以
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(AD9850_DATA_PORT ,&GPIO_InitStructure);
    
    AD9850_Reset_Parallel() ;//并行模式下复位AD9850
#endif
    
}

效果

在这里插入图片描述
在这里插入图片描述

程序链接

https://download.youkuaiyun.com/download/qq_45974939/87672298

<think>好的,用户现在在Windows系统下想要安装unsloth命令,我得仔细看看他们提供的引用内容,尤其是关于Windows安装的部分。首先,引用[4]提到在Windows环境下使用conda来配置unsloth,这可能是一个关键的参考点。用户之前可能已经尝试过其他方法,但遇到了问题,所以需要明确的步骤指导。 首先,我需要确认用户是否已经安装了conda。如果没有,可能需要指导他们安装Miniconda或者Anaconda。不过根据引用[4],步骤里已经包含了创建虚拟环境的部分,所以可能用户已经有conda了。接下来,按照引用中的步骤,创建名为unsloth_env的虚拟环境,指定Python 3.11版本。 然后安装PyTorch和相关库。这里需要注意版本匹配问题,比如PyTorch 2.4.0对应CUDA 12.1,用户需要确认自己的显卡是否支持CUDA 12.1。如果用户的CUDA版本不同,可能需要调整PyTorch的版本,但根据引用中的建议,必须严格匹配版本以避免冲突。所以这一步要详细说明版本号,避免用户安装错误。 接下来是xformers的安装,这里特别指出要安装特定版本0.0.27.post2,而不是直接使用默认版本,因为后者可能会自动升级PyTorch,导致版本不兼容。用户可能需要使用pip安装指定版本,同时建议用--dry-run检查是否有依赖冲突,这样可以提前发现问题。 然后安装unsloth本身,使用pip从GitHub仓库直接安装,可能遇到网络问题,比如443错误。这时候需要配置Git的代理,用户可能需要知道如何设置代理,特别是如果他们位于网络受限的环境中。引用[4]提到了设置git的http和https代理,这里需要提醒用户替换成自己的代理端口,并验证配置是否正确。 安装完成后,验证步骤很重要。用户可能需要运行简单的Python代码来检查unsloth是否成功导入,以及CUDA是否可用。这部分需要给出具体的代码示例,让用户可以复制粘贴测试。 此外,用户可能会遇到常见问题,比如网络问题导致安装失败,或者版本冲突。需要提前列出这些可能出现的问题及解决方法,比如检查代理设置,确认版本是否正确,或者重新创建虚拟环境等。 最后,根据用户的问题,生成相关问题,可能包括如何验证安装是否正确,如何处理安装中的错误,或者如何在Mac或Linux上安装unsloth,但根据当前问题,应集中在Windows相关的问题上。同时,引用中的其他信息如Mac的支持情况可能作为相关问题,但用户当前主要关注Windows,所以相关问题应围绕Windows安装展开。</think>### 分步指南:在 Windows 系统中安装 unsloth 命令 #### 步骤 1:创建 Conda 虚拟环境 ```bash conda create --name unsloth_env python=3.11 conda activate unsloth_env ``` > *注意:若未安装 Conda,需先安装 [Miniconda](https://docs.conda.io/en/latest/miniconda.html)* #### 步骤 2:安装 PyTorch 与 CUDA 工具包 ```bash conda install pytorch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 pytorch-cuda=12.1 -c pytorch -c nvidia ``` > *关键版本要求:PyTorch 2.4.0 必须与 CUDA 12.1 严格匹配[^4]* #### 步骤 3:安装 xformers(指定版本) ```bash pip install xformers==0.0.27.post2 ``` > *警告:直接`pip install xformers`可能自动升级 PyTorch 导致版本冲突,建议先用`pip install --dry-run`检查依赖关系* #### 步骤 4:安装 unsloth 核心组件 ```bash pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git" pip install --no-deps trl peft accelerate bitsandbytes ``` > *若出现网络错误 443,需配置 Git 代理:* > ```bash > git config --global http.proxy http://127.0.0.1:你的端口 > git config --global https.proxy http://127.0.0.1:你的端口 > ``` #### 验证安装 ```python import torch from unsloth import FastLanguageModel print(torch.cuda.is_available()) # 应输出 True ``` #### 常见问题解决 | 问题现象 | 解决方案 | |---------|---------| | 安装时提示版本冲突 | 重建虚拟环境并严格按版本安装[^4] | | Git 克隆超时 | 检查代理设置或尝试镜像源 | | CUDA 不可用 | 确认显卡驱动支持 CUDA 12.1 |
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月牙 ,呐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值