使用定时器输出PWM
目的:参加电赛,学习记录,创作者的视角来学习。
使用芯片:LP-MSPM0G3507
工具:ccs
例程:timx_timer_mode_pwm_edge_sleep
学习PWM,通过生成不同占空比,不P同周期的WM来控制云台等。
首先在ccs中使用syscfg工具对TIME_PWM配置。
跟定时器的配置一样 ,命名。
对信号基础设置Basic Configuration
Timer Clock Source一般都使用BUSCLK
Calculated Timer Clock Values进一步分频,得到需要的频率。Start Timey一般不勾选,通过代码启动。
PWM的设置PWM Configuration
PWM Mode:有3个选项。Edge-aligned Down Counting和Edge-aligned Up Counting为边缘对齐的PWM信号。Center-aligned中心对齐的PWM信号。
PWM channel一个定时器可以同时输出4条PWM波。频率相同,后面可以设置不同的占空比。
对不同PWM设置占空比
设置不同占空比Desired Duty Cycle (%)
后面的设置
高级设置不常用,在输出PWM波是不用中断。
Pin Configuration引脚设置
PinMuxPeripheral and Pin Configuration为选择哪个定时器输出以及输出引脚设置。
在主程序的代码中,代码简单。大多是由syscfg配置完成。后期我们可以通过代码来设置控制占空比。
DL_TimerG_startCounter(PWM_0_INST);//定时器开始计数
DL_Timer_startCounter
作用启动定时器计数器
DL-GPIO_rest
作用:
通过代码来控制占空比。
原理:通过定义一个函数来控制占空比。
通过查阅 Generated Source 中的.h头文件,我们知道了控制占空比的函数为DL_TimerG_setCaptureCompareValue()
格式如下:DL_TimerG_setCaptureCompareValue(PWM_0_INST, 70, DL_TIMER_CC_0_INDEX);
中间的数值为Counter Compare Value与占空比相关。它的计算方式是
Counter Compare Value等于PWM Period Count减去PWM Period Count乘以占空比
例如:70=100-100*30%
关系还有:PWM Period Count乘以Calculated PWM Frequency (Hz)等于Calculated Clock Frequency (Hz)
函数DL_Timer_setCaptureCompareValue
作用:设置计时器捕获比较值。
格式:
第一个代码:通过按键改变输出的PWM
#include "ti_msp_dl_config.h"
int main(void)
{
SYSCFG_DL_init();
DL_TimerG_startCounter(PWM_0_INST );//开始定时器计数,产生PWM波
while (1) {
if (DL_GPIO_readPins(GPIO_BUTTON_PORT ,GPIO_BUTTON_PIN_S2_PIN ))
//通过按键来改变占空比。
{
DL_TimerG_setCaptureCompareValue(PWM_0_INST, 179, DL_TIMER_CC_0_INDEX);
DL_TimerG_setCaptureCompareValue(PWM_0_INST, 76, DL_TIMER_CC_1_INDEX);
}
else {
DL_TimerG_setCaptureCompareValue(PWM_0_INST, 76, DL_TIMER_CC_0_INDEX);
DL_TimerG_setCaptureCompareValue(PWM_0_INST, 179, DL_TIMER_CC_1_INDEX);
}
}
}
第二的代码:通过包装一个函数,控制占空比
#include "ti_msp_dl_config.h"
void set_duty(float duty,uint8_t channe1)//定义函数,进行变量控制
{
uint32_t Comparevalue;//代表syskgf中的PWM Period Count
Comparevalue=100-100*duty;//计算Comparevalu,代表的是占空比
if (channe1==0)
{
DL_TimerG_setCaptureCompareValue(PWM_0_INST,Comparevalue, DL_TIMER_CC_0_INDEX);
}
else if (channe1==1) {
DL_TimerG_setCaptureCompareValue(PWM_0_INST, Comparevalue, DL_TIMER_CC_1_INDEX);
}
}
int main(void)
{
SYSCFG_DL_init();
DL_Timer_startCounter(PWM_0_INST );//开始定时器计数,产生PWM波
while (1) {
if (DL_GPIO_readPins(GPIO_BUTTON_PORT ,GPIO_BUTTON_PIN_S2_PIN ))
{
set_duty(0.3,0);
set_duty(0.7,1);
}
else
{
set_duty(0.7,0);
set_duty(0.3,1);
}
}
}
第三个代码:通过包装两个函数,来控制PWM的频率和占空比并用按键切换
#include "ti_msp_dl_config.h"
uint32_t period;//定义频率
void set_freq(uint32_t freq,uint8_t channe1)//包装函数,改变方波频率
{
period=PWM_0_INST_CLK_FREQ /freq;//宏定义PWM_0_INST_CLK_FREQ直接调用。
//计算频率
DL_Timer_setLoadValue(PWM_0_INST,period);
}
void set_duty(float duty,uint8_t channe1)//定义函数,进行变量控制
{
uint32_t Comparevalue;
Comparevalue=period-period*duty;//计算Comparevalu,代表的是占空比
if (channe1==0)
{
DL_TimerG_setCaptureCompareValue(PWM_0_INST,Comparevalue, DL_TIMER_CC_0_INDEX);
}
else if (channe1==1) {
DL_TimerG_setCaptureCompareValue(PWM_0_INST, Comparevalue, DL_TIMER_CC_1_INDEX);
}
}
int main(void)
{
SYSCFG_DL_init();
DL_Timer_startCounter(PWM_0_INST );
while (1) {
if (DL_GPIO_readPins(GPIO_BUTTON_PORT ,GPIO_BUTTON_PIN_S2_PIN ))
{
set_freq(100, 1);
set_duty(0.3,0);
set_duty(0.7,1);
}
else
{
set_freq(200, 1);
set_duty(0.7,0);
set_duty(0.3,1);
}
}
}