打印
[PIC®/AVR®/dsPIC®产品]

如何解决MCC配置上的PWM占空比分辨率低问题

[复制链接]
1698|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
在进行舵机控制的PWM设置上,发现PWM的MCC图形化配置只能精度按照1%进行调节。如下图所示,你所设置的参数会按照四舍五入进行取整。

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

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

    //PWMS1P1L 150;
    PWM1S1P1L = 0x96;

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

void PWM1_16BIT_SetSlice1Output1DutyCycleRegister(uint16_t registerValue)
{   
    PWM1S1P1L = (uint8_t)(registerValue);
    PWM1S1P1H = (uint8_t)(registerValue >> 8);
}
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
恩,不能完全依赖软件,
搞懂原理才是王道~


就是懂原理才知道怎么找到在哪儿修改的,软件唯一的好处是不用记住他们这些寄存器的名字。

使用特权

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

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1895

主题

15627

帖子

197

粉丝