我正在尝试开发一种延迟发生器,它可以在短时间内产生50个“脉冲”,然后保持更长的时间,然后重复。我熟悉使用MSP430作为恒定PWM源,但我不确定脉冲的最佳方法是什么,即,对x个脉冲进行PWM,然后保持。
我已经附上了一个问题的图纸,我将添加我的代码,以便任何人都可以看到我解决问题的方法。
我对MSP430的使用还是个新手,我的大部分经验都来自于Arduino,所以我的代码可能不能像预期的那样工作(它有一个问题)。我更感兴趣的是如何解决这个问题,而不是解决我附加的代码。

#include <msp430.h>
int i;
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= BIT2; // P1.2 output
P1SEL = BIT2; // Select PWM function for P1.2
P1REN = BIT1; // enable pull up resistor for button P1.1
P1IE |= BIT1; // Interrupt enabled for P1.1
P1IES |= BIT1; // Interrupt active on falling edge
__bis_SR_register(GIE); // Global Interrupt Enable
__no_operation(); // For debugger
}
#pragma vector = PORT1_VECTOR
__interrupt void PORT_1(void) {
for (i = 50; i = 0; i--) {
TA0CCR0 = 50000; // PWM Period
TA0CTL = TASSEL_2 + MC_1; // SMCLK, upmode
}
P1IFG &= ~BIT1;
}发布于 2020-09-11 17:06:03
要产生脉宽调制,请使用所需的间隔对CCR0和CCRx进行编程,将定时器设置为up模式,并将输出模式设置/复位或复位/设置:

要获得50个脉冲,您必须等到第50个脉冲发生,然后停止计时器。要等待脉冲结束,应为下降沿发生的中断添加中断处理程序(用于复位/置位模式的TAIFG或TACCR0 CCIFG,或用于置位/复位模式的TACCRx CCIFG ),递增计数,如果计数达到50则停止。
发布于 2020-09-18 14:25:47
请求的伪代码形式的示例irq处理程序:
切记根据占空比对TACCR1进行编程,并在输出模式下对定时器进行编程。在定时器设置完成后,您可以将cpu置于主睡眠状态。
伪代码:
static int counter = 0;
void timer_taccr0_irq_handler() //overflow
{
if (counter == 49) {
TACCR0 = <longperiod>;
TACCTL0 &= OUTMOD_RESET_MODE;
}
else if (counter == 0)
{
TACCR0 = <short period>
TACCTL0 |= OUTMOD_RESET_SET_MODE;
}
if (++counter > 49)
counter = 0;
}发布于 2020-09-23 03:30:49
@Damiano我能够在你的帮助下产生50个脉冲。然而,引脚电压值在第50个脉冲之后保持恒定

#include <msp430.h>
static int counter = 0;
int main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR |= BIT2;
TA0CCTL0 = CCIE;
TA0CCR0 = 10000;
TA0CTL = TASSEL_2 + MC_1 + TACLR;
__bis_SR_register(LPM0_bits + GIE);
__no_operation();
}
// Timer0 A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
P1OUT ^= BIT2;
++counter;
if (counter == 99) {
TA0CCR0 = 20000;
TA0CCTL0 &= OUTMOD_7;
}
else if (counter == 0) {
TA0CCR0 = 10000;
TA0CCTL0 |= OUTMOD_7;
}
if (counter > 99) {
counter = 0;
P1OUT ^= BIT2;
TA0CCTL0 = OUTMOD_7;
}
}https://stackoverflow.com/questions/63838695
复制相似问题