*更新记录*

        2024-7-20:修正10kHz测试中的表述错误。

1、相关配置

        主控:MSPM0G3507SPTR(48角)

        相关配置:Keil,版本:5.33

2、Sysconfig配置

        图中,④处的分频决定了我们能选择的PWM频率范围(⑤处)。另外⑧处个人建议不打勾,在软件中通过DL_TimerA_startCounter()进行启动,防止PWM初始化后,电机误动作(此处为笔者的个人理解,具体有没有效果未经验证,大家嫌麻烦也可以勾上)。

        ④中的占空比为PWM初始化完成后的占空比,一般可以设置成0,安全一点。后续我们仍可以在代码中修改占空比 。同时在修改④的时候,上面的“Desired Duty Cycle”会自动修改,不需要我们去设置。笔者对①和⑤没有过多的研究,有兴趣可以去翻翻“MSPM0 G-Series 80-MHz Microcontrollers”这个技术手册。

        在Sysconfig右下角,我们将鼠标移动到序号27上时,会弹出小窗,提供相关信息给我们。 

        至此,PWM的配置就完成了,别忘了保存。同时笔者还设置了一个50Hz的PWM用于控制舵机,这里就不展示了,配置差不多相同。

3、函数设计  

        为了调节PWM的占空比,我们需要用到 DL_TimerA_setCaptureCompareValue()这个函数。它有三个入口参数,第一个为选择哪个定时器,第二个为占空比,第三个为哪个PWM通道。(这部分我的理解可以存在偏差,欢迎指正)。

DL_TimerA_setCaptureCompareValue(PWM_10KHZ_INST, 10, DL_TIMER_CC_0_INDEX);

        接下来我们就可以设计一个电机的控制代码,两个PWM通道分别控制左右电机。

        这里我们将输入参数乘以10后作为占空比,目的是将输入参数的范围设定在0-100之间,更加容易理解。通过前面Sysconfig的配置我们可以发现,PWM Period Count被配置为1000。也就是说,当我们占空比设置为500时,该通道会输出50%的占空比,而我们提前乘以一个系数10,就只需输出50即可(该设置为笔者个人的习惯,为了参数设置更加方便,不用计算到底填多少才是想要的占空比,直接填0-100即可)。

/**
 * @函数介绍: 电机速度控制
 * @输入参数: 
 * @param {uint16_t} left_speed :左电机速度
 * @param {uint16_t} right_speed;右电机速度
 * @输出参数: 无
 * @说明: 
 * 1.该函数有两个输入参数,输入范围为0-95,值越大,电机速度越快
 * 2.常见的电机驱动(如得科、自制绿色驱动),
 * 控制采用类似IR2104的方案,该方案中需要自举电容进行充放电,
 * 才能使得上管MOS正常导通,这类驱动使用中需要注意的是,
 * PWM占空比不能达到100%(得科商品信息中有说明),所以代码中限制在95%以内
 * 实际用户在给PWM时也请将占空比限制在95%以内。
 */
void Motor(uint16_t motor_left_speed, uint16_t motor_right_speed)
{
    if ((motor_left_speed > 95) || (motor_right_speed > 95)) // 一定要限制!!!
        return; // PWM占空比不允许大于95%,否则就直接退出
    DL_TimerA_setCaptureCompareValue(PWM_10KHZ_INST, motor_left_speed  * 10, DL_TIMER_CC_0_INDEX);
    DL_TimerA_setCaptureCompareValue(PWM_10KHZ_INST, motor_right_speed * 10, DL_TIMER_CC_1_INDEX);
}

        在主函数中,记得添加上DL_TimerA_startCounter(),否则PWM无法工作。当然大家可以放在自己想要的地方进行启动。

        在while(1)循环中,我们使两个封装好的函数进行PWM占空比的控制。Servo_Motor()的代码与 Motor()的代码近似,就不过多赘述了。

#include "ti_msp_dl_config.h"
#include "config.h"

/**
 * @函数介绍: main函数 
 * @说明: 无
 */
int main(void)
{
	SYSCFG_DL_init(); // 芯片资源初始化,由SysConfig配置软件自动生成
	DL_TimerA_startCounter(PWM_10KHZ_INST);//开始计数
	DL_TimerA_startCounter(PWM_50HZ_INST);//开始计数
	while(1)
	{
		Motor(20,40); // 左电机25的速度,右电机50的速度,简洁明了
		Servo_Motor(60,80); // 舵机PWM控制
	}
}

         通过代码我们可以发现,我们配置左电机的占空比为20,右电机的占空比为40(舵机同理)。通过合理封装,我们的代码将会更加简洁易懂。

4、实验效果

         首先我们对直流电机的10kHz的PWM信号进行测试。通过示波器我们可以发现,两个PWM的频率都为10kHz。绿色波形(左电机)的占空比为20%,黄色波形(右电机)的占空比为40%,符合设计需要。

         接着我们对舵机的50Hz的PWM信号进行测试。通过测试发现,两路舵机的PWM频率为50Hz,黄色波形的占空比为60%,绿色波形的占空比为80%,符合设计需要。

 5、总结

        PWM频率的配置需按实际对象设计,例如大家如果使用L298N进行驱动,则推荐使用1kHz的频率进行驱动。舵机的控制也不是给个占空比那么简单,需要进行合理的设计和封装。在设计PWM时需要注意的几个事项:

        1、需要选择合适的分频。

        2、“Start Timer”勾与不勾看大家选择。

        3、要会用DL_TimerA_setCaptureCompareValue()这个函数进行占空比的控制。

 2024-6-25-11:39,雨一直下~

Logo

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。

更多推荐