硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7829|回复: 6
收起左侧

[有问必答] DAC输出正弦波削波问题

[复制链接]

12

主题

147

回帖

183

积分

初级会员

积分
183
发表于 2015-9-25 11:09:15 | 显示全部楼层 |阅读模式
void DAC_Ch2_SineWaveConfig(void)
{
    DAC_InitTypeDef DAC_InitStructure;
    DMA_InitTypeDef DMA_InitStructure;

    /* DAC Periph clock enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
    /* DMA1 clock enable */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);

    DAC_DeInit();
    /* DAC channel2 Configuration */
    DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
    DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
    DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
    DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;
    DAC_Init(DAC_Channel_2, &DAC_InitStructure);

    /* DMA1_Stream6 channel7 configuration */
    DMA_DeInit(DMA1_Stream6);
    DMA_InitStructure.DMA_Channel = DMA_Channel_7;
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(DAC->DHR12R2));
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&Sine12bit;
    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    DMA_InitStructure.DMA_BufferSize = 200;
    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_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    DMA_Init(DMA1_Stream6, &DMA_InitStructure);

    /* Enable DMA1_Stream6 */
    DMA_Cmd(DMA1_Stream6, ENABLE);

    /* Enable DAC Channel2 */
    DAC_Cmd(DAC_Channel_2, ENABLE);

    /* Enable DMA for DAC Channel2 */
    DAC_DMACmd(DAC_Channel_2, ENABLE);
}
如果DAC输出不加内部缓冲,正弦波图形是正常的。虽然阻抗不匹配时输出幅值会小点。但如果加了内部缓冲(设置DAC_OutputBuffer = DAC_OutputBuffer_Enable),当满量程输出时(正弦波波峰为4095,波谷为0,采样200个点)就会出现削波现象。如果不加内部缓冲,采用外部跟随器输出,波形也是正常的。请问这是为什么,因为你们的教程上的波形都很好。
回复

使用道具 举报

760

主题

1052

回帖

3337

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3337
发表于 2015-9-25 14:57:40 | 显示全部楼层
看下是不是2.5V 参考和3.3V参考的差别
回复

使用道具 举报

12

主题

147

回帖

183

积分

初级会员

积分
183
 楼主| 发表于 2015-9-25 16:56:19 | 显示全部楼层

回 armfly 的帖子

armfly:看下是不是2.5V 参考和3.3V参考的差别 (2015-09-25 14:57) 
跟参考电压有关?我目前接的是3.3V
回复

使用道具 举报

12

主题

147

回帖

183

积分

初级会员

积分
183
 楼主| 发表于 2015-9-26 09:13:25 | 显示全部楼层
看了一下datasheet,开启缓冲之后最大输出电压为(VDDA-0.2)V,因为我的VDDA和VREF+几乎一样,均为3.3V,所以输出波形就有削波失真的问题?
回复

使用道具 举报

760

主题

1052

回帖

3337

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3337
发表于 2015-10-6 08:19:15 | 显示全部楼层
死机验证了一下,   DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable; 确实会出现波形波谷和波峰失真问题。不开缓冲,波形很好。几乎可以到满量程看不出失真。
我分析CPU内部缓冲器实际上就是一个模拟运算放大器的电路,这个运放的轨到轨特性指标很差。因此当输出接近0V和参考电压200mV 之内时,就会出现肉眼可识别的失真。
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2015-11-7 19:04:11 | 显示全部楼层
我的使用经验是,大多数情况都要打开缓冲。。。。

如果不打开缓冲,驱动一个100k的电阻都会波形衰减。基本只能用示波器看,而不能接到别的电路上。

打开了缓冲,基本可以驱动一个10k的电阻。如果负载小于10k,还得自己外部另外加一个轨到轨运放才行。
回复

使用道具 举报

3

主题

55

回帖

64

积分

初级会员

积分
64
发表于 2016-12-22 10:14:04 | 显示全部楼层
[s:151]  [s:151]  [s:151]  [s:151]  [s:151]  [s:151]  [s:151]  [s:151]  [s:151]  [s:151]  [s:151]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-16 16:10 , Processed in 0.038223 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表