打印

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

[复制链接]
619|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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-8 11:16 回复TA
@Nice2cu :重新私信发你了 
Nice2cu 2025-5-8 11:11 回复TA
@dffzh :微信没法找到你诶,我没法发私信,等级不够, 
dffzh 2025-5-8 10:31 回复TA
@Nice2cu :私信给你发了我的V信,能看到吗 
dffzh 2025-5-8 09:01 回复TA
@Nice2cu :我还就不信搞不定这问题了,方便的话,把V信发来,我加你,帮你一起看下 
Nice2cu 2025-5-8 08:53 回复TA
@dffzh :没有解决 
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

使用特权

评论回复
19
Nice2cu|  楼主 | 2025-5-8 18:03 | 只看该作者
已经解决,主要是有两个问题,第一个问题是DMA配置结构体的参数设置问题,正确应该使用:dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;
第二问题是DAC初始化的问题,正确初始化应该为一下代码:
//配置DAC输出引脚
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_DAC);
   
    gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_4);
    //gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
   
     //配置DAC
    dac_deinit(DAC0);
   
    //触发源选择(定时器5)
    dac_trigger_source_config(DAC0, DAC_OUT0, DAC_TRIGGER_T5_TRGO);
    //dac_output_buffer_disable(DAC0, DAC_OUT0);        //使用这个配置函数波形会出现偏移
    //触发使能
    dac_trigger_enable(DAC0, DAC_OUT0);
    dac_wave_mode_config(DAC0, DAC_OUT0, DAC_WAVE_DISABLE);
    dac_enable(DAC0, DAC_OUT0);
    //使能DAC的DMA
    dac_dma_enable(DAC0, DAC_OUT0);  

28597681c80f933e7c.png (140.86 KB )

28597681c80f933e7c.png

使用特权

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

本版积分规则

2

主题

17

帖子

0

粉丝