• 我帮厂商找BUG系列之华大(小华)HC32F460——PWM输出占空比错误与解决方案


    0x00 前言

    阅读本文,您可能需要掌握的知识:

    本文使用的是DDL3.0.0库函数。接口为官方最新的函数API。采用的操作为官方的DEMO操作稍加修改。

    技能熟练度
    PWM了解
    C语言了解

    0x10 故障出现

    输出占空比的定时器为TIMERA的3通道PWM5,并且使用矩形波进行计数,

    这里发现当前的输出波形乱七八糟,各种奇奇怪怪的显示方案。随后查看官方对于当前库函数的定义协议。

    发现如下代码

    
    /**
     * @brief  Set a default value for the PWM initialization structure.
     * @param  [out] pstcPwmInit            Pointer to a stc_tmra_pwm_init_t structure value that
     *                                      contains the configuration information for PWM.
     * @retval int32_t:
     *           - LL_OK:                   No error occurred.
     *           - LL_ERR_INVD_PARAM:       pstcPwmInit == NULL.
     */
    int32_t TMRA_PWM_StructInit(stc_tmra_pwm_init_t *pstcPwmInit)
    {
        int32_t i32Ret = LL_ERR_INVD_PARAM;
    
        if (pstcPwmInit != NULL) {
            pstcPwmInit->u32CompareValue         = TMRA_REG_VALUE_MAX;
            pstcPwmInit->u16StartPolarity        = TMRA_PWM_HIGH;
            pstcPwmInit->u16StopPolarity         = TMRA_PWM_LOW;
            pstcPwmInit->u16CompareMatchPolarity = TMRA_PWM_INVT;
            pstcPwmInit->u16PeriodMatchPolarity  = TMRA_PWM_INVT;
            i32Ret = LL_OK;
        }
    
        return i32Ret;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    这里可以看到,官方人员想的还是蛮周到的,在开始时高电平,关闭的时候低电平,捕获、更新时反转当前电平。

    于是初始化为高,第一次捕获为低,更新时为高。第二次捕获时翻转为低。

    但是实际上输出的情况惨不忍睹。

    笔者的代码逻辑

    初始化占空比为1
    设置10*i的占空比捕获
    等待一秒钟

    这里可以看到当前设置的占空比乱七八糟的

    帮着大厂找bug之小华HC32F460 PWM输出bug

    0x20 查找问题

    在确定自己的计算方式没有问题后。笔者查到了上文的代码内。

    检查了这个参数后,笔者发现在period时可能会出现无法翻转的情况。亦或者是其控制寄存器卡在了未知的控制逻辑下。也就是说,有可能出现在update之后,异常的翻转导致当前的结构出现误判(笔者怀疑可能有未知通道的输出被触发,但是实在没有证据,因为如果内部捕获输出操作本身有问题,那么笔者的使用方式也会有问题,所以肯定底层是正常的),这种情况下几乎是必然的。

    随后笔者采用了莽着来的定点清楚的操作:

     	
    	(void)TMRA_PWM_StructInit(&stcPwmInit);
        
         stcPwmInit.u16StartPolarity        = TMRA_PWM_LOW;
         stcPwmInit.u16StopPolarity         = TMRA_PWM_HIGH;
         stcPwmInit.u16CompareMatchPolarity = TMRA_PWM_HIGH;
         stcPwmInit.u16PeriodMatchPolarity  = TMRA_PWM_LOW;
         GPIO_SetFunc(GPIO_PORT_A, GPIO_PIN_04, TMRA_PWM_PIN_FUNC);
        stcPwmInit.u32CompareValue = ret_compare;
        (void)TMRA_PWM_Init(CM_TMRA_3, TMRA_CH5, &stcPwmInit);
        TMRA_SetPeriodValue(CM_TMRA_3,ret_period);
       TMRA_SetCompareValue(CM_TMRA_3, TMRA_CH5, ret_compare);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    这种结构下,在捕获时固定为高电平极性,更新时固定为低电平极性。则更可靠。

    可以看一下同样的应用逻辑下的具体表现。

    帮着大厂找bug之小华HC32F460 PWM输出bug

    顺便@一下官方,帮忙解释一下到底为什么会这样。

    0x30 总结

    这个计算方式写死了当前的接口状态。在现在PWM的结构下可以使用,但是可能在其他的状态下出现异常的情况。比如在三角波的情况下触发,所以可能也是官方并没有完全进行测试。否则一个判断语句也就可以了

    本文首发自 我帮厂商找BUG系列之华大(小华)HC32F460——PWM输出占空比错误与解决方案,更多文章可进入我的博客详查。

  • 相关阅读:
    基于Jeecgboot前后端分离的流程管理平台演示系统安装(五)
    office的excel中使用,告诉我详细的解决方案,如何变成转化为金额格式
    Threejs 3D模型入门项目
    Java常用的设计模式,如单例模式、工厂模式、观察者模式等
    01 关系模型及其相关内容
    [附源码]Python计算机毕业设计SSM竞赛报名管理系统(程序+LW)
    Dos系统的Debug工具简单使用(2023.9.7)
    测试开发基础 | Python 算法与数据结构面试题系列一(附答案)
    redis 初识与入门
    自制操作系统日志——第十五天
  • 原文地址:https://blog.csdn.net/a982606774/article/details/126805498