手把手教你用Excel生成STM32F103的正弦波数据表(附DAC配置代码)

发布时间:2026/6/7 10:53:25

手把手教你用Excel生成STM32F103的正弦波数据表(附DAC配置代码) 从Excel到嵌入式用STM32F103 DAC生成正弦波的完整实践指南在嵌入式开发中波形生成是一个常见需求而正弦波因其在信号处理、音频合成等领域的广泛应用尤为重要。许多初学者面对如何将数学公式转化为硬件可识别的信号时常常感到无从下手。本文将展示如何通过Excel这一日常工具完成从数学计算到硬件输出的全流程实现。1. 正弦波数据生成的数学基础正弦波的数学表达式为y A * sin(2πft φ) B其中A为振幅f为频率φ为相位B为直流偏移量。在嵌入式系统中我们通常需要将这个连续函数离散化生成一系列采样点。关键参数选择采样点数(N)决定波形的光滑程度通常选择32/64/128等2的幂次方振幅(A)根据DAC量程调整STM32F103的12位DAC满量程为4095偏移量(B)确保所有采样点为正值通常设置为A在Excel中我们可以用以下公式计算第n个采样点的值INT(2047*SIN(2*PI()*n/32)2048)其中2047为振幅32为采样点数2048为偏移量。2. Excel数据生成与可视化实战2.1 构建正弦波数据表在A列输入采样点序号0到31B列使用上述公式计算各点值C列转换为十六进制格式DEC2HEX(B1,3)示例数据表采样点十进制值十六进制02048800122488C8.........3118487382.2 数据可视化验证利用Excel的图表功能绘制折线图可以直观验证生成的数据是否符合正弦规律。这是避免后期硬件调试困扰的重要步骤。提示如果波形出现畸变检查公式中的π值是否准确以及采样点数是否足够。3. STM32F103 DAC配置详解3.1 硬件初始化代码// GPIO配置 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin GPIO_Pin_4; // DAC通道1对应PA4 GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; GPIO_Init(GPIOA, GPIO_InitStructure); // DAC基本配置 DAC_InitTypeDef DAC_InitStructure; DAC_InitStructure.DAC_Trigger DAC_Trigger_None; DAC_InitStructure.DAC_WaveGeneration DAC_WaveGeneration_None; DAC_InitStructure.DAC_OutputBuffer DAC_OutputBuffer_Disable; DAC_Init(DAC_Channel_1, DAC_InitStructure);3.2 定时器触发配置为了实现周期性输出我们需要配置定时器触发DAC转换TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period 71; // 72MHz/(711) 1MHz TIM_TimeBaseStructure.TIM_Prescaler 0; TIM_TimeBaseInit(TIM6, TIM_TimeBaseStructure); TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);4. 数据格式转换与DMA传输4.1 从Excel到C数组将Excel生成的十六进制数据转换为C语言数组格式const uint16_t sine_wave[32] { 0x0800, 0x08C8, 0x0986, 0x0A35, 0x0ACF, 0x0B50, 0x0BB8, 0x0C03, 0x0C30, 0x0C3F, 0x0C30, 0x0C03, 0x0BB8, 0x0B50, 0x0ACF, 0x0A35, 0x0986, 0x08C8, 0x0800, 0x0738, 0x067A, 0x05CB, 0x0531, 0x04B0, 0x0448, 0x03FD, 0x03D0, 0x03C1, 0x03D0, 0x03FD, 0x0448, 0x04B0 };4.2 DMA高效传输配置DMA_InitTypeDef DMA_InitStructure; DMA_InitStructure.DMA_PeripheralBaseAddr (uint32_t)DAC-DHR12R1; DMA_InitStructure.DMA_MemoryBaseAddr (uint32_t)sine_wave; DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize 32; DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode DMA_Mode_Circular; DMA_Init(DMA1_Channel3, DMA_InitStructure);5. 系统集成与调试技巧5.1 完整工作流程定时器触发DMA传输DMA将数组数据搬运到DAC数据寄存器DAC将数字量转换为模拟电压循环执行形成连续波形5.2 常见问题排查波形失真检查采样点数是否足够DAC输出缓冲是否启用频率不准确认定时器时钟配置和预分频值噪声过大添加适当的滤波电路检查电源稳定性性能优化参数对比参数标准配置优化配置影响采样点数3264波形光滑度↑DMA优先级低高时序精度↑输出缓冲禁用启用驱动能力↑噪声↓6. 进阶应用参数动态调整通过引入可变参数我们可以实现波形特性的实时调整void generate_sine_wave(uint16_t *array, uint8_t points, uint16_t amplitude) { for(int i0; ipoints; i) { array[i] amplitude * sin(2*PI*i/points) 2048; } }这种动态生成方式特别适合需要频繁改变波形参数的场景如音频合成器开发。

相关新闻