OpenEdv-开源电子网

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

[STM32练习题] STM32F103 DAC使用DMA输出1Khz正弦波

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-8-9 10:42:48 | 显示全部楼层 |阅读模式
DAC+DMA输出正弦波。
可以很方便的控制DAC频率。
实验22 DMA实验-1K正弦波DAC输出.rar (366.44 KB, 下载次数: 4255)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-1-16 12:39:49 | 显示全部楼层
本帖最后由 1208 于 2019-1-16 12:58 编辑

通道请求可以来自TIM3_UP,来触发DMA1,通道3的硬件触发
因此,可以实现TIM3溢出事件,控制DMA1,通道3的数据传输,
这样,每当TIM3 UP事件来到,就会触发一次DMA1,通道3数据传输,
从而将buf里面的数据,按TIM3的设置,来搬运到DAC去

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

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2017-7-20
在线时间
6 小时
发表于 2017-8-9 10:49:30 | 显示全部楼层
准时粗线
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2017-11-23
在线时间
0 小时
发表于 2017-11-23 20:49:44 | 显示全部楼层
请问在上述程序中这个正弦波的幅值怎么设置,怎么计算?
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2017-9-20
在线时间
7 小时
发表于 2017-12-22 15:02:39 | 显示全部楼层
请问你输出正弦波的频率调整精度是多少,可以每次调整1HZ吗?
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2014-5-27
在线时间
9 小时
发表于 2018-1-22 21:46:37 | 显示全部楼层
#define DAC_SIN_SIZE    100       //发送数据长度,最好等于sizeof(TEXT_TO_SEND)+2的整数倍,为什么呢?
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2014-5-27
在线时间
9 小时
发表于 2018-1-22 21:49:30 | 显示全部楼层
zlfeng007 发表于 2017-12-22 15:02
请问你输出正弦波的频率调整精度是多少,可以每次调整1HZ吗?

输出正弦波周期 = 定时器溢出时间 * 数据个数
比如程序中,定时器溢出时间为0.01ms, 数据个数100,则正弦波周期为1ms, 频率1khz
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2014-5-27
在线时间
9 小时
发表于 2018-1-22 21:57:12 | 显示全部楼层
卡卡_73 发表于 2018-1-22 21:49
输出正弦波周期 = 定时器溢出时间 * 数据个数
比如程序中,定时器溢出时间为0.01ms, 数据个数100,则正 ...

然后,你在调整频率的时候,即可调整溢出时间,也可调整DMA数据个数
回复 支持 反对

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2014-5-27
在线时间
9 小时
发表于 2018-1-22 22:00:10 | 显示全部楼层
卡卡_73 发表于 2018-1-22 21:46
#define DAC_SIN_SIZE    100       //发送数据长度,最好等于sizeof(TEXT_TO_SEND)+2的整数倍,为什么呢?

呼叫原子哥
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2018-3-25
在线时间
23 小时
发表于 2018-4-24 20:03:19 | 显示全部楼层
π值弄错了,应该是3.1415926
回复 支持 反对

使用道具 举报

3

主题

26

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-3-27
在线时间
17 小时
发表于 2018-5-20 15:32:10 | 显示全部楼层
这个程序可以在f103zet6上使用吗
回复 支持 反对

使用道具 举报

3

主题

26

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-3-27
在线时间
17 小时
发表于 2018-5-20 16:36:22 | 显示全部楼层
原子哥,您这个程序能用在F103ZET6上吗
回复 支持 反对

使用道具 举报

3

主题

26

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-3-27
在线时间
17 小时
发表于 2018-5-20 16:37:37 | 显示全部楼层

程序下到板子上怎么没反应
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2017-10-25
在线时间
30 小时
发表于 2018-5-27 13:47:09 | 显示全部楼层
程序能用,感谢楼主!可是, 你这个程序是怎么实现的,DMA1没有DAC的通道啊,而且你也没有DAC请求DMA的代码
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2017-10-25
在线时间
30 小时
发表于 2018-5-27 13:48:49 | 显示全部楼层
原子哥求解释
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2017-10-25
在线时间
30 小时
发表于 2018-5-27 14:20:00 | 显示全部楼层
是把外设当成存储器来用了?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
 楼主| 发表于 2018-7-17 01:44:51 | 显示全部楼层
倒栽就爱你胡诌 发表于 2018-5-27 14:20
是把外设当成存储器来用了?

定时器触发的!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2018-8-20
在线时间
8 小时
发表于 2018-8-21 09:00:09 | 显示全部楼层
卡卡_73 发表于 2018-1-22 21:57
然后,你在调整频率的时候,即可调整溢出时间,也可调整DMA数据个数

还是没明白正弦波的频率=定时器溢出时间*数据个数
能请教一下吗
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2018-8-20
在线时间
8 小时
发表于 2018-8-21 09:22:02 | 显示全部楼层
看不懂这个程序的几个地方:
回复 支持 反对

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-1-14 18:53:00 | 显示全部楼层
本帖最后由 1208 于 2019-1-15 18:36 编辑

军哥,看了中文参考手册没有定时器3触发了DAC数据传输到DMA,不知道数据怎么传输的,麻烦解释一下
主函数的
    TIM3_Int_Init(9,71);
    dac_creat_sin_buf();
    Dac1_Init();
    DAC_DMA_Config(DMA1_Channel3,(u32)&DAC->DHR12R1,(u32)DAC_SIN_BUF,D   AC_SIN_SIZE);//      DMA1通道4,外设为串口1,存储器为SendBuff,长度SEND_BUF_SIZE.
   TIM3->DIER|=1<<8;
    MYDMA_Enable(DMA1_Channel3);
定时器的
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
        
        //定时器TIM3初始化
        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值        
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位

//        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

//        //中断优先级NVIC设置
//        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
//        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
//        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
//        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
//        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


        TIM_Cmd(TIM3, ENABLE);  //使能TIMx                                         
}
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-4-18
在线时间
9 小时
发表于 2019-4-18 10:30:54 | 显示全部楼层
求问原子哥仿真出现了:no write是怎么回事啊
回复 支持 反对

使用道具 举报

10

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2016-9-15
在线时间
48 小时
发表于 2019-4-21 17:09:19 | 显示全部楼层
本帖最后由 shichuang 于 2019-4-21 17:10 编辑

用到了定时器触发,为什么下图中还是不使用触发功能???这个图是从你发的附件例程中截出来的!
DAC.png
回复 支持 反对

使用道具 举报

2

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
234
金钱
234
注册时间
2019-3-14
在线时间
34 小时
发表于 2019-5-20 10:35:40 | 显示全部楼层
shichuang 发表于 2019-4-21 17:09
用到了定时器触发,为什么下图中还是不使用触发功能???这个图是从你发的附件例程中截出来的!

为什么我的下载的例程和你的例程不一样?黑人问号
回复 支持 反对

使用道具 举报

10

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2016-9-15
在线时间
48 小时
发表于 2019-5-20 10:58:45 | 显示全部楼层
bastay 发表于 2019-5-20 10:35
为什么我的下载的例程和你的例程不一样?黑人问号

确定吗?我刚刚又下载了一次,还是这样啊,我的那个图是从Dac1初始化里面的呀,你好好看看,应该是一样的!
回复 支持 反对

使用道具 举报

2

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
234
金钱
234
注册时间
2019-3-14
在线时间
34 小时
发表于 2019-5-20 13:17:36 | 显示全部楼层
shichuang 发表于 2019-5-20 10:58
确定吗?我刚刚又下载了一次,还是这样啊,我的那个图是从Dac1初始化里面的呀,你好好看看,应该是一样的 ...

我看了别的,没关掉,以为还是这个的程序,,尴尬
回复 支持 反对

使用道具 举报

10

主题

68

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2016-9-15
在线时间
48 小时
发表于 2019-5-20 14:37:50 | 显示全部楼层
bastay 发表于 2019-5-20 13:17
我看了别的,没关掉,以为还是这个的程序,,尴尬

那我圈出来的可否解答,为什么不使用出发功能???
回复 支持 反对

使用道具 举报

2

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
234
金钱
234
注册时间
2019-3-14
在线时间
34 小时
发表于 2019-5-21 10:40:07 | 显示全部楼层
shichuang 发表于 2019-5-20 14:37
那我圈出来的可否解答,为什么不使用出发功能???

不知道,他得程序我没看过,我用的是F407的,使用了触发功能的,TIM2触发,已经能够正常输出正弦波了
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-7-15
在线时间
30 小时
发表于 2019-7-23 16:01:55 | 显示全部楼层
原子哥 这个波要在哪边显示啊
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-7-15
在线时间
30 小时
发表于 2019-7-23 16:03:12 | 显示全部楼层
bastay 发表于 2019-5-21 10:40
不知道,他得程序我没看过,我用的是F407的,使用了触发功能的,TIM2触发,已经能够正常输出正弦波了

请问这个波在哪边显示啊
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-11-27
在线时间
2 小时
发表于 2019-12-4 20:22:24 | 显示全部楼层
ct2333 发表于 2019-7-23 16:03
请问这个波在哪边显示啊

看DAC的输出引脚,用示波器测量输出引脚,就能看到波形了
回复 支持 反对

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6084
金钱
6084
注册时间
2018-6-27
在线时间
524 小时
发表于 2020-1-16 10:33:43 | 显示全部楼层
谢谢分享,学习学习。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2020-4-7
在线时间
1 小时
发表于 2020-4-7 14:15:25 | 显示全部楼层
学习,感谢
回复 支持 反对

使用道具 举报

18

主题

155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3882
金钱
3882
注册时间
2016-7-8
在线时间
817 小时
发表于 2020-4-13 20:21:53 | 显示全部楼层
请问频率可以做到40K吗
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2020-6-17
在线时间
6 小时
发表于 2020-6-21 11:43:50 | 显示全部楼层
这个DAC是PA4引脚吧,为什么我测不到电压的变化呢
回复 支持 反对

使用道具 举报

160

主题

966

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2095
金钱
2095
注册时间
2014-3-7
在线时间
490 小时
发表于 2020-10-16 16:11:54 | 显示全部楼层
没出波形,有谁出波形了?
回复 支持 反对

使用道具 举报

160

主题

966

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2095
金钱
2095
注册时间
2014-3-7
在线时间
490 小时
发表于 2020-10-16 16:12:25 | 显示全部楼层
1208 发表于 2019-1-14 18:53
军哥,看了中文参考手册没有定时器3触发了DAC数据传输到DMA,不知道数据怎么传输的,麻烦解释一下
主函数 ...

这个波形能输出吗,我下载到板子上输出不了
回复 支持 反对

使用道具 举报

160

主题

966

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2095
金钱
2095
注册时间
2014-3-7
在线时间
490 小时
发表于 2020-10-16 16:17:40 | 显示全部楼层
没出波形,不知道啥原因?
回复 支持 反对

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2019-10-22
在线时间
31 小时
发表于 2020-12-18 16:06:51 | 显示全部楼层
同问,DAC设置为什么不使用触发功能
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2021-2-19
在线时间
7 小时
发表于 2021-2-22 17:58:27 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2022-1-5
在线时间
2 小时
发表于 2022-1-5 22:23:19 | 显示全部楼层
程序效果正常。
同“1208”的问题,是否可以这样理解?用TIM3的up事件申请了DMA通道,这个通道配置给了DAC和波形数组,每次触发(定时时间到)时,由于没有设置DAC触发,就是直接DAC转换了。
如程序设计成DAC由TIM来驱动,DMA由DAC来申请,那么每次TIM驱动DAC时,会触发一次DMA,应该也可以实现相同的效果。
原子哥的实现更妙啊
回复 支持 反对

使用道具 举报

4

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
443
金钱
443
注册时间
2022-1-6
在线时间
55 小时
发表于 2022-3-12 15:57:48 | 显示全部楼层
原子哥,有几个问题想请教一下
回复 支持 反对

使用道具 举报

4

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
443
金钱
443
注册时间
2022-1-6
在线时间
55 小时
发表于 2022-3-12 16:03:33 | 显示全部楼层
原子哥有几个问题想请教一下,用DMA将数据从内存传输到DAC模块,一次就传输256个数吗?  还有原子哥你用定时器6去触发DAC,频率是怎么计算的?还有有可能实现相位改变吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 22:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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