![cover](https://img-blog.csdnimg.cn/direct/fb4673e2a7cc4196b2425fbe949fe5fc.png)
MSPM0G3507之PWM
本文介绍了如何在MSPM0G3507中配置PWM。
*更新记录*
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](https://devpress.csdnimg.cn/e61278577bc94c83b8dd32b496fe4711.jpg)
为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。
更多推荐
所有评论(0)