第十五章 DAC (下篇)

第十五章 DAC (下篇)

目录

第十五章 DAC (下篇)

1 程序设计

1.1 DAC_OutDMASineWave例程

1.2 DAC_OutNoiseWave例程

1.3 DAC_OutTriangleWave例程

2 下载验证

1.1 DAC_OutDMASineWave例程

1.2 DAC_OutNoiseWave例程

1.3 DAC_OutTriangleWave例程


1 程序设计

1.1 DAC_OutDMASineWave例程

此例程的主要功能是借助 W55MH32 的 DAC(数模转换器)输出软件正弦波,并且通过串口输出系统时钟信息。下面是其主要工作流程:

1.初始化配置

  • 使能系统时钟,配置串口(波特率 115200)输出调试信息。
  • 初始化 GPIO、DAC(通道 1/2)、定时器 TIM2(周期 为20个时钟周期)及 DMA(循环模式)。

2.正弦波生成

void DMA_Configuration(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    // 使能DMA2时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

    // 配置DMA通道4(DAC2)
    DMA_InitStructure.DMA_PeripheralBaseAddr = DAC2_DHR12RD_ADDRESS; // DAC2寄存器地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&DualSine12bit; // 数据源:双通道数据数组
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; // 内存到外设
    DMA_InitStructure.DMA_BufferSize = POINT_NUM; // 传输32点
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 循环模式,持续输出
    DMA_Init(DMA2_Channel4, &DMA_InitStructure);
    DMA_Cmd(DMA2_Channel4, ENABLE);

    // 配置DMA通道3(DAC1,参数与通道4相同)
    DMA_InitStructure.DMA_PeripheralBaseAddr = DAC1_DHR12RD_ADDRESS;
    DMA_Init(DMA2_Channel3, &DMA_InitStructure);
    DMA_Cmd(DMA2_Channel3, ENABLE);
}
  • 通过 12 位正弦波数据数组Sine12bit(32 点),生成双通道 DAC 数据DualSine12bit。

3.工作流程

  • TIM2 以设定周期触发 DMA,将正弦波数据循环传输至 DAC,驱动模拟输出。
  • 主循环保持运行,实现连续波形输出。

4.调试功能

  • 串口输出系统各时钟频率,便于调试。

1.2 DAC_OutNoiseWave例程

这个例程的主要作用是利用 W55MH32 的 DAC(数模转换器)输出噪声波信号,同时通过串口输出系统时钟信息以方便调试。以下是具体作用的详细阐述:

1. 系统初始化与信息输出

  • 时钟与延时初始化:开启 CRC 时钟,进行延时初始化,为后续操作提供时钟基础。
  • 串口通信配置:将串口波特率设置为 115200,对 GPIO 和 USART 进行初始化,实现串口通信功能。
  • 时钟信息输出:获取系统时钟频率,把系统时钟、HCLK、PCLK1、PCLK2 和 ADCCLK 的频率信息通过串口输出,方便开发人员了解系统时钟状态。

2.噪声波信号输出

// GPIO配置函数(DAC输出引脚)
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIOA时钟(DAC通道1/2对应PA4/PA5)
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 配置PA4和PA5为模拟输入模式(内部连接DAC输出)
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_4 | GPIO_Pin_5;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AIN; // 模拟输入模式(无需上拉/下拉)
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

// DAC配置函数(噪声波模式)
void DAC_Configuration(void)
{
    DAC_InitTypeDef DAC_InitStructure;

    // 使能DAC时钟(APB1总线)
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);

    // 配置DAC通道1和2为噪声波模式
    DAC_InitStructure.DAC_Trigger                      = DAC_Trigger_Software; // 软件触发(非自动触发)
    DAC_InitStructure.DAC_WaveGeneration               = DAC_WaveGeneration_Noise; // 启用噪声波生成
    DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_4095; // 噪声波幅度(全范围)
    DAC_InitStructure.DAC_OutputBuffer                 = DAC_OutputBuffer_Enable; // 使能输出缓冲(提高驱动能力)

    // 初始化DAC通道1和2
    DAC_Init(DAC_Channel_1, &DAC_InitStructure);
    DAC_Init(DAC_Channel_2, &DAC_InitStructure);

    // 使能DAC通道
    DAC_Cmd(DAC_Channel_1, ENABLE);
    DAC_Cmd(DAC_Channel_2, ENABLE);

    // 设置初始输出数据(12位左对齐,值为0x7FF0,即32784/4096=8.0V?需根据参考电压调整)
    DAC_SetChannel1Data(DAC_Align_12b_L, 0x7FF0); // 通道1初始值
    DAC_SetChannel2Data(DAC_Align_12b_L, 0x7FF0); // 通道2初始值
}
  • GPIO 配置:使能 GPIOA 时钟,把 PA4 和 PA5 引脚配置成模拟输入模式,作为 DAC 的输出引脚。
  • DAC 配置:使能 DAC 时钟,将 DAC 通道 1 和通道 2 配置成软件触发模式,并且设置为噪声波生成模式。同时,开启输出缓冲,把初始数据设置为 0x7FF0。
  • 噪声波输出:在主循环里,持续对 DAC 通道 1 和通道 2 进行软件触发,从而让 PA4 和 PA5 引脚持续输出模拟的噪声波信号。

3. 输出重定向

  • 实现SER_PutChar和fputc函数,把printf函数的输出重定向到串口,方便开发人员通过串口输出调试信息。

综上所述,该例程可用于测试和验证 W55MH32 的 DAC 模块输出噪声波的功能,也可作为开发基于 DAC 输出噪声波应用的基础代码。

1.3 DAC_OutTriangleWave例程

该例程通过初始化系统时钟、串口、GPIO和DAC,利用软件触发DAC生成并输出双通道三角波信号,同时将系统时钟信息通过串口输出,用于验证DAC功能和作为信号源开发基础。以下是具体作用的详细阐述:

1.初始化配置

  • 使能系统时钟并配置串口(波特率 115200)输出系统时钟频率(SYSCLK/HCLK/PCLK1/PCLK2/ADCCLK)。
  • 初始化 GPIOA 的 PA4/PA5 为模拟输入模式,作为 DAC 输出引脚。

2.三角波生成配置

// DAC配置函数:启用硬件三角波生成
void DAC_Configuration(void)
{
    DAC_InitTypeDef DAC_InitStructure;
    // 使能DAC时钟(APB1总线)
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
    
    // 配置DAC为软件触发模式,启用三角波生成
    DAC_InitStructure.DAC_Trigger = DAC_Trigger_Software; // 软件触发(需手动调用触发函数)
    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_Triangle; // 三角波模式
    DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_TriangleAmplitude_2047; // 幅度设置为2047(半满量程,12位)
    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable; // 使能输出缓冲(增强驱动能力)
    
    // 初始化DAC通道1和2
    DAC_Init(DAC_Channel_1, &DAC_InitStructure);
    DAC_Init(DAC_Channel_2, &DAC_InitStructure);
    
    // 使能DAC通道
    DAC_Cmd(DAC_Channel_1, ENABLE);
    DAC_Cmd(DAC_Channel_2, ENABLE);
    
    // 设置初始数据为0(三角波起点)
    DAC_SetChannel1Data(DAC_Align_12b_L, 0); // 12位左对齐,值为0
    DAC_SetChannel2Data(DAC_Align_12b_L, 0);
}
  • DAC 配置为软件触发模式,启用硬件三角波生成功能。
  • 设置三角波幅度为 2047(12 位半满量程,对应约 1.65V 峰峰值),输出缓冲使能。
  • 初始通道数据设为 0,作为波形起点。

3.工作流程

int main(void)
{
    // ...(初始化代码略)...
    
    printf("DAC Out Triangle Wave Test.\n"); // 打印测试提示
    
    while (1)
    {
        // 软件触发DAC通道1和2转换(生成三角波)
        DAC_SoftwareTriggerCmd(DAC_Channel_1, ENABLE);
        DAC_SoftwareTriggerCmd(DAC_Channel_2, ENABLE);
        
        // 循环触发,频率由主循环速度决定(需结合延时调整,当前为无延时快速触发)
    }
}
  • 主循环无限触发 DAC 软件转换,PA4/PA5 引脚输出连续三角波信号(0→2047→0 循环)。
  • 三角波频率由软件触发速率决定,需通过示波器观察波形。

4.调试功能

  • 串口输出系统时钟信息,便于验证硬件配置。

2 下载验证

1.1 DAC_OutDMASineWave例程

程序运行后,首先会通过串口输出系统时钟相关频率信息,告知用户SYSCLK、HCLK、PCLK1、PCLK2和ADCCLK的频率,同时提示“DAC Out Software Sine Wave Test.”信息:

接着,GPIO、DAC、定时器和DMA完成配置,定时器TIM2按照设定的周期触发,借助DMA将正弦波数据循环传输到DAC通道1和通道2,使PA4和PA5引脚持续输出模拟的正弦波信号,之后程序进入无限循环以维持正弦波的稳定输出:

1.2 DAC_OutNoiseWave例程

程序运行后,首先通过串口输出系统各时钟频率信息(如SYSCLK、HCLK等),并提示“DAC Out Noise Wave Test.”:

随后,PA4和PA5引脚持续输出由DAC内部LFSR生成的12位随机噪声波信号,电压值在0-3.3V范围内无规律波动。主循环通过软件触发DAC连续转换,保持波形输出,需通过示波器观察模拟信号变化:

1.3 DAC_OutTriangleWave例程

程序运行后,首先通过串口输出系统时钟频率信息,包SYSCLK、HCLK、PCLK1、PCLK2和ADCCLK的频率,同时提示进行DAC输出三角波测试:

之后,GPIO和DAC完成配置,主循环中持续对DAC通道1和通道2进行软件触发,使得PA4和PA5引脚持续输出模拟三角波信号,该信号幅度为2047(对应12位),并以初始值0为起点进行周期性的上升和下降变化,可使用示波器观察到该连续稳定的三角波波形:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值