GD32F470ZGT6单片机使用DAC+DMA+TIMER输出连续可调交流电压的问题

[复制链接]
 楼主| Nice2cu 发表于 2025-5-7 08:50 | 显示全部楼层 |阅读模式
GD32F470ZGT6单片机使用DAC+DMA+TIMER输出连续可调交流电压的问题,有没有大佬帮帮忙看一下,配置好DACDMATIMER5定时器输出波形有问题。
dam配置:
dac配置:
3626681aadf413068.png
timer5配置:
主函数配置顺序:
正弦波数据点计算:

单片机DAC输出波形:
78853681aae067ed23.png

 楼主| Nice2cu 发表于 2025-5-7 08:52 | 显示全部楼层
dma配置和定时器配置
54601681aaec8e0a46.png
 楼主| Nice2cu 发表于 2025-5-7 08:53 | 显示全部楼层
定时器配置
32420681aaef09516e.png
LcwSwust 发表于 2025-5-7 09:16 | 显示全部楼层
本帖最后由 LcwSwust 于 2025-5-7 09:20 编辑

看不到DMA的配置。

sin_table[]数据发出来看看呗。sin_table[]数据类型是啥?与DMA配置的数据位数、长度是否一致?
TABLE_SIZE是多少?
TIMER5频率是多少?
 楼主| Nice2cu 发表于 2025-5-7 10:21 | 显示全部楼层
LcwSwust 发表于 2025-5-7 09:16
看不到DMA的配置。

sin_table[]数据发出来看看呗。sin_table[]数据类型是啥?与DMA配置的数据位数、长度是 ...

DAM和TIMER5的配置我发在评论区了
 楼主| Nice2cu 发表于 2025-5-7 10:23 | 显示全部楼层
LcwSwust 发表于 2025-5-7 09:16
看不到DMA的配置。

sin_table[]数据发出来看看呗。sin_table[]数据类型是啥?与DMA配置的数据位数、长度是 ...

sin_table[]是uint16的,DMA配置的长度也是16位
LcwSwust 发表于 2025-5-7 10:28 | 显示全部楼层
Nice2cu 发表于 2025-5-7 10:21
DAM和TIMER5的配置我发在评论区了

没有DMA,两张图都是timer5_config。
 楼主| Nice2cu 发表于 2025-5-7 10:42 | 显示全部楼层
DMA配置
21675681ac871136e7.png
 楼主| Nice2cu 发表于 2025-5-7 10:42 | 显示全部楼层
LcwSwust 发表于 2025-5-7 10:28
没有DMA,两张图都是timer5_config。

哥,我重新发了,你看看有没有什么问题,实在没有头绪,改了一天了
dffzh 发表于 2025-5-7 10:46 | 显示全部楼层
有木有按照下面方法做减法测试:
1、先单独测试DAC输出固定值,看是否正常;
2、然后测试DAC+DMA输出静态波形,看是否正常;
3、最后加入TIMER触发;
这样是不是可以确认是DAC,DMA或TIMER模块的代码配置问题?

 楼主| Nice2cu 发表于 2025-5-7 10:55 | 显示全部楼层
单独使用DAC输出是没问题的,但是加了定时DMA就有问题
36691681acb9a9537e.png
dffzh 发表于 2025-5-7 11:25 | 显示全部楼层
Nice2cu 发表于 2025-5-7 10:55
单独使用DAC输出是没问题的,但是加了定时DMA就有问题

看你的代码配置,定时器的输出频率是 50KHZ?
你试试调到1KHZ试试?可能是速度太快,波形失真了
 楼主| Nice2cu 发表于 2025-5-7 11:35 | 显示全部楼层
定时器是这样子配置的,我需要输出50HZ的交流正弦波
  1. timer_parameter_struct timer_initpara;
  2.    
  3.     rcu_periph_clock_enable(RCU_TIMER5);

  4.     //定时器TIM5初始化
  5.     timer_deinit(TIMER5);

  6.     /*      定时器5挂载在APB1,时钟频率为120MHZ
  7.     prescaler:定时器时钟分频
  8.     period:定时器更新周期
  9.     data_size:输出正弦波数据点个数
  10.     T_sin = data_size*(prescaler+1)*(period+1) / 120
  11.     f_sin = 1/T_sin * 1000000
  12.     当前需要50HZ
  13.     data_size取1000,prescaler取119,period取19
  14.     */
  15.    
  16.     timer_struct_para_init(&timer_initpara);
  17.     timer_initpara.prescaler         = 119;
  18.     timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
  19.     timer_initpara.counterdirection  = TIMER_COUNTER_UP;
  20.     timer_initpara.period            = 19;
  21.     timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
  22.     timer_initpara.repetitioncounter = 0;


  23.     timer_init(TIMER5, &timer_initpara);
  24.    
  25.     timer_master_output_trigger_source_select(TIMER5, TIMER_TRI_OUT_SRC_UPDATE);
  26.    
  27.    
  28.     timer_enable(TIMER5);


然后输出波形成这样子
95381681ad510bced8.png
LcwSwust 发表于 2025-5-7 11:37 | 显示全部楼层
Nice2cu 发表于 2025-5-7 10:42
哥,我重新发了,你看看有没有什么问题,实在没有头绪,改了一天了

没有看出问题,其实我也没有用过DMA传递DAC数据。不过,手册上讲到DAC数据保持寄存器时,有这么个说明:“该寄存器只能按字(32 位)访问。”
要不试一下用32位的DMA数据宽度、32位的sin_table[]?
还可以试一下sin_table的值弄成统一的值,方便找出数据值与输出电压的规律。
 楼主| Nice2cu 发表于 2025-5-7 12:30 | 显示全部楼层
LcwSwust 发表于 2025-5-7 11:37
没有看出问题,其实我也没有用过DMA传递DAC数据。不过,手册上讲到DAC数据保持寄存器时,有这么个说明: ...

试了把sin_table[]和DMA的数据宽度全部改为32位,还是不行。但是我发现个问题,就是我把sin_table的值全部改成2047,然后就输出了3.3V,按道理不应该是4095才对应最大输出3.3V么
  1. /*初始化交流源配置DAC+DMA+TIMER输出可调正弦波形(可调峰峰值和频率)*/
  2.     sin_generation(dac_VoltageValues);
  3.     memset(sin_table, 2047, TABLE_SIZE);
  4.     dma_config();               //DMA初始化
  5.     dac_config();               //DAC初始化
  6.     timer5_config();            //定时器5初始化
 楼主| Nice2cu 发表于 2025-5-7 12:31 | 显示全部楼层
sin_table的值全部改成2047,DAC输出的波形
83520681ae204dc829.png
dffzh 发表于 2025-5-7 13:33 | 显示全部楼层
我没有实际用过这种来产生正弦波,用deepseek操作了一下,你看下附件,对比一下配置

GD32F470ZGT6 DAC DMA TIMER 输出50Hz正弦波配置.pdf

467.96 KB, 下载次数: 3

评论

[url=home.php?mod=space&uid=3542014]@Nice2cu[/url] :重新私信发你了  发表于 2025-5-8 11:16
[url=home.php?mod=space&uid=2728380]@dffzh[/url] :微信没法找到你诶,我没法发私信,等级不够,  发表于 2025-5-8 11:11
[url=home.php?mod=space&uid=3542014]@Nice2cu[/url] :私信给你发了我的V信,能看到吗  发表于 2025-5-8 10:31
[url=home.php?mod=space&uid=2728380]@dffzh[/url] :哥,你先加我这个QQ2572720972  发表于 2025-5-8 10:27
[url=home.php?mod=space&uid=3542014]@Nice2cu[/url] :我还就不信搞不定这问题了,方便的话,把V信发来,我加你,帮你一起看下  发表于 2025-5-8 09:01
[url=home.php?mod=space&uid=2728380]@dffzh[/url] :没有解决  发表于 2025-5-8 08:53
[url=home.php?mod=space&uid=3542014]@Nice2cu[/url] :怎么样?搞定没?  发表于 2025-5-7 17:24
好的,谢谢。我试一下  发表于 2025-5-7 13:35
dffzh 发表于 2025-5-7 13:44 | 显示全部楼层
Nice2cu 发表于 2025-5-7 12:30
试了把sin_table[]和DMA的数据宽度全部改为32位,还是不行。但是我发现个问题,就是我把sin_table的值全 ...

输出2047,实际电压是3.3V的问题,你可以按如下文档大概排查一下,希望可以帮你解决问题

DAC DMA TIMER输出正弦波时,遇到输出电压与预期不符的问题.pdf

623.06 KB, 下载次数: 4

 楼主| Nice2cu 发表于 2025-5-8 18:03 | 显示全部楼层
已经解决,主要是有两个问题,第一个问题是DMA配置结构体的参数设置问题,正确应该使用:dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;
第二问题是DAC初始化的问题,正确初始化应该为一下代码:
  1. //配置DAC输出引脚
  2.     rcu_periph_clock_enable(RCU_GPIOA);
  3.     rcu_periph_clock_enable(RCU_DAC);
  4.    
  5.     gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_4);
  6.     //gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
  7.    
  8.      //配置DAC
  9.     dac_deinit(DAC0);
  10.    
  11.     //触发源选择(定时器5)
  12.     dac_trigger_source_config(DAC0, DAC_OUT0, DAC_TRIGGER_T5_TRGO);
  13.     //dac_output_buffer_disable(DAC0, DAC_OUT0);        //使用这个配置函数波形会出现偏移
  14.     //触发使能
  15.     dac_trigger_enable(DAC0, DAC_OUT0);
  16.     dac_wave_mode_config(DAC0, DAC_OUT0, DAC_WAVE_DISABLE);
  17.     dac_enable(DAC0, DAC_OUT0);
  18.     //使能DAC的DMA
  19.     dac_dma_enable(DAC0, DAC_OUT0);  
28597681c80f933e7c.png
PreWorld 发表于 2025-5-19 16:06 | 显示全部楼层
GD32F470的DAC模块配合DMA和TIMER可以实现连续可调的交流电压输出
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

2

主题

17

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部