打印

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

[复制链接]
189|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Nice2cu|  楼主 | 2025-5-7 08:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
GD32F470ZGT6单片机使用DAC+DMA+TIMER输出连续可调交流电压的问题,有没有大佬帮帮忙看一下,配置好DACDMATIMER5定时器输出波形有问题。
dam配置:
dac配置:
timer5配置:
主函数配置顺序:
正弦波数据点计算:

单片机DAC输出波形:

使用特权

评论回复
沙发
Nice2cu|  楼主 | 2025-5-7 08:52 | 只看该作者
dma配置和定时器配置

54601681aaec8e0a46.png (213.27 KB )

54601681aaec8e0a46.png

使用特权

评论回复
板凳
Nice2cu|  楼主 | 2025-5-7 08:53 | 只看该作者
定时器配置

32420681aaef09516e.png (213.27 KB )

32420681aaef09516e.png

使用特权

评论回复
地板
LcwSwust| | 2025-5-7 09:16 | 只看该作者
本帖最后由 LcwSwust 于 2025-5-7 09:20 编辑

看不到DMA的配置。

sin_table[]数据发出来看看呗。sin_table[]数据类型是啥?与DMA配置的数据位数、长度是否一致?
TABLE_SIZE是多少?
TIMER5频率是多少?

使用特权

评论回复
5
Nice2cu|  楼主 | 2025-5-7 10:21 | 只看该作者
LcwSwust 发表于 2025-5-7 09:16
看不到DMA的配置。

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

DAM和TIMER5的配置我发在评论区了

使用特权

评论回复
6
Nice2cu|  楼主 | 2025-5-7 10:23 | 只看该作者
LcwSwust 发表于 2025-5-7 09:16
看不到DMA的配置。

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

sin_table[]是uint16的,DMA配置的长度也是16位

使用特权

评论回复
7
LcwSwust| | 2025-5-7 10:28 | 只看该作者
Nice2cu 发表于 2025-5-7 10:21
DAM和TIMER5的配置我发在评论区了

没有DMA,两张图都是timer5_config。

使用特权

评论回复
8
Nice2cu|  楼主 | 2025-5-7 10:42 | 只看该作者
DMA配置

21675681ac871136e7.png (83.13 KB )

21675681ac871136e7.png

使用特权

评论回复
9
Nice2cu|  楼主 | 2025-5-7 10:42 | 只看该作者
LcwSwust 发表于 2025-5-7 10:28
没有DMA,两张图都是timer5_config。

哥,我重新发了,你看看有没有什么问题,实在没有头绪,改了一天了

使用特权

评论回复
10
dffzh| | 2025-5-7 10:46 | 只看该作者
有木有按照下面方法做减法测试:
1、先单独测试DAC输出固定值,看是否正常;
2、然后测试DAC+DMA输出静态波形,看是否正常;
3、最后加入TIMER触发;
这样是不是可以确认是DAC,DMA或TIMER模块的代码配置问题?

使用特权

评论回复
11
Nice2cu|  楼主 | 2025-5-7 10:55 | 只看该作者
单独使用DAC输出是没问题的,但是加了定时DMA就有问题

36691681acb9a9537e.png (538.1 KB )

36691681acb9a9537e.png

使用特权

评论回复
12
dffzh| | 2025-5-7 11:25 | 只看该作者
Nice2cu 发表于 2025-5-7 10:55
单独使用DAC输出是没问题的,但是加了定时DMA就有问题

看你的代码配置,定时器的输出频率是 50KHZ?
你试试调到1KHZ试试?可能是速度太快,波形失真了

使用特权

评论回复
13
Nice2cu|  楼主 | 2025-5-7 11:35 | 只看该作者
定时器是这样子配置的,我需要输出50HZ的交流正弦波
timer_parameter_struct timer_initpara;
   
    rcu_periph_clock_enable(RCU_TIMER5);

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

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


    timer_init(TIMER5, &timer_initpara);
   
    timer_master_output_trigger_source_select(TIMER5, TIMER_TRI_OUT_SRC_UPDATE);
   
   
    timer_enable(TIMER5);


然后输出波形成这样子

95381681ad510bced8.png (1013.34 KB )

95381681ad510bced8.png

使用特权

评论回复
14
LcwSwust| | 2025-5-7 11:37 | 只看该作者
Nice2cu 发表于 2025-5-7 10:42
哥,我重新发了,你看看有没有什么问题,实在没有头绪,改了一天了

没有看出问题,其实我也没有用过DMA传递DAC数据。不过,手册上讲到DAC数据保持寄存器时,有这么个说明:“该寄存器只能按字(32 位)访问。”
要不试一下用32位的DMA数据宽度、32位的sin_table[]?
还可以试一下sin_table的值弄成统一的值,方便找出数据值与输出电压的规律。

使用特权

评论回复
15
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么
/*初始化交流源配置DAC+DMA+TIMER输出可调正弦波形(可调峰峰值和频率)*/
    sin_generation(dac_VoltageValues);
    memset(sin_table, 2047, TABLE_SIZE);
    dma_config();               //DMA初始化
    dac_config();               //DAC初始化
    timer5_config();            //定时器5初始化

使用特权

评论回复
16
Nice2cu|  楼主 | 2025-5-7 12:31 | 只看该作者
sin_table的值全部改成2047,DAC输出的波形

83520681ae204dc829.png (585.83 KB )

83520681ae204dc829.png

使用特权

评论回复
17
dffzh| | 2025-5-7 13:33 | 只看该作者
我没有实际用过这种来产生正弦波,用deepseek操作了一下,你看下附件,对比一下配置

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

467.96 KB

使用特权

评论回复
评论
dffzh 2025-5-7 17:24 回复TA
@Nice2cu :怎么样?搞定没? 
Nice2cu 2025-5-7 13:35 回复TA
好的,谢谢。我试一下 
18
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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

13

帖子

0

粉丝