OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7242|回复: 4

用STM32内置DAC做两路独立输出的信号发生器,谁有好的方案?

[复制链接]

7

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2015-2-10
在线时间
10 小时
发表于 2015-6-19 16:03:52 | 显示全部楼层 |阅读模式
5金钱
用STM32片载DAC做两路独立输出的信号发生器,谁有好的方案?

最佳答案

查看完整内容[请看2#楼]

最好的方案就是 DMA 了。 DAC1输出波形差,可能是超过速度了? 我这样做过:TIM 输出波形,启动 DMA 同时启动外接 DA 芯片;DMA 往 SPI 发数据给外接 DA 芯片。2uS 一个点,效果杠杠的。
STM32还是有搞头的..
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11557
金钱
11557
注册时间
2014-4-1
在线时间
1318 小时
发表于 2015-6-19 16:03:53 | 显示全部楼层
最好的方案就是 DMA 了。

DAC1输出波形差,可能是超过速度了?

我这样做过:TIM 输出波形,启动 DMA 同时启动外接 DA 芯片;DMA 往 SPI 发数据给外接 DA 芯片。2uS 一个点,效果杠杠的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-19 23:48:40 | 显示全部楼层
先试试不用dma,输出效果如何吧。
可以了再搞DMA。
另外,一个DMA,不能同时控制2个DAC输出的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

25

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-3-6
在线时间
43 小时
发表于 2017-2-11 21:57:47 | 显示全部楼层
一个DMA,可以同时控制2个DAC输出的。

只要先把两路DAC的值先合在一起就行了。

  for (Idx= 0; Idx<N; Idx++)
  {
    Dual_DAC_12bit[Idx] = (DAC1_12bit[Idx] << 16) + (DAC2_12bit[Idx]);
  }
我做过了这个试验,通过了,生成了两个很好的正统波。
美中不足的是,两路信号虽然频率振幅皆任意可调,但两路不能完全独立,
幅度可以独立可调,但频率却不行,两路互相关联。
事在人为,顺势而为。
回复

使用道具 举报

0

主题

25

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-3-6
在线时间
43 小时
发表于 2017-2-11 22:01:57 | 显示全部楼层
void MY_DAC_DMA_Config()
{
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);       
       
  DMA_DeInit(DMA2_Channel3);
  DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&Table_Dual_DAC;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = 100;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                 
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA2_Channel3, &DMA_InitStructure);

  DMA_Cmd(DMA2_Channel3, ENABLE);// 使能 DMA2_Ch3
  DMA_Cmd(DMA2_Channel4, ENABLE);// 使能 DMA2_Ch4
  DAC_DMACmd(DAC_Channel_1, ENABLE);// 使能 DAC_DMA_Ch1       
  DAC_DMACmd(DAC_Channel_2, ENABLE);// 使能 DAC_DMA_Ch2       
}
事在人为,顺势而为。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 00:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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