[其他] HC32F460——PWM输出占空比错误与解决方案

[复制链接]
2668|17
 楼主| yellow555 发表于 2023-4-26 16:14 | 显示全部楼层 |阅读模式
阅读本文,您可能需要掌握的知识:
本文使用的是DDL3.0.0库函数。接口为官方最新的函数API。采用的操作为官方的DEMO操作稍加修改。
QQ截图20230426161438.jpg

评论

———————————————— 版权声明:本文为CSDN博主「GreenDreamer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/a982606774/article/details/126805498  发表于 2023-4-26 16:16
 楼主| yellow555 发表于 2023-4-26 16:15 | 显示全部楼层
故障出现

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

这里发现当前的输出波形乱七八糟,各种奇奇怪怪的显示方案。随后查看官方对于当前库函数的定义协议。
 楼主| yellow555 发表于 2023-4-26 16:15 | 显示全部楼层
发现如下代码

  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url]  Set a default value for the PWM initialization structure.
  3. * @param  [out] pstcPwmInit            Pointer to a stc_tmra_pwm_init_t structure value that
  4. *                                      contains the configuration information for PWM.
  5. * @retval int32_t:
  6. *           - LL_OK:                   No error occurred.
  7. *           - LL_ERR_INVD_PARAM:       pstcPwmInit == NULL.
  8. */
  9. int32_t TMRA_PWM_StructInit(stc_tmra_pwm_init_t *pstcPwmInit)
  10. {
  11.     int32_t i32Ret = LL_ERR_INVD_PARAM;

  12.     if (pstcPwmInit != NULL) {
  13.         pstcPwmInit->u32CompareValue         = TMRA_REG_VALUE_MAX;
  14.         pstcPwmInit->u16StartPolarity        = TMRA_PWM_HIGH;
  15.         pstcPwmInit->u16StopPolarity         = TMRA_PWM_LOW;
  16.         pstcPwmInit->u16CompareMatchPolarity = TMRA_PWM_INVT;
  17.         pstcPwmInit->u16PeriodMatchPolarity  = TMRA_PWM_INVT;
  18.         i32Ret = LL_OK;
  19.     }

  20.     return i32Ret;
  21. }

 楼主| yellow555 发表于 2023-4-26 16:15 | 显示全部楼层
这里可以看到,官方人员想的还是蛮周到的,在开始时高电平,关闭的时候低电平,捕获、更新时反转当前电平。

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

但是实际上输出的情况惨不忍睹。
 楼主| yellow555 发表于 2023-4-26 16:15 | 显示全部楼层
笔者的代码逻辑
938186448ddb404857.png
 楼主| yellow555 发表于 2023-4-26 16:16 | 显示全部楼层
查找问题

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

检查了这个参数后,笔者发现在period时可能会出现无法翻转的情况。亦或者是其控制寄存器卡在了未知的控制逻辑下。也就是说,有可能出现在update之后,异常的翻转导致当前的结构出现误判(笔者怀疑可能有未知通道的输出被触发,但是实在没有证据,因为如果内部捕获输出操作本身有问题,那么笔者的使用方式也会有问题,所以肯定底层是正常的),这种情况下几乎是必然的。
 楼主| yellow555 发表于 2023-4-26 16:17 | 显示全部楼层
随后笔者采用了莽着来的定点清楚的操作:
  1.        
  2.         (void)TMRA_PWM_StructInit(&stcPwmInit);
  3.    
  4.      stcPwmInit.u16StartPolarity        = TMRA_PWM_LOW;
  5.      stcPwmInit.u16StopPolarity         = TMRA_PWM_HIGH;
  6.      stcPwmInit.u16CompareMatchPolarity = TMRA_PWM_HIGH;
  7.      stcPwmInit.u16PeriodMatchPolarity  = TMRA_PWM_LOW;
  8.      GPIO_SetFunc(GPIO_PORT_A, GPIO_PIN_04, TMRA_PWM_PIN_FUNC);
  9.     stcPwmInit.u32CompareValue = ret_compare;
  10.     (void)TMRA_PWM_Init(CM_TMRA_3, TMRA_CH5, &stcPwmInit);
  11.     TMRA_SetPeriodValue(CM_TMRA_3,ret_period);
  12.    TMRA_SetCompareValue(CM_TMRA_3, TMRA_CH5, ret_compare);

 楼主| yellow555 发表于 2023-4-26 16:18 | 显示全部楼层

 楼主| yellow555 发表于 2023-4-26 16:18 | 显示全部楼层
总结

这个计算方式写死了当前的接口状态。在现在PWM的结构下可以使用,但是可能在其他的状态下出现异常的情况。比如在三角波的情况下触发,所以可能也是官方并没有完全进行测试。否则一个判断语句也就可以了
Henryko 发表于 2023-5-12 23:45 | 显示全部楼层
库函数的定义有问题?
hfbuhun 发表于 2023-6-14 19:22 | 显示全部楼层
TMRA_PWM_StructInit(stc_tmra_pwm_init_t *pstcPwmInit)只是将pstcPwmInit配置为默认值,实际使用需要根据使用场景对pstcPwmInit做配置。
勇者无惧你和我 发表于 2023-6-26 11:11 | 显示全部楼层
是不是定义的问题造成的,而不是本身的问题。
勇者无惧你和我 发表于 2023-6-26 11:16 | 显示全部楼层
库函数有问题。
自己的灌饼 发表于 2023-6-26 11:22 | 显示全部楼层
这个是库函数的定义问题。
ynndmalh21 发表于 2023-6-26 11:33 | 显示全部楼层
这个需要好好的查看一下问题。
feifeifeichang 发表于 2024-4-26 10:47 | 显示全部楼层
库函数本身定义的问题啊
lvuu 发表于 2024-4-30 16:40 来自手机 | 显示全部楼层
这个计算方式写死了当前的接口状态
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

469

帖子

3

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