This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好、Luke、
我们通过 SysConfig 工具使用 PWM 和计时器。现在我们需要在代码本身中加载占空比值。由于占空比在 SysConfig 中预定义为单个值、因此无法在代码中更改。因此、如何通过定义来更改代码中的占空比值 函数中的变量。
我们尝试将 PWM 和计时器外设组合在一起。代码编译无错误。但 我们将获得 PWM 或计时器输出的输出。请帮助我们尽快完成这些问题。
大家好、Mohankumar、
我创建了一个新的线程并将其移动到这里。 将来在讨论新主题时、请创建新主题、这将使其他用户能够找到相关主题的解决方案。
您可以通过调用相关函数来更改 PWM 的占空比。 调用 DL_TimerG_startCounter (PWM_0_INST);
uint16_t ccv = 30; //This is the capture compare value you want to set //Call this function to change the capture compare value DL_TimerG_setCaptureCompareValue(PWM_0_INST, ccv, DL_TIMER_CC_0_INDEX);
此致、
Luke
大家好、Mohankumar、
查看 您在这里发布的图表、您可以调用上面显示的函数、例如更改占空比。 如果您有 PWM_0_INST、则可以设置捕获比较值以匹配占空比、也可以使用 SysConfig 查找所需的数字。 然后、您可以根据 ADC 读数动态更改占空比。
uint16_t adcVal = 1000; if(adcVal < 1000) DL_TimerG_setCaptureCompareValue(PWM_0_INST, 1800, DL_TIMER_CC_0_INDEX); else if(adcVal < 2000) DL_TimerG_setCaptureCompareValue(PWM_0_INST, 1400, DL_TIMER_CC_0_INDEX); else if(adcVal < 3000) DL_TimerG_setCaptureCompareValue(PWM_0_INST, 600, DL_TIMER_CC_0_INDEX); else DL_TimerG_setCaptureCompareValue(PWM_0_INST, 200, DL_TIMER_CC_0_INDEX);
我建议使用 SysConfig 帮助根据您的配置查找占空比 CCV、只需打开 SysConfig 和代码选项卡(右上角的<>符号)并单击 ti_MSP_dl_config.c 即可
向下滚动到 PWM 初始化的位置、您可以看到用于设置捕获比较值的函数。 (此处为第150行)
当您更改占空比时、行将更新并显示更改、然后您可以获取此值并在代码中放置相同的值。
此致、
Luke
您好、Luke、
我们使用 Timer_0来生成 400ms 计时器、在该计时器中断中、我们添加了一个标志来确认计时器中断正在工作、并 使用它来切换 LED。我们将获得所需的输出 (即400ms 开/关)、但我们无法 获取标志的更新值(即 e flag=1)。因此、请帮助我们在计时器中断函数中添加变量。
大家好、Mohankumar、
您能否共享您的计时器 ISR? 此外、在计时器 ISR 中放置一个断点、以验证是否已到达计时器 ISR。
此致、
Luke
您好、Luke、
我们 在 ISR 计时 器函数中设置断点、它 位于 ISR 函数循环内部、我们将其称为 LED 切换函数、但如果我们设置变量(flag)、则无法获取该变量的设置值。
void timer_0_INST_IRQHandler (void)
{
静态 uint16_t count = timer_800_milliseconds;
开关(DL_TimerG_getPendingInterrupt (TIMER_0_INST))
{
案例 DL_TIMER_IIDX_ZERO:
/*
*计数器停止以避免与计时器读数发生冲突
*正在设置的加载值
*
DL_TimerG_stopCounter (timer_0_INST);
/*
*在复位前、计数以0.05s 的增量逐渐变小
* 0.5s
*
uint32_t count = timer_800_milliseconds;
DL_Timer_setLoadValue (TIMER_0_INST、COUNT);
/*
*默认情况下、这应加载新的计数值并递减计数
*从那里(CVAE = 0)
*
DL_TimerG_startCounter (timer_0_INST);
DL_GPIO_togglePins (GPIO_LED_PORT、GPIO_LED_USER_LED_1_PIN);
flag =~ flag;
中断;
默认值:
中断;
}
}
大家好、Mohankumar、
如果您希望每次切换标志。
将 FLAG =~标志;更改为 FLAG =!FLAG;
否则、我会将变量显式设置为所需的值。
在这里、位数学对您不利、您可以单步执行反汇编以查看此处的差异。 如果变量是 char (如果变量是 bool、则不起作用)、您还可以将运算更改为 flag =~(flag & 0xFF)。
此致、
Luke
您好、Luke、
我们尝试了上述指令 来设置变量(flag)。不起作用、我们无法获取变量的设置值。
flag= !flag;
大家好、Mohankumar、
标志是什么类型的变量? 变量是否在 ISR 范围内?
我使用了 timx_timer_mode_periode_sleep 示例、并在 ISR 中放置了一个正在切换的 bool、下面是略微修改的代码。
#include "ti_msp_dl_config.h" bool check = false; int main(void) { SYSCFG_DL_init(); NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN); DL_SYSCTL_enableSleepOnExit(); DL_TimerG_startCounter(TIMER_0_INST); while (1) { __WFI(); } } void TIMER_0_INST_IRQHandler(void) { switch (DL_TimerG_getPendingInterrupt(TIMER_0_INST)) { case DL_TIMER_IIDX_ZERO: DL_GPIO_togglePins(GPIO_LEDS_PORT, GPIO_LEDS_USER_LED_1_PIN); check = !check; break; default: break; } }
此致、
Luke