stm32f407控制AD9833输出正弦波/三角波(hal库)

 一、开发环境

硬件:STM32F407 核心开发板

单片机:STM32F407ZGT6

Keil版本:5.24.2.0

STM32CubeMX版本:6.12.0

 二、配置CubeMX

1. 选择时钟源

2. 配置时钟

​3. 使能Debug功能:Serial Wire

4. HAL库时基选择:SysTick

5. GPIO配置:如图(只用到了PC0、PC1、PC2,其他的不用管)。

6. 配置工程参数:在Project标签页中,配置项目名称和位置,选择工具链MDK-ARM。

7. 生成代码:在Code Generator标签页中,配置工程外设文件与HAL库,勾选头文件.c和.h文件分开,然后点击Project > Generate Code生成代码。

三、代码实现与部署

1. 添加 AD9833.c 和 AD9833.h 文件

AD9833.c

/*************************************************************************************
 Title	:   Analog Devices AD9833 DDS Wave Generator Library for STM32 Using HAL Libraries
 Author:    Bardia Alikhan Afshar <bardia.a.afshar@gmail.com>  
 Software:  IAR Embedded Workbench for ARM
 Hardware:  Any STM32 device
*************************************************************************************/
#include "AD9833.h"
// ------------------- Variables ----------------
uint16_t FRQLW = 0;    // MSB of Frequency Tuning Word
uint16_t FRQHW = 0;    // LSB of Frequency Tuning Word
uint32_t  phaseVal=0;  // Phase Tuning Value
uint8_t WKNOWN=0;      // Flag Variable
// -------------------------------- Functions --------------------------------
// ------------------------------------------------ Software SPI Function
void writeSPI(uint16_t word,AD9833_Typedef AD9833) {
	for (uint8_t i = 0; i < 16 ; i++) {
          if(word & 0x8000) HAL_GPIO_WritePin(AD9833.PORT,AD9833.DATA,GPIO_PIN_SET);   //bit=1, Set High
		else HAL_GPIO_WritePin(AD9833.PORT,AD9833.DATA,GPIO_PIN_RESET);        //bit=0, Set Low
		ASM_NOP();
		HAL_GPIO_WritePin(AD9833.PORT,AD9833.SCK,GPIO_PIN_RESET);             //Data is valid on falling edge
		ASM_NOP();
		HAL_GPIO_WritePin(AD9833.PORT,AD9833.SCK,GPIO_PIN_SET);
		word = word<<1; //Shift left by 1 bit
        }
	HAL_GPIO_WritePin(AD9833.PORT,AD9833.DATA,GPIO_PIN_RESET);                    //Idle low
	ASM_NOP();
}

// ------------------------------------------------ Sets Output Wave Type
void AD9833_SetWave(uint16_t Wave,AD9833_Typedef AD9833){
  switch(Wave){
  case 0:
  HAL_GPIO_WritePin(AD9833.PORT,AD9833.SS,GPIO_PIN_RESET);
    writeSPI(0x2000,AD9833); // Value for Sinusoidal Wave
    HAL_GPIO_WritePin(AD9833.PORT,AD9833.SS,GPIO_PIN_SET);
    WKNOWN=0;
    break;
  case 1:
     HAL_GPIO_WritePin(AD9833.PORT,AD9833.SS,GPIO_PIN_RESET);
    writeSPI(0x2028,AD9833); // Value for Square Wave
    HAL_GPIO_WritePin(AD9833.PORT,AD9833.SS,GPIO_PIN_SET);
    WKNOWN=1;
    break;
  case 2:
        HAL_GPIO_WritePin(AD9833.PORT,AD9833.SS,GPIO_PIN_RESET);
    writeSPI(0x2002,AD9833); // Value for Triangle Wave
    HAL_GPIO_WritePin(AD9833.PORT,AD9833.SS,GPIO_PIN_SET);
    WKNOWN=2;
    break;
  default:
    break;
  }
}

// ------------------------------------------------ Sets Wave Frequency & Phase (In Degree) In PHASE0 & FREQ0 Registers
void AD9833_SetWaveData(float Frequency,float Phase,AD9833_Typedef AD9833){
ASM_NOP();
 // ---------- Tuning Word for Phase ( 0 - 360 Degree )
 if(Phase<0)Phase=0; // Changing Phase Value to Positive
 if(Phase>360)Phase=360; // Maximum value For Phase (In Degree)
 phaseVal  = ((int)(Phase*(4096/360)))|0XC000;  // 4096/360 = 11.37 change per Degree for Register And using 0xC000 which is Phase 0 Register Address
 
 // ---------- Tuning word for Frequency      
long freq=0;
freq=(int)(((Frequency*pow(2,28))/FMCLK)+1); // Tuning Word
FRQHW=(int)((freq & 0xFFFC000) >> 14); // FREQ MSB
FRQLW=(int)(freq & 0x3FFF);  // FREQ LSB 
FRQLW |= 0x4000;
FRQHW |= 0x4000; 
 // ------------------------------------------------ Writing DATA
 HAL_GPIO_WritePin(AD9833.PORT,AD9833.DATA,GPIO_PIN_SET);
HAL_GPIO_WritePin(AD9833.PORT,AD9833.SCK,GPIO_PIN_SET);
HAL_GPIO_WritePin(AD9833.PORT,AD9833.SS,GPIO_PIN_SET);  
 HAL_GPIO_WritePin(AD9833.PORT,AD9833.SS,GPIO_PIN_RESET); //low = selected
	ASM_NOP();
	writeSPI(0x2100,AD9833); // enable 16bit words and set reset bit
	writeSPI(FRQLW,AD9833);
	writeSPI(FRQHW,AD9833);
  writeSPI(phaseVal,AD9833);
	writeSPI(0x2000,AD9833); // clear reset bit 
	ASM_NOP();
	HAL_GPIO_WritePin(AD9833.PORT,AD9833.SS,GPIO_PIN_SET); //high = deselected 
AD9833_SetWave(WKNOWN,AD9833);
ASM_NOP();
return;
}

AD9833.h

/*************************************************************************************
 Title	:   Analog Devices AD9833 DDS Wave Generator Library for STM32 Using HAL Libraries
 Author:    Bardia Alikhan Afshar <bardia.a.afshar@gmail.com>  
 Software:  IAR Embedded Workbench for ARM
 Hardware:  Any STM32 device
*************************************************************************************/
#ifndef _AD_9833_H
#define _AD_9833_H
#include <math.h>
#include "stm32f4xx_hal.h"

// ------------------------- Defines -------------------------
#define FMCLK 25000000        // Master Clock On AD9833
#define ASM_NOP() HAL_Delay(1)  // Assembly NOPE (Little Delay)

typedef struct
{
    GPIO_TypeDef * PORT;
    uint16_t DATA;
    uint16_t SCK;
    uint16_t SS;
}AD9833_Typedef;


enum WaveType{SIN, SQR, TRI}; // Wave Selection Enum

// ------------------ Functions  ---------------------
void AD9833_SetWave(uint16_t Wave,AD9833_Typedef AD9833);                           // Sets Output Wave Type
void AD9833_SetWaveData(float Frequency,float Phase,AD9833_Typedef AD9833);         // Sets Wave Frequency & Phase
#endif

2. 添加 AD9833_Setup.c 和 AD9833_Setup.h 文件

AD9833_Setup.c

#include "AD9833_Setup.h"

void AD9833_Init(AD9833_Typedef AD9833)
{
    // AD9833 Pin configuration
    AD9833.PORT = GPIOC;
    AD9833.DATA = GPIO_PIN_0;
    AD9833.SCK = GPIO_PIN_1;
    AD9833.SS = GPIO_PIN_2;

    // Set all AD9833 pin to High
    HAL_GPIO_WritePin(AD9833.PORT, AD9833.DATA, GPIO_PIN_SET);
    HAL_GPIO_WritePin(AD9833.PORT, AD9833.SCK, GPIO_PIN_SET);
    HAL_GPIO_WritePin(AD9833.PORT, AD9833.SS, GPIO_PIN_SET);

    // Set default frequecy which is employeed by AD9833
    AD9833_SetWave(SIN, AD9833);          // Type Of Wave
	AD9833_SetWaveData(11000, 2, AD9833); // Frequency & Phase Set
 
    return;
}

AD9833_Setup.h

#ifndef __AD9833_Setup_H__
#define __AD9833_Setup_H__

#include "AD9833.h"

// Initialing AD9833
void AD9833_Init(AD9833_Typedef AD9833);

#endif

3. main.c增加代码:添加头文件 #include "AD9833.h"    #include "AD9833_Setup.h",然后就可以调用函数输出波形啦。

#include "AD9833.h"
#include "AD9833_Setup.h"


 /* USER CODE BEGIN 2 */
  AD9833_Typedef AD9833_1;
  AD9833_Init(AD9833_1);
  /* USER CODE END 2 */


    /* USER CODE BEGIN WHILE */
	AD9833_SetWave(SIN, AD9833_1);
	AD9833_SetWaveData(20000, 2, AD9833_1);
    HAL_Delay(5000);
    /* USER CODE END WHILE */
### 回答1: STM32是一款微控制器,能够与AD9850数字合成信号发生器进行通信,通过编程控制AD9850的输出波形类型,包括正弦波三角波、锯齿波和方波。 正弦波是一种连续变化的波形,它的振幅和频率都是恒定的。在STM32中,通过调节AD9850的相位和频率寄存器,可以实现正弦波的生成。通过适当的控制,可以产生不同频率的正弦波信号。 三角波是一种呈现三角形状的波形,它的变化是线性的,即频率恒定。通过STM32控制AD9850输出波形的斜率和频率,可以生成三角波信号。 锯齿波是一种呈现锯齿状的波形,它的变化是非线性的。在STM32中,通过控制AD9850的增减相位和频率,可以生成锯齿波信号。 方波是一种呈现方形状的波形,其周期的50%时间内信号为高电平,其余50%时间内信号为低电平。STM32通过控制AD9850的频率和脉宽,可以生成不同频率和占空比的方波信号。 通过控制AD9850的各种参数,我们可以利用STM32生成不同类型的波形信号,并应用于各种工程和科研领域,例如音频信号发生器、测试设备等。 ### 回答2: STM32和AD9850是两个独立的芯片,其中STM32是一款32位的微控制器,而AD9850是一款数字频率合成器。正弦波三角波、锯齿波和方波是AD9850可以生成的几种基本波形。 正弦波是一种连续的、无失真的波形,它的特点是幅度和频率都是连续变化的。在AD9850中,通过设置合适的频率和振幅参数可以生成正弦波三角波是一种具有连续上升和下降斜坡的波形,它的特点是相邻两个峰值之间的频率相等,斜率相等。在AD9850中,可以通过调整相邻两个峰值之间的时间间隔来生成三角波。 锯齿波是一种具有快速上升和缓慢下降的波形,它的特点是频率持续增加。在AD9850中,可以通过调整上升时间和下降时间来生成锯齿波。 方波是一种具有快速上升和下降的垂直边缘的波形,它的特点是频率相对较高,而且占空比可以调整。在AD9850中,可以通过调整占空比和频率参数来生成方波。 通过STM32控制AD9850芯片,可以通过I2C或SPI等通信方式向AD9850写入参数,以生成不同的波形。然后通过AD9850的输出引脚将生成的波形输出到相应的外设或装置中。 ### 回答3: STM32是一种微控制器系列,而AD9850是一种数字信号发生器芯片。我们可以使用STM32和AD9850来生成不同类型的波形,包括正弦波三角波、锯齿波和方波。 对于正弦波,我们可以使用STM32的编程控制AD9850的频率寄存器,可以设置不同的频率值以生成不同频率的正弦波。AD9850芯片会根据频率寄存器的值生成相应频率的正弦波三角波类似于正弦波,只是其波形呈现出一种线性增长再线性减小的形态。在STM32中可以通过逐渐增加再逐渐减小频率值来生成三角波。 锯齿波是一种波形,它的形状类似于锯齿,呈现出逐渐增加再陡峭降低的形态。我们可以通过在STM32中逐步增加然后突然降低频率值来生成锯齿波。 方波是一种由高电平和低电平组成的矩形波形。我们可以在STM32中通过设置频率值来控制AD9850芯片生成相应频率的方波。频率值决定了方波的周期。 总之,STM32和AD9850可以通过编程控制来生成正弦波三角波、锯齿波和方波。通过设置不同的频率值,我们可以产生不同频率和形状的波形,以满足不同应用的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值