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.

[参考译文] CCS/MSP430F5438A:MSP430F5438A项目

Guru**** 2588945 points
Other Parts Discussed in Thread: MSP430F5438A

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/657767/ccs-msp430f5438a-msp430f5438a-project

部件号:MSP430F5438A

工具/软件:Code Composer Studio

您好,
我正在为学校做一个项目,我真的需要一些帮助。
我们正在使用MSP430F5438A微控制器和Code Composer Studio v7。 我们需要编写一个程序,在其中一个输出的TB 0.3 -TB 0.6 上生成基本频率为1 kHz的PWM (脉宽调制)信号,由正弦波调制。 使用向上和向下键,正弦曲线的频率可在1至16 Hz范围内变化。 同时,所选频率将显示在LCD显示屏上。
我们也得到了
提前感谢您的帮助。
Andrew
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Andrew,

    dev.ti.com/tirex上提供了F5438A的代码示例。 此处显示了一个概述如何使用TB0生成PWM 的示例。 为了生成1kHz的PWM信号,您需要将 TBCCR0 =(TBCLK/1kHz)-1更改为 TBCCR0 0.6 的所需百分比,并将TB 0.3 -TB的相应TBCCRx更改为所需的-TB。  

     MSP-EXP430F5438实验板用户指南 也是如何与LCD屏幕交互的一个很好的资源。

    这里还有一个示例CCS项目,用于说明如何在LCD上绘制

    此致,

    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的Ryan:

    感谢您的快速回复。 但还有一些我不完全理解的事情。 顺便说一句,如果我的问题很小的话,很抱歉,但这是我为任何微控制器编写的第一个程序。 所以,请帮我一点。

    TB0CCR0中的值定义PWM周期。 在我的情况下,它应该是1000Hz。 我应该将所需频率转换为什么单位? 我应该以Hz,kHz或毫秒为单位写入? 另外,在TB0CCR3中,我应该写下占空比。 这里有什么装置? 它应该是一个介于0和100之间的数字,代表百分比? 还是其他?

    我的终极任务是在其中一个引脚上生成正弦信号,使用矩形波作为基本信号。 这意味着我必须始终更改PWM占空比。 我已确定公式:

    DutyCycle =[1/2+1/2*sin (2*pi*f*t)]* 100 %

    其中f是1到16之间的数字。

    我的问题是,我应该在计划的哪个位置更改TB0CCR3 (占空比)中写入的值,我应该多久更改一次?

    下面是我写过的内容。 您认为还可以吗?

    非常感谢。

    Andrew

    #include <MSP4S.h>


    双倍f     //频率
          //min f = 1 Hz
          //最大f = 16 Hz

    /**
     *@简明主功能
     *写评论
     *
     */
    内部主(无效)

       WDTCTL = WDTPW | WDTHOLD;   //停止看门狗计时器
     
       //初始化按钮
       // WFP 2.4 =向上按钮
       P2DIR &=~BIT4;    // WFP 2.4 作为输入(按钮)
       P2IES |= BIT4;    //下降边缘
       P2IFG &=~BIT4;    //清除IFG (标志寄存器)
       P2IE |= BIT4;    //启用中断

       //初始化按钮
       // WFP 2.5 =向下按钮
       P2DIR &=~BIT5;    // WFP 2.5 作为输入(按钮)
       P2IES |= BIT5;    //下降边缘
       P2IFG &=~BIT5;    //清除IFG (标志寄存器)
       P2IE |= BIT5;    //启用中断

       //初始化PWM计时器
       P4DIR || BIT3;    // WFP 4.3 输出(二极管)
       P4SEL |= BIT3;    // WFP 4.3 用于TB
       TB0CCTL3 = OUTMOD_7;   //重置/设置输出模式
       TB0CCR0 = 15;   ???    //期间
       TB0CCR3 = 7;    ???    //初始脉冲宽度值
       TB0CTL = TBSSEL__ACLK | MC__UP;
       
       F = 5;     //初始频率

       __enable_interrupit();

       同时(1);
    }

    /**
     *@简要端口2 ISR
     *
     *在检测到的按钮上,按下(加号按钮),增加频率f
     */
    void __attribute__((interrupt (port2_vector))) P2ISR (void)

     __DELAY周期(1000);
     如果((P2IFG & BIT4)!=0){//    检查是否设置了WFP 2.4 标志
      如果((P2IN & BIT4)=0){//   检查是否仍按下了WFP 2.4
       如果(f & 0x0F)!= 0x0F){
        f = f + 1;   //按下按钮且f小于16时,增加频率
       }
      }
      P2IFG &=~BIT4;
     }
    }

    /**
     *@简要端口2 ISR
     *
     *在检测到的按钮上,按下(减号按钮)将频率降低f
     */
    void __attribute__((interrupt (port2_vector))) P2ISR (void)

     __DELAY周期(1000);
     如果((P2IFG & BIT5)!=0){//    检查是否设置了WFP 2.5 标志
      如果((P2IN & BIT5)=0){//   检查是否仍按下了WFP 2.5
       如果(f & 0x0F)!= 0x01){
        f = f - 1;   //按下按钮且f大于1时,降低频率
       }
      }
      P2IFG &=~BIT5;
     }
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Andrew,

    TB0CCR0的单位是计时器周期中的时钟周期数,因此您需要知道计时器时钟源的频率(TBCLK)以及它生成的PWM的频率(1 kHz)来计算其值。 现在,您可以根据以下代码行从ACLK计时:

    TB0CTL = TBSSEL__ACLK | MC__UP; 

    您可能需要将TBSSEL__ACLK更改为默认值为1 MHz的TBSSEL_SMCLK,以便时钟源变为TBCLK = SMCLK =1 MHz。

    然后按如下方式计算TB0CCR0的值:

     TB0CCR0 =[TBCLK /(PWM频率)]- 1 =(1 MHz / 1 kHz)- 1 = 1000 - 1

    1源于计时器从0开始计数,而不是从1开始计数。 然后,TB0CCR3应通过每个周期的时钟周期数乘以占空比百分比(四舍五入为最接近的整数)进行设置。 因此,50 % 占空比将是:

    TB0CCR3 =[1000* 50 % ]- 1= 500 - 1.

    现在,PWM周期已设置,但更新占空比会怎样?  结果发现,每个工作周期开始时都会触发一个方便的计时器中断,为更新其值提供了完美的位置。 只需启用中断并添加计时器中断ISR。

      TB0CTL |= TBIE;   //启用计时器中断 
    //计时器B0中断服务例程
    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector=TIMERB1_vector
    __interrupt void TIMERB1_ISR(void)
    #Elif defined(__GNUC__)
    void __attribute__(interrupt (TIMERB1_void_use)((vector)
    
    编译器#void)
    #endif
    {
    TB0CCR3 =//1000*%占空比-1;
    } 

    另外几个注释,您可以将按钮按中断组合到同一功能中。 此外,您用于查找占空比的公式是准确的,但执行该计算在计算上成本高昂,而且可能太慢。 您可能希望先计算正弦波的PWM占空比值,然后将其存储在执行代码时要查找的数组中。 但这要由您决定如何实施。

    此致,

    Ryan

    #include <MSP4S.h>
    
    unsigned char f; //频率
    //min f = 1 Hz
    //max f = 16 Hz
    
    /**
    *@简要主功能
    *写入注释
    *
    **/
    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    
    //初始化按钮
    // WFP 2.4 =向上按钮
    P2DIR &=~BIT4;// WFP 2.4 作为输入(按钮)
    P2IES |= BIT4;//下降边缘
    P2IFG &=~BIT4;//清除IFG (标志寄存器)
    P2IE |= BIT4;//启用中断
    
    //初始化按钮
    // WFP 2.5 =向下按钮
    P2DIR &=~BIT5;// WFP 2.5 作为输入(按钮)
    P2IES |= BIT5;//下降边缘
    P2IFG &=~BIT5;//清除IFG (标志寄存器)
    P2IE |= BIT5;//启用中断
    
    //初始化PWM计时器
    P4DIR || BIT3;// WFP 4.3 输出(二极管)
    P4SEL |= BIT3;// WFP 4.3 用于TB
    
    TB0CCTL3 = OUTMOD_7;//重置/设置输出模式
    TB0CTL = TBSSEL__SMCLK | MC__UP;//使用TBCLK = SMCLK =1 MHz到时钟计时器
    TB0CCR0 = 1000 - 1;//=[TBCLK /(PWM频率)]- 1 =(1 MHz / 1 kHz)- 1 = 1000 - 1
    TB0CCR3 = 500 - 1; // 50 % 占空比
    
    
    TB0CTL |= TBIE; //启用计时器中断
    
    
    f = 5; //初始频率
    
    __enable_interrupit();
    
    while (1);
    }/**
    
    
    *@brief port2 ISR
    **
    在检测到时按(加号按钮)增量频率f
    */
    void __attribute__((interrupt (port2_vector)) P2ISR (void)
    {
    __delay_cycles(1000);
    如果((P2IFG & BIT4)!=0){//检查是否设置了WFP 2.4 标志
    ,如果((P2IN & BIT4)==0){//检查是否仍按了WFP 2.4
    ,如果((f & 0x0F)!= 0x0F){
    f = f + 1;//当按下按钮且f小于16时,增量频率
    }
    P2IFG
    &=~BIT4;
    }
    如果((P2IFG & BIT5)!=0){//检查是否设置了WFP 2.5 标志
    ,如果((P2IN & BIT5)==0){//检查是否仍按了WFP 2.5
    ,如果(f & 0x0F)!= 0x01){
    f = f -1;//当按下按钮且f大于1时,降低频率
    }
    P2IFG
    &=~BIT5;
    }
    }//
    
    
    计时器B0中断服务例程
    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector=TIMERB1_vector
    __interrupt void TIMER_ISR(void)
    #Elif defined(__GMNU__)
    __attribute__(interrupt (TIMERB1_void_error)
    
    缂栬疟鍣?b1)
    #endif
    {
    TB0CCR3 =//1000*%占空比-1;
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Ryan:

    我只想感谢您帮助我完成我的学校项目。 如果你没有回答我的问题,我可能还在开始,不知道如何开始。 相反,我成功通过了我的考试。

    多亏了您,我完成整个项目的速度比我预期的要快。 开始是迄今为止最困难的。 但当你给我一些提示和技巧时,接下来的一切都很容易。 此外,感谢您在数小时内快速回复。 这对我来说真的是最重要的方面,因为当我陷入困境时,我不用等很久就可以继续工作了。

    非常感谢。

    此致,

    Andrew