首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带MSP430的脉宽调制“脉冲”

带MSP430的脉宽调制“脉冲”
EN

Stack Overflow用户
提问于 2020-09-11 06:59:36
回答 3查看 253关注 0票数 1

我正在尝试开发一种延迟发生器,它可以在短时间内产生50个“脉冲”,然后保持更长的时间,然后重复。我熟悉使用MSP430作为恒定PWM源,但我不确定脉冲的最佳方法是什么,即,对x个脉冲进行PWM,然后保持。

我已经附上了一个问题的图纸,我将添加我的代码,以便任何人都可以看到我解决问题的方法。

我对MSP430的使用还是个新手,我的大部分经验都来自于Arduino,所以我的代码可能不能像预期的那样工作(它有一个问题)。我更感兴趣的是如何解决这个问题,而不是解决我附加的代码。

代码语言:javascript
复制
#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;
  }
EN

回答 3

Stack Overflow用户

发布于 2020-09-11 17:06:03

要产生脉宽调制,请使用所需的间隔对CCR0和CCRx进行编程,将定时器设置为up模式,并将输出模式设置/复位或复位/设置:

要获得50个脉冲,您必须等到第50个脉冲发生,然后停止计时器。要等待脉冲结束,应为下降沿发生的中断添加中断处理程序(用于复位/置位模式的TAIFG或TACCR0 CCIFG,或用于置位/复位模式的TACCRx CCIFG ),递增计数,如果计数达到50则停止。

票数 1
EN

Stack Overflow用户

发布于 2020-09-18 14:25:47

请求的伪代码形式的示例irq处理程序:

切记根据占空比对TACCR1进行编程,并在输出模式下对定时器进行编程。在定时器设置完成后,您可以将cpu置于主睡眠状态。

伪代码:

代码语言:javascript
复制
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;
}
票数 0
EN

Stack Overflow用户

发布于 2020-09-23 03:30:49

@Damiano我能够在你的帮助下产生50个脉冲。然而,引脚电压值在第50个脉冲之后保持恒定

代码语言:javascript
复制
#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;
  }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63838695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档