OpenEdv-开源电子网

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

[战舰F103] 分享:战舰两个DAC通过定时器触发DMA传输数据并产生正弦波

[复制链接]

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-1-12 13:00:26 | 显示全部楼层 |阅读模式
本帖最后由 1208 于 2019-4-18 12:51 编辑

1)首先,要先明确“数字至模拟转换器 x”的来源
才能知道数据是如何转换得来的
2)一般数据被写入到 DHRx 寄存器后,
DAC需要外部事件(如定时器定时)触发数据的转换
将DAC_DHRx 中的数据传至DAC_DORx
3)由于是双DAC通道用到了DAC_DHR12RD_ ADDRESS 是寄存器 DHR12RD 的地址
─ 12位数据右对齐:用户须将DAC通道1数据写入寄存器DAC_DHR12RD[11:0]位(实际是存
入寄存器DHR1[11:0]位),将DAC通道2数据写入寄存器DAC_DHR12RD[27:16]位(实际是
存入寄存器DHR2[11:0]位),具体可以看下中文参考手册
outdata = (Sine12bit[Idx] << 16) + (Sine12bit[Idx]);
4)使能DAC的DMA请求   对 DAC1 和 2 的操作是同步的,所以只要把 DMA 与
DAC 通道 2 关联起来即可,当使用 DMA 设置通道 2 的数据值时, 同时更新通道 1 的内容
5)定时器每间隔一定的时间就会触发 DMA 搬运双通道正弦波表的
一个数据到 DAC 双通道寄存器进行转换,每完成一个周期后 DMA 重新开始循环,
从而达到连续输出波形的目的

6)周期是5us,由T=1/f得,f=1/T=20KHZ

产生的正弦波是20KHZ
DMA通道图
DAC.JPG

DAC_DHRx 中的数据传至DAC_DORx
QQ截图20190112110918.png

DAC输出正弦波效果图,也可以通过串口输出数据
正弦波.jpg





实验20 DAC实验.zip

4.98 MB, 下载次数: 3162

业精于勤荒于嬉;行成于思毁于随!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
 楼主| 发表于 2019-1-15 17:40:38 | 显示全部楼层
本帖最后由 1208 于 2019-1-16 17:09 编辑

1)DAC通道 1 的 12 位右对齐数据保持寄存器(DAC_DHR12R1)
#define DAC_DHR12R1_ADDRESS     0x40007408

2)DAC通道 2 的 12 位右对齐数据保持寄存器(DAC_DHR12R2)   
#define DAC_DHR12R2_ADDRESS     0x40007414

这两个通道地址也要改成对应的寄存器才有数据输出

战舰:DAC通道2地址数据通过定时器触发DMA传输.zip

5.02 MB, 下载次数: 4583

战舰:DAC通道1地址数据通过定时器触发DMA传输.zip

5.02 MB, 下载次数: 4789

业精于勤荒于嬉;行成于思毁于随!
回复 支持 3 反对 0

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-3-2
在线时间
11 小时
发表于 2019-3-22 08:46:12 | 显示全部楼层
请问如果我需要输出的正弦波的幅度为5V,应该怎么做呢?
回复 支持 0 反对 1

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2019-1-14 01:40:09 | 显示全部楼层
不错,谢谢分享。
cool
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

13

主题

633

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1331
金钱
1331
注册时间
2016-8-1
在线时间
229 小时
发表于 2019-1-13 19:25:46 | 显示全部楼层
谢谢分享,楼主辛苦了
Loto虚拟示波器 官方qq群: 706769836 https://shop296209296.taobao.com/shop/view_shop.htm?tracelog=t
回复 支持 反对

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
 楼主| 发表于 2019-3-22 11:53:15 | 显示全部楼层
问题很大 发表于 2019-3-22 08:46
请问如果我需要输出的正弦波的幅度为5V,应该怎么做呢?

IO最高输出3.3V,5V要外加模块之类的
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

17

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2018-10-20
在线时间
95 小时
发表于 2019-4-14 23:18:29 | 显示全部楼层
请问楼主,这个输出波形的频率是根据定时器来决定的嘛
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-5-3
在线时间
5 小时
发表于 2019-5-24 20:27:33 | 显示全部楼层
1208 发表于 2019-1-15 17:40
1)DAC通道 1 的 12 位右对齐数据保持寄存器(DAC_DHR12R1)
#define DAC_DHR12R1_ADDRESS     0x40007408
...

楼主测试过吗,这个DAC的转换率最高是4us,那理论上不可能在32个点一个周期的情况下产生100khz的正弦波啊,因为你设置了定时周期什么的是20,那不可能实现呀
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2015-10-28
在线时间
2 小时
发表于 2019-7-9 11:20:10 | 显示全部楼层
问题很大 发表于 2019-3-22 08:46
请问如果我需要输出的正弦波的幅度为5V,应该怎么做呢?

可以考虑加运放,组成电压跟踪器
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-7-30
在线时间
4 小时
发表于 2019-8-3 17:33:16 | 显示全部楼层
问一下这个正弦波输出频率怎么修改
回复 支持 反对

使用道具 举报

23

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
255
金钱
255
注册时间
2018-10-21
在线时间
44 小时
发表于 2019-8-8 16:24:52 | 显示全部楼层
怎么用示波器查看波形?示波器怎么接的?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2019-8-7
在线时间
1 小时
发表于 2019-8-10 09:43:47 | 显示全部楼层
你好,请问示波器要怎么接单片机啊
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2018-1-18
在线时间
20 小时
发表于 2019-8-28 16:03:17 | 显示全部楼层
好东西,借用一下,很好使
回复 支持 反对

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
 楼主| 发表于 2019-8-28 16:31:16 | 显示全部楼层
yikaiwen 发表于 2019-8-10 09:43
你好,请问示波器要怎么接单片机啊

这个你看下DAC定义的引脚
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

0

主题

25

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2018-11-20
在线时间
34 小时
发表于 2019-8-28 16:42:01 | 显示全部楼层
666顶上,,,,,,
回复 支持 反对

使用道具 举报

70

主题

275

帖子

0

精华

高级会员

Rank: 4

积分
728
金钱
728
注册时间
2017-6-20
在线时间
188 小时
发表于 2019-11-12 17:10:57 | 显示全部楼层
本帖最后由 天天mdk 于 2019-11-12 17:12 编辑

为啥有错误啊
波形图.jpg
回复 支持 反对

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
 楼主| 发表于 2019-11-12 18:57:01 | 显示全部楼层

我测试的时候是没有的,你改过的还是
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

70

主题

275

帖子

0

精华

高级会员

Rank: 4

积分
728
金钱
728
注册时间
2017-6-20
在线时间
188 小时
发表于 2019-11-13 08:58:20 | 显示全部楼层
1208 发表于 2019-11-12 18:57
我测试的时候是没有的,你改过的还是

我倒是改了,
你的程序我也试过了
也是这样
!我以为是你的点数太少,所以我改用的原子哥那个正弦函数来产生100个点。但是还是不行。你说你当时没发现,可能是因为你原版的频率太高,PA4显示豁口那里没这么明显,只是一条黑线,所以可能你示波器上看不出来。你把频率改成5s一个周期就能发现PA4还是有个豁口,而PA5却没有。你看看是什么原因啊
wenwen.png
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2019-10-28
在线时间
33 小时
发表于 2020-1-21 14:27:29 | 显示全部楼层
感谢楼主 xiexie!
回复 支持 反对

使用道具 举报

160

主题

966

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2095
金钱
2095
注册时间
2014-3-7
在线时间
490 小时
发表于 2020-10-26 08:59:51 | 显示全部楼层
下载进去没出波形啊,能不能指导一下啊
回复 支持 反对

使用道具 举报

160

主题

966

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2095
金钱
2095
注册时间
2014-3-7
在线时间
490 小时
发表于 2020-10-26 10:34:35 | 显示全部楼层
天天mdk 发表于 2019-11-13 08:58
我倒是改了,你的程序我也试过了,也是这样!我以为是你的点数太少,所以我改用 ...

你这个直接下载就出波形了吗  我这里没出波形
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1237
金钱
1237
注册时间
2016-1-23
在线时间
486 小时
发表于 2020-11-15 12:43:57 | 显示全部楼层
谢谢分享,成功输出两路互反相180度的正弦波
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

高级会员

Rank: 4

积分
868
金钱
868
注册时间
2020-10-23
在线时间
81 小时
发表于 2020-11-20 19:07:33 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2018-12-24
在线时间
3 小时
发表于 2020-12-8 21:46:38 | 显示全部楼层
谢谢楼主分享这样好的学习例程!
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-10-2
在线时间
7 小时
发表于 2021-4-23 15:46:55 | 显示全部楼层
STM129 发表于 2020-11-15 12:43
谢谢分享,成功输出两路互反相180度的正弦波

帮忙指点一下吗?我的只能输出一路,另一路没有输出,感觉程序也没有问题
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1237
金钱
1237
注册时间
2016-1-23
在线时间
486 小时
发表于 2021-5-2 22:53:15 | 显示全部楼层
FWJ1907851247 发表于 2021-4-23 15:46
帮忙指点一下吗?我的只能输出一路,另一路没有输出,感觉程序也没有问题


void DAC_Mode_Init(void)
{
        uint32_t Idx = 0;  
//    float outdata=0;
        int  outdata=0;//float改int
        Dac1_Init();
        DAC_TIM_Config();       
       
        /* 填充正弦波形数据,双通道右对齐*/
  for (Idx = 0; Idx < POINT_NUM; Idx++)
  {
       outdata = (Sine12bit[Idx] << 16) + (RSine12bit[Idx]);//两个通道
          
//           printf("%f\r\n",outdata);
           DualSine12bit[Idx]=outdata;
  }
       
        DAC_DMA_Config();
}
回复 支持 反对

使用道具 举报

13

主题

86

帖子

0

精华

高级会员

Rank: 4

积分
559
金钱
559
注册时间
2016-8-31
在线时间
77 小时
发表于 2021-5-3 19:53:53 | 显示全部楼层
我做了一个正弦波发生器,用编码器控制频率。  后来用stm32f103RCT6,用定时器6 DMA的方式改变正弦波率,一个周期256个点,输出用PA5.编码器输入用PB6和PB7。可以设置起始频率,和最低和最高频率。后来为了节约成本,在这个基础上,增加了一个编码器,输入是PA6和PA7,输出PA4.
功能和第一个相互独立。
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2021-5-11
在线时间
4 小时
发表于 2021-5-14 16:28:14 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2020-8-31
在线时间
6 小时
发表于 2021-10-10 10:27:04 | 显示全部楼层
问一下楼主,我拿示波器测量了一下,发现一路是3.3V,但是另外一路只有330mV左右,这是咋回事啊
回复 支持 反对

使用道具 举报

4

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
443
金钱
443
注册时间
2022-1-6
在线时间
55 小时
发表于 2022-4-21 11:05:43 | 显示全部楼层

我也是这种情况
回复 支持 反对

使用道具 举报

7

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
397
金钱
397
注册时间
2019-7-4
在线时间
88 小时
发表于 2022-8-19 09:35:41 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 23:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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