如何使用STM32F4的DAC生成混合频率正弦波
解决方案
问题根因
你之前修改数组失败的核心原因:当前采用的100个采样点对应10Hz正弦波的1个完整周期,而5Hz正弦波的完整周期需要200个1kHz采样点,直接在100点数组里塞入半个5Hz周期的话,DMA循环播放时会出现相位跳变,无法输出正确的叠加信号。
具体实现步骤
- 第一步:调整采样数组长度为200。10Hz和5Hz的最小公共周期为0.2s(对应5Hz的1个周期、10Hz的2个周期),在1kHz的TRGO触发频率下,需要200个采样点才能覆盖完整公共周期,循环播放无相位断裂。
- 第二步:修改DAC DMA启动参数,将传输长度从100改为200。
- 第三步:修改正弦值生成函数,叠加两个频率的正弦分量,同时做幅值适配避免超出12位DAC的0~4095输出范围。
适配后代码
首先修改DAC启动逻辑:
Appl_getSineVal(); // 第四个参数从原100改为200 HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)Appl_u16SineValue, 200, DAC_ALIGN_12B_R);
同步修改正弦值生成函数,采样数组定义需同步改为uint16_t Appl_u16SineValue[200]:
void Appl_getSineVal(void) { for (uint16_t i=0; i<200; i+=1){ // 10Hz分量:200点内走2个完整周期 float sine10 = sin(i * 2 * PI / 100); // 5Hz分量:200点内走1个完整周期 float sine5 = sin(i * 2 * PI / 200); // 两个分量各占一半幅值,叠加后偏移到0~4095范围,避免削波 Appl_u16SineValue[i] = (uint16_t)((sine10 + sine5) * (4096 / 4) + (4096 / 2)); } }
如果需要调整两个信号的幅值比例,只要修改两个正弦值的系数即可,只要保证叠加后的最大值不超过2、最小值不低于-2,就不会出现失真。比如要10Hz占70%、5Hz占30%,计算式改为(0.7*sine10 + 0.3*sine5) * (4096 / 2) + (4096 / 2)即可。
内容的提问来源于stack exchange,提问作者Vishwesh GM
相关产品推荐
相关产品推荐

