打印

GD32F103全桥驱动

[复制链接]
955|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
weilaizhanshi|  楼主 | 2022-4-12 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用GD32的TIMER0产生4路PWM信号进行全桥驱动时,输出比较模式下,通过改变捕获/比较寄存器的值,调节单路PWM的相位时,该路PWM产生了两种不同的波形

使用特权

评论回复
评论
weilaizhanshi 2022-4-12 10:25 回复TA
在每次修改捕获/比较寄存器的值后,当计数器的值与其相同时,会出现两种状态 
沙发
weilaizhanshi|  楼主 | 2022-4-12 10:32 | 只看该作者
波形如下

微信图片_20220412102244.jpg (493.9 KB )

微信图片_20220412102244.jpg

使用特权

评论回复
评论
weilaizhanshi 2022-4-12 10:35 回复TA
怀疑是在每次修改后,该通道的电平状态不确定 
板凳
weilaizhanshi|  楼主 | 2022-4-12 10:42 | 只看该作者
相同的值,出现的两种不同的状态

状态2.jpg (457.75 KB )

相同值下状态1

相同值下状态1

状态1.jpg (448.23 KB )

状态2

状态2

使用特权

评论回复
地板
yangxiaor520| | 2022-4-13 09:54 | 只看该作者
波形看起来还不错

使用特权

评论回复
5
weilaizhanshi|  楼主 | 2022-4-13 14:49 | 只看该作者
一个值出现两种波形,不太好

使用特权

评论回复
6
王久强| | 2022-4-14 11:10 | 只看该作者
是PWM配置的问题吗?

使用特权

评论回复
7
weilaizhanshi|  楼主 | 2022-4-14 13:33 | 只看该作者
王久强 发表于 2022-4-14 11:10
是PWM配置的问题吗?

和配置无关,从STM32上移植过来的,配置完全相同,GD的就会有这个问题

使用特权

评论回复
8
lifeforrent| | 2022-4-14 14:09 | 只看该作者
楼主能针对配置和上面的波形再详细说明一下吗,我看了半天没看出什么

使用特权

评论回复
9
weilaizhanshi|  楼主 | 2022-4-14 14:33 | 只看该作者
lifeforrent 发表于 2022-4-14 14:09
楼主能针对配置和上面的波形再详细说明一下吗,我看了半天没看出什么

void Timer0_PWM_Init(void)
{
        timer_parameter_struct timer_initpara;
        timer_oc_parameter_struct timer_ocintpara;
        timer_break_parameter_struct timer_breakintpara;

        timer_deinit(TIMER0);

        /* TIMER0 configuration */
        timer_initpara.period            = PWMFreq_40K0/2;       
        timer_initpara.prescaler         = 0;
        timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
        timer_initpara.counterdirection  = TIMER_COUNTER_UP;
        timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;  //计数器的触发方式
        timer_initpara.repetitioncounter = 0;
        timer_init(TIMER0,&timer_initpara);
       
        timer_ocintpara.outputstate  = TIMER_CCX_ENABLE;  //配置比较输出状态使能
        timer_ocintpara.outputnstate = TIMER_CCXN_ENABLE; //配置互补比较输出状态使能
        timer_ocintpara.ocpolarity   = TIMER_OC_POLARITY_HIGH;  //有效电平极性高
        timer_ocintpara.ocnpolarity  = TIMER_OCN_POLARITY_HIGH;  //互补有效电平高
        timer_ocintpara.ocidlestate  = TIMER_OC_IDLE_STATE_LOW;   //空闲状态定时器输出引脚状态低
        timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;  //空闲状态互补输出引脚状态低

        timer_channel_output_config(TIMER0,TIMER_CH_0,&timer_ocintpara);
        timer_channel_output_config(TIMER0,TIMER_CH_1,&timer_ocintpara);

        timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,0);
        timer_channel_output_mode_config(TIMER0,TIMER_CH_0,TIMER_OC_MODE_TOGGLE);
        timer_channel_output_shadow_config(TIMER0,TIMER_CH_0,TIMER_OC_SHADOW_DISABLE);

        timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_1,0);
        timer_channel_output_mode_config(TIMER0,TIMER_CH_1,TIMER_OC_MODE_TOGGLE);
        timer_channel_output_shadow_config(TIMER0,TIMER_CH_1,TIMER_OC_SHADOW_DISABLE);

        timer_breakintpara.runoffstate = TIMER_ROS_STATE_DISABLE;
        timer_breakintpara.ideloffstate = TIMER_IOS_STATE_DISABLE;
        timer_breakintpara.protectmode = TIMER_CCHP_PROT_0;
        timer_breakintpara.deadtime = DEAD_CYCLE;
        timer_breakintpara.breakstate = TIMER_BREAK_DISABLE;
        timer_breakintpara.breakpolarity = TIMER_BREAK_POLARITY_LOW;
        timer_breakintpara.outputautostate = TIMER_OUTAUTO_ENABLE;
        timer_break_config(TIMER0,&timer_breakintpara);

        timer_primary_output_config(TIMER0,ENABLE);
        timer_auto_reload_shadow_enable(TIMER0);

        timer_enable(TIMER0);
}
以上为TIMER0的配置。
例如进行以下操作修改通道1的相位:
操作1:
timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_1,600);
操作2:
timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_1,0);
现象:
在修改相位为600时,会出现两种状态的波形

使用特权

评论回复
10
weilaizhanshi|  楼主 | 2022-4-14 14:34 | 只看该作者
weilaizhanshi 发表于 2022-4-14 14:33
void Timer0_PWM_Init(void)
{
        timer_parameter_struct timer_initpara;

在ST上这样操作不会出现这样的现象

使用特权

评论回复
11
lifeforrent| | 2022-4-14 14:55 | 只看该作者
你的意思是不是,绿色波形是通道0的输出,黄色波形是通道1的输出,程序刚开始运行时,两个通道比较值都为0,输出波形一致,当修改通道1的比较值为600后,通道1的输出波形改变,然后每次上电重启后,通道1输出的波形就会出现上面的两种状态。

使用特权

评论回复
12
weilaizhanshi|  楼主 | 2022-4-14 14:56 | 只看该作者
lifeforrent 发表于 2022-4-14 14:55
你的意思是不是,绿色波形是通道0的输出,黄色波形是通道1的输出,程序刚开始运行时,两个通道比较值都为0 ...

是的

使用特权

评论回复
13
weilaizhanshi|  楼主 | 2022-4-14 14:57 | 只看该作者

而且两种状态的出现完全是随机的

使用特权

评论回复
14
lifeforrent| | 2022-4-14 15:15 | 只看该作者
能不能把源程序发一下,我测一下

使用特权

评论回复
15
weilaizhanshi|  楼主 | 2022-4-14 15:27 | 只看该作者
lifeforrent 发表于 2022-4-14 15:15
能不能把源程序发一下,我测一下


test.zip

3.63 MB

使用特权

评论回复
16
lifeforrent| | 2022-4-14 15:59 | 只看该作者
按照你上面说的配置,我在F103上没有测出你说的现象,你给的程序里相位是不断变化的,测不出你说的现象,麻烦你提供下能测出上面现象的代码,我好复现你的问题

使用特权

评论回复
17
weilaizhanshi|  楼主 | 2022-4-14 16:14 | 只看该作者
lifeforrent 发表于 2022-4-14 15:59
按照你上面说的配置,我在F103上没有测出你说的现象,你给的程序里相位是不断变化的,测不出你说的现象,麻 ...

就是这个代码,多等一会就会出现的

使用特权

评论回复
18
weilaizhanshi|  楼主 | 2022-4-14 16:24 | 只看该作者
出现两种状态的原因是:在Stop_PWM()后,CH0为0,CH1有时为高有时为低,当再重启定时器后,CH0的第一个边沿会由高变低,但CH1会出现两种情况:

1. 当Stop_PWM()后CH1为高时,重启定时器后,CH1的第一个边沿会由高变低(波形与CH0趋势一致),即邮件中的状态1.

2. 当Stop_PWM()后CH1为低时,重启定时器后,CH1的第一个边沿会由低变高(波形与CH0趋势相反),即邮件中的状态2.



规避方法:要根据具体应用,保证以下两点

                 1. 在Stop_PWM()中加入禁能波形的时序判断,保证两通道STOP时波形一致

                 2. 在重新启动时,也要进行启动前的判断,保证两通道在启动前逻辑一致。

使用特权

评论回复
19
weilaizhanshi|  楼主 | 2022-4-14 16:36 | 只看该作者
weilaizhanshi 发表于 2022-4-14 16:24
出现两种状态的原因是:在Stop_PWM()后,CH0为0,CH1有时为高有时为低,当再重启定时器后,CH0的第一个边沿 ...

这个是解决办法,但是我不太懂“禁能波形的时序判断”是什么意思

使用特权

评论回复
20
lifeforrent| | 2022-4-14 19:02 | 只看该作者
我测了下,当开始通道比较影子功能,即timer_channel_output_shadow_config(TIMER0,TIMER_CH_1,TIMER_OC_SHADOW_ENABLE);然后程序中比较值配置为0,此时只是写入影子寄存器,等到下次更新事件到来时,将0写入通道比较寄存器,产生一次电平翻转,此时又由于计数器值和通道比较寄存器值都为0,再次发生比较事件,产生二次电平翻转,因此导致出现两次相位不同的波形,建议关闭通道比较影子功能。

使用特权

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

本版积分规则

3

主题

21

帖子

0

粉丝