器件型号:MSP432P401R
工具/软件:Code Composer Studio
大家好、我想在突发模式下使用 MSP432 PWM、这是可行的吗?
如果没有、TI 是否有任何 IC 可以使我在突发模式下形成方波?
我需要设置突发中的平方量和从一个到另一个的距离时间。
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.
器件型号:MSP432P401R
工具/软件:Code Composer Studio
大家好、我想在突发模式下使用 MSP432 PWM、这是可行的吗?
如果没有、TI 是否有任何 IC 可以使我在突发模式下形成方波?
我需要设置突发中的平方量和从一个到另一个的距离时间。
您好、Michael、
感谢您的解释!
如果 PWM 和突发的分辨率为15位、那么所有这些都能满足 您的要求、
我有一些您可能喜欢的东西。
仅1个计时器、无外部逻辑。
只需将输出模式设置为010 Toggle / Reset 即可。
当定时器计数到 TAxCCRn 值时、输出被切换。
当定时器计数到 TAxCCR0值时、它被复位。
TAxCCRn 评估您的 RECT 值。
TAxCCR0会分配您的 RECT +距离值。
它能解决您的问题吗?
如果是、请将此主题标记为已回答。
我会永远记住你的突发:-)
此致、
Tomasz
您好、Tomasz、
我更喜欢您的想法、因为我只能使用 MSP432来执行突发。
我在设置两个计时器以执行突发时遇到了一些问题。
您可以在附件中找到我的 code.e2e.ti.com/.../3731.timer_5F00_a_5F00_pwm_5F00_mode.c
我将使用两个计时器 TIMER_A0_BASE 和 TIMER_A1_BASE、并在 GPIO 引脚上单独输出、以使用示波器进行测量并理解。
我使用 driverlib 来生成 PWM。
黄色:4MHz PWM 信号
蓝色:栅极和定时控制
唯一的问题是未同步。 现在、我如何将这两个信号与一个计时器混合在一起?
好的、我提供的超快、超脏的示例。
主要思路:我们使用 CCR0和 CCR1 ISR、计时器处于向上计数模式
1) 1) CCR0用于 Rect 时间和距离时间。 虽然我们处于距离时间内、但我们不会输出任何 PWM、但我们通过将 CCR1设置为 CCR0 + 1 (以便 CCR1中断永远不会达到)来确保
2) 2)当我们切换到 Rect 时间(计时器溢出)时、我们通过将 CCR1值更改为 PWM 时间来启动突发、然后在 CCR1 ISR 内部切换开/关时间、直到 wi 再次命中 CCR0。
/* 我们假设 SMCLK 为源~ 3MHz、因此 *采样= 1/3MHz = 333nsec * PWM 导通时间= 300 *采样= 100usec; * PWM 关闭时间= 150 *采样= 50 μ s *且 PWM 周期= 150 μ 秒、占空比= 66.6% * Rect 时间= 3000 *采样= 1毫秒 *距离= 6000 *采样= 2毫秒 *静态 uint16_t u16PwmOnTime = 300; 静态 uint16_t u16PwmOffTime = 150; 静态 uint16_t u16RectTime = 3000; 静态 uint16_t u16DistanceTime = 6000; 静态 bool bPwmHigh = false; 静态 bool bBurstTime = false; int main (void) { WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD; P2->DIR |= BIT4; P2->SEL0 |= BIT4; // TACCR0 Timer_A0->CCTL[0]= TIMER_A_CCTLN_CCIE; Timer_A0->CCR[0]= u16DistanceTime; //我们从距离时间开始 // TACCR1 TIMER_A0->CCTL[1]= TIMER_A_CCTLN_OUTMOD_2 | TIMER_A_CCTLN_CCIE; Timer_A0->CCR[1]= u16DistanceTime + 1; //我们不应在距离时间内切换 // ACLK、CONT 模式 Timer_A0->CTL = TIMER_A_CTL_ssel_SMCLK | TIMER_A_CTL_MC_UP; SCB->SCR |= SCB_SCR_SLEEPONEXIT_MSK;//从 ISR 退出时启用睡眠 //确保 SLEEPONEXIT 立即生效 _DSB(); //启用全局中断 __ENABLE_IRQ(); NVIC->ISER[0]|= 1 <<(TA0_N_IRQn)& 31); NVIC->ISER[0]|= 1 <<(TA0_0_IRQn)& 31); _SLEEP(); __no_operation(); //对于调试 器} void TA0_0_IRQHandler (void) { Timer_A0->CCTL[0]&&~Timer_A_CCTLN_CCIFG; if (bBurstTime = true) { bBurstTime = false; //重置到距离时间和“关闭”CCR1 Timer_A0->CCR[0]= u16DistanceTime; Timer_A0->CCR[1]= u16DistanceTime + 1; } 其他 { bBurstTime = true; //启动突发、将 CCR1设置为 PWM 关闭时间(我们也可以从开启开始-没关系) Timer_A0->CCR[0]= u16RectTime; Timer_A0->CCR[1]= u16PwmOffTime; bPwmHigh = false; } } void TA0_N_IRQHandler (void) { if (timer_A0->CCTL[1]&timer_A_CCTLN_CCIFG) { Timer_A0->CCTL[1]&&~Timer_A_CCTLN_CCIFG; if (bPwmHigh = true) { bPwmHigh = false; Timer_A0->CCR[1]+= u16PwmOffTime; } 其他 { bPwmHigh = true; Timer_A0->CCR[1]+= u16PwmOnTime; } }
第一张图片:突发(1毫秒分辨率)、第二张图片:PWM 本身(50微秒分辨率)。
请记住、这不是很可靠:在 ISR 内动态调整 PWM。
您好 Andrei、
我做了一些修改、但仍然无法在没有中断的情况下工作、而是使用外部和。
为了确保这2个计时器是同步的、我使用 TIMER_A1_BASE (4MHz)作为"突发矩形"发生器、并将其作为 TIMER_A0_BASE 的输入时钟从外部接线。
Timer_A0_BASE 也会生成 PWM、但会使用 TIMER_A1_BASE 作为时钟、在这里我知道我是同步器。 两者都需要进入和逻辑 IC、TIMER_A0_BASE 控制突发时间和距离。
这个代码不需要 CPU 来执行任何 ISR 来改变计数器、以此类推。
以下是我的代码:
/* DriverLib 包括*/
#include
/*应用程序定义*/
#define TIMER_PERIOD 6.
#define TIMER_PERIOD_distance 12.
#define TIMER_PERIOD_BURST 16.
#define Duty_Cyclle1 3.
#define DUTY CYCLE2
/* Timer_A 上行配置参数*/
CONST Timer_A_UpDownModeConfig upDownConfig =
{
Timer_A_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源
Timer_A_CLOCKSOURCE_divider _1、 // SMCLK/1 = 3MHz
Timer_Period、 // 127个周期
Timer_A_TAIE_INTERRUPT_DISABLE、 //禁用计时器中断
Timer_A_CCIE_CCR0_INTERRUPT_DISABLE、 //禁用 CCR0中断
Timer_A_do 清除 //清除值
};
/* Timer_A 比较配置参数 (PWM1)*/
CONST Timer_A_CompareModeConfig compareConfig_PWM1 =
{
Timer_A_CAPTURECOMPARE 寄存器_1、 //使用 CCR1
Timer_A_CAPTURECMOLE_INTERRUPT_DISABLE、 //禁用 CCR 中断
Timer_A_OUTPUTMODE_TOGGLE_SET、 //切换输出但是
Duty_Cyclle1 // 32占空比
};
Timer_A_PWMConfig pwmConfig2 =
{
Timer_A_CLOCKSOURCE_EXTERNAL_TXCLK、//TIMER_A_CLOCKSOURCE_EXTERNAL_TXCLK、
Timer_A_CLOCKSOURCE_DEVIDER_1、//8MHz = Timer_A_CLOCKSOURCE_DEVIDER_3 4MHz = Timer_A_CLOCKSOURCE_DEVIDER_6 2MHz = Timer_A_CLOCKSOURCE_DEVIDER_12
Timer_Period_burst、
Timer_A_CAPTURECOMPARE 寄存器_1、
Timer_A_OUTPUTMODE_TOGGLE_RESET、
Timer_Period_Distance
};
int main (空)
{
/*停止 WDT */
MAP_WDT_A_HOLDTimer();
GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_Function);
cs_setExternalClockSourceFrequency (32768、48000000);
PCM_setCoreVoltageLevel (PCM_VCORE1);
FlashCtl_setWaitState (FLASH_BANK0、2);
FlashCtl_setWaitState (FLASH_BANK1、2);
CS_startHFXT (false);
CS_initClockSignal (CS_MCLK、CS_HFXTCLK_select、CS_Clock_divider);
CS_initClockSignal (CS_SMCLK、CS_HFXTCLK_select、CS_clock_divider);// MHz
/*为 CCR 设置 P7.7和 P7.6以及外设输出*/
MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P7、GPIO_PIN7、GPIO_PRIMARY_MODULE_Function);
MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN4、GPIO_PRIMARY_MODULE_Function);
MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P7、GPIO_PIN1、GPIO_PRIMARY_MODULE_Function);
/*将 Timer_A1配置为上行模式并启动*/
MAP_Timer_A_configureUpDownMode (timer_A1_base、&upDownConfig);
MAP_Timer_A_startCounter (timer_A1_base、timer_A_updown_mode);
MAP_Timer_A_initCompare (timer_A1_base、&compareConfig_PWM1);
MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig2);
/*不使用时睡眠*/
while (1)
{
MAP_PCM_gotoLPM0 ();
}
}
OBS:对于和逻辑芯片、我找到 了 TI 的 SN74AHC1G09