[PIC®/AVR®/dsPIC®产品] 如何解决MCC配置上的PWM占空比分辨率低问题

[复制链接]
 楼主| gaoyang9992006 发表于 2021-10-14 20:58 | 显示全部楼层 |阅读模式
在进行舵机控制的PWM设置上,发现PWM的MCC图形化配置只能精度按照1%进行调节。如下图所示,你所设置的参数会按照四舍五入进行取整。

需求:
SG90舵机的控制是用50Hz频率的PWM波进行控制的,即周期为20ms
而高电平持续时间为0.5ms~2.5ms
即对应的占空比为2.5%~12.5%
为了实现精细化调节,该如何做呢?

我们可以对配置好的代码进行观察,发现初始化代码中以下内容是跟周期与占空比相关的寄存器设施。
  1.     //PWMPRL 135;
  2.     PWM1PRL = 0x87;
  3.     //PWMPRH 19;
  4.     PWM1PRH = 0x13;

  5.     //PWMS1P1L 150;
  6.     PWM1S1P1L = 0x96;

  7.     //PWMS1P1H 0;
  8.     PWM1S1P1H = 0x00;
另外MCC提供了以下函数进行相同的操作。因此我们可以利用该函数实现精细化调节的重新配置,或修改以上代码实现。
  1. void PWM1_16BIT_WritePeriodRegister(uint16_t periodCount)
  2. {
  3.     PWM1PRL = (uint8_t)periodCount;
  4.     PWM1PRH = (uint8_t)(periodCount >> 8);
  5. }

  6. void PWM1_16BIT_SetSlice1Output1DutyCycleRegister(uint16_t registerValue)
  7. {   
  8.     PWM1S1P1L = (uint8_t)(registerValue);
  9.     PWM1S1P1H = (uint8_t)(registerValue >> 8);
  10. }
0x1387对应十进制的4999
0x0096对应十进制的150
150/(4999+1)=0.03
因此我们只需要修改0x0096到一个合适的位置让新的数字除以5000=0.025即可
也就是0.025*5000=125
所以我们修改
    //PWMS1P1L 125;
    PWM1S1P1L = 0x7d;

    //PWMS1P1H 0;
    PWM1S1P1H = 0x00;

其他不变
即可实现初始化时候为2.5%的占空比。
过程中还可以调用以上函数进行占空比的精细化修改。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
lcczg 发表于 2021-10-15 11:09 | 显示全部楼层
深入研究,点赞楼主。
skyred 发表于 2021-10-15 15:08 | 显示全部楼层
恩,不能完全依赖软件,
搞懂原理才是王道~
 楼主| gaoyang9992006 发表于 2021-10-15 15:48 | 显示全部楼层
skyred 发表于 2021-10-15 15:08
恩,不能完全依赖软件,
搞懂原理才是王道~


就是懂原理才知道怎么找到在哪儿修改的,软件唯一的好处是不用记住他们这些寄存器的名字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2046

主题

16356

帖子

221

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