OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32/FPGA开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 3376|回复: 19

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

[复制链接]

527

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

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

精华

新手上路

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

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
120
金钱
120
注册时间
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

积分
120
金钱
120
注册时间
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

积分
120
金钱
120
注册时间
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

积分
120
金钱
120
注册时间
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

精华

新手上路

积分
39
金钱
39
注册时间
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

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

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

527

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

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

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

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

1

主题

5

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

38

主题

677

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
1746
金钱
1746
注册时间
2018-6-30
在线时间
335 小时
发表于 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                                         
}
等阳光,等彩虹,等你!
回复 支持 反对

使用道具 举报

38

主题

677

帖子

3

精华

资深版主

Rank: 8Rank: 8

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

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

TIM3_UP.png
等阳光,等彩虹,等你!
回复 支持 反对

使用道具 举报

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

本版积分规则




关闭

正点原子STM32/FPGA资料免费下载上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2019-1-22 10:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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