OpenEdv-开源电子网

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

使用STM3的DAC输出波形出现跳跃的现象,请教

[复制链接]

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
发表于 2024-11-3 11:18:29 | 显示全部楼层 |阅读模式
用的matlab生成的数据,目前还没有采用定时器与DMA 后期会考虑,现在的问题是为什么呢?恳请大佬赐教
下面是主函数
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "dac.h"

  6. #define SAMPLE_POINTS 100
  7. #define DELAY_TIME_MS 1

  8. // ²¨ÐÎÊý¾Ý
  9. const uint16_t sine_wave_values[SAMPLE_POINTS] =
  10. {
  11. 1650, 1754, 1857, 1959, 2060, 2160, 2257, 2353, 2445, 2534,
  12. 2620, 2702, 2780, 2853, 2921, 2985, 3043, 3096, 3143, 3184,
  13. 3219, 3248, 3271, 3287, 3297, 3300, 3297, 3287, 3271, 3248,
  14. 3219, 3184, 3143, 3096, 3043, 2985, 2921, 2853, 2780, 2702,
  15. 2620, 2534, 2445, 2353, 2257, 2160, 2060, 1959, 1857, 1754,
  16. 1650, 1546, 1443, 1341, 1240, 1140, 1043, 947, 855, 766, 680,
  17. 598, 520, 447, 379, 315, 257, 204, 157, 116, 81, 52, 29, 13, 3,
  18. 0, 3, 13, 29, 52, 81, 116, 157, 204, 257, 315, 379, 447, 520, 598,
  19. 680, 766, 855, 947, 1043, 1140, 1240, 1341, 1443, 1546
  20. };

  21. int main(void)
  22. {
  23.         delay_init(168);                  
  24.         LED_Init();        
  25.         Dac1_Init();

  26.         while(1)
  27.         {        

  28.                 for (int i = 0; i < SAMPLE_POINTS; i++)
  29.                 {
  30.                         Dac1_Set_Vol(sine_wave_values[i]);
  31.                         delay_ms(DELAY_TIME_MS);
  32.                 }
  33.         }
  34. }
复制代码


现象.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

3280

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8182
金钱
8182
注册时间
2020-5-11
在线时间
3694 小时
发表于 2024-11-4 09:26:18 | 显示全部楼层
奇怪,不久前也有人遇到类似问题,就是没了下文。不知楼主这里的电路是怎样的?
http://www.openedv.com/forum.php?mod=viewthread&tid=350512
专治疑难杂症
回复 支持 1 反对 0

使用道具 举报

31

主题

1951

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4416
金钱
4416
注册时间
2018-5-11
在线时间
922 小时
发表于 2024-11-3 14:18:03 | 显示全部楼层
是不是3297, 3300, 3297中,
3300过大所致?
稍改小一些试试。
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复 支持 反对

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 2024-11-3 15:16:23 | 显示全部楼层
warship 发表于 2024-11-3 14:18
是不是3297, 3300, 3297中,
3300过大所致?
稍改小一些试试。

很感谢您的回复,我改一下试试 非常感谢
回复 支持 反对

使用道具 举报

70

主题

6696

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12682
金钱
12682
注册时间
2012-11-26
在线时间
3709 小时
发表于 2024-11-4 09:03:39 | 显示全部楼层
你用jlink的rtt  把你输出的数据打印出来,然后用excel做个图看看    是不是数据错了还是咋的
学无止境
回复 支持 反对

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 2024-11-4 14:39:50 | 显示全部楼层
LcwSwust 发表于 2024-11-4 09:26
奇怪,不久前也有人遇到类似问题,就是没了下文。不知楼主这里的电路是怎样的?
http://www.openedv.com/f ...

我这边用的是网上买的一个F4的最小系统板
回复 支持 反对

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 2024-11-4 14:40:23 | 显示全部楼层
jermy_z 发表于 2024-11-4 09:03
你用jlink的rtt  把你输出的数据打印出来,然后用excel做个图看看    是不是数据错了还是咋的

好方法 谢谢! 我今天尝试一下用定时器触发看一下
回复 支持 反对

使用道具 举报

9

主题

245

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1221
金钱
1221
注册时间
2014-11-25
在线时间
173 小时
发表于 2024-11-4 16:07:16 | 显示全部楼层
看看DAC设置值那个函数是咋写的
回复 支持 反对

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 2024-11-4 20:00:07 | 显示全部楼层
godark 发表于 2024-11-4 16:07
看看DAC设置值那个函数是咋写的
  1. //正弦波输出
  2. //vol:0~3300,代表0~3.3V
  3. void Dac1_Set_Vol(u16 vol)
  4. {
  5.         double temp=vol;
  6.         temp/=1000;
  7.         temp=temp*4096/3.3;
  8.         DAC_SetChannel1Data(DAC_Align_12b_R,temp);
  9. }
复制代码
回复 支持 反对

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 2024-11-4 20:01:02 | 显示全部楼层
本帖最后由 启林 于 2024-11-4 20:04 编辑

20241104 进度更新:目前采用定时器定时输出,已经可以输出比较好的波形了,而且可以进行频率调节
测试效果.png
回复 支持 反对

使用道具 举报

10

主题

3280

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8182
金钱
8182
注册时间
2020-5-11
在线时间
3694 小时
发表于 2024-11-5 09:15:05 | 显示全部楼层
本帖最后由 LcwSwust 于 2024-11-5 09:16 编辑

原来问题在这,temp=temp*4096/3.3;
如果参数是3300,那就得到4096,而DAC最大值其实为4095,
给4096就溢出了,相当于0。
为了提高效率,建议不要用Dac1_Set_Vol,而是直接用DAC_SetChannel1Data。
专治疑难杂症
回复 支持 反对

使用道具 举报

15

主题

64

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2023-5-13
在线时间
28 小时
 楼主| 发表于 5 天前 | 显示全部楼层
LcwSwust 发表于 2024-11-5 09:15
原来问题在这,temp=temp*4096/3.3;
如果参数是3300,那就得到4096,而DAC最大值其实为4095,
给4096就 ...

非常感谢大佬 因出差 一直没回来看消息 非常感谢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 01:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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