第十五章 DAC (下篇)
目录
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为起点进行周期性的上升和下降变化,可使用示波器观察到该连续稳定的三角波波形: