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.

[参考译文] MSP430FR2355:指示灯代码

Guru**** 2524460 points
Other Parts Discussed in Thread: TIDA-010056, MSP430FR2355, DRV8350R, DRV8323

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/994082/msp430fr2355-code-for-indicators

器件型号:MSP430FR2355
主题中讨论的其他器件:TIDA-010056DRV8350RDRV8323

您好、TI 帮助者、

我们将 TIDA-010056用作参考代码。 我们分别在 P3.3和 P3.4处连接了左侧和右侧指示灯的开关。 我们尝试在主循环中编写自己的代码、但我们显示、只要我们按下 switch、主代码的执行就会停止、并且只有相应的指示器工作。 这意味着电机(此处我们连接灯泡而不是用于测试目的的电机)停止运转一段时间、并且只有指示灯工作、但我们不希望它。  

这是我们的指示灯代码。

  我们希望两个代码同时运行... 请帮助我们、这将是一个很好的帮助。

提前感谢您。

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

    您是否只是在寻找类似的产品:

    unsigned char bits_to_set = 0;
    if (left_ind == 0)  bits_to_set |= BIT3;
    if (right_ind == 0) bits_to_set |= BIT4;
    if (bits_to_set != 0)
    {
        P2OUT |= bits_to_set;      // On
        __delay_cycles(25000000);  // Pause
        P2OUT &= ~bits_to_set;     // Off
        __delay_cycles(25000000);  // Pause
    }
    P2OUT &= ~(BIT3|BIT4);         // All off

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

    感谢您的快速响应、

    此代码和我们的代码均已成功执行、但我们的主要问题是在执行此代码时、运行电机的主代码会停止一段时间...我认为这是由于_delay_cycles 函数导致的...

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

    /*--版权--,

     *版权所有(c) 2019、德州仪器(TI)公司

     *保留所有权利。

     *修改者:A0132403

     *修改日期:2019年4月30日

     *已修改*以源代码和二进制形式重新分发和使用,有无

     *如果满足以下条件、则允许进行修改

     符合*:

     *

     **源代码的重新分发必须保留上述版权

     *注意、此条件列表和以下免责声明。

     *

     **二进制形式的再发行必须复制上述版权

     *请注意、中的此条件列表和以下免责声明

     *随分发提供的文档和/或其他材料。

     *

     **德州仪器公司的名称和名称均不相同

     *其贡献者可用于认可或推广衍生产品

     *未经特定的事先书面许可。

     *本软件由版权所有者和贡献者"按原样"提供

     *以及任何明示或暗示的保证、包括但不限于:

     *特定适销性和适用性的隐含保证

     *不承认目的。 在任何情况下、版权所有者不得或

     *派遣国应对任何直接、间接、偶然、特殊、

     *典型或必然的损害(包括但不限于

     *采购替代货物或服务;丧失使用、数据或利润;

     *或业务中断)、无论原因是什么以及任何责任理论、

     *无论是合同、严格责任还是侵权行为(包括疏忽或)

     *否则)因使用本软件而以任何方式产生、

     *即使被告知可能会发生此类损坏。

     *

    *********

    //系统配置

    //器件型号:MSP430FR2355

    //编译器:Code Composer Studio v8.3.0

    //振荡器频率:24MHz,使用内部 DCO

    // PWM 生成:计时器:TB3.1–TB.6,时钟= 25MHz,PWM 频率设置为20kHz

    20kHz

    //

    //位置反馈:霍尔传感器信号

    // HA -> P3.0

    // HB -> P3.1

    // HC -> P3.2

     *

    // ADC:A0 ->来自外部电位器/触发器的速度基准

    // A6 ->相位 A 反电动势感应、用于无传感器

    // A5 ->用于无传感器的 B 相反电动势感应

    // A4 ->用于无传感器的 C 相反电动势感应

    // A7 ->直流总线电压感测

    // A8 ->低侧直流总线电流感应

    // A9 -> PCB 或 FET 温度反馈

     *

     *

    针对反电动势过零检测的//Comparator 配置:CB2/P1.2 -> IDC

    // COMP0.O (P2.0)–相位 A 反电动势过零比较器

    // COMP1.O (P2.1)–相位 C 反电动势过零比较器

    // OA1O (P1.5)-相位 C 反电动势过零比较器。 。

    智能 COMPO 模块的//运算放大器配置为比较器

    *

    //DRV8350RS - SPI 编程引脚连接/B1

    // P4.4 -> SCS

    // P4.5 -> SCLK

    // P4.6 -> SDO

    // P4.7 -> SDI

     *

    /UART 通信

    // P4.2 -> UART RX 引脚

    // P4.3 -> UART TX 引脚

    ///MCU 数字输入/输出

    // P5.4 ->电机旋转方向

    // P4.1 ->启用 DRV8350R 连接

    // P4.0 -> DRV8350R 的故障引脚连接

    // P2.6 -> LED 输出

    ********* /

    //头文件//

    #include "msp430fr2355.h"

    #include "stdint.h"

    #define CALTDH0CTL1_256 *((unsigned int *) 0x1A36)

    /******** InstaSPIN ********* /

    #define PWM_PERIOD 600 // PWM 频率(Hz)= 25MHz/((2 * PWM_PERIOD)-1)

    #define MAX_DUTYCYCLE 600 //相对于 PWM_PERIOD

    #define MIN_DUTYCYCLE 5 //相对于 PWM_PERIOD

    #define ACCEL_RATE 100 //斜升至满量程占空比的时间=(满量程占空比)* ACCEL_RATE * PWM_PERIOD/PWM_Frequency

    #define DEAD_TIME_MCU 1 // MSP430的死区时间= DEAD_TIME* 0.0625us (对于16MHz 时钟)

    #define Block_Rotor_Duration 800 // blocked_but 关闭时间(s)= Block_Rotor_Duration * 30000/计时器时钟频率

    /******** 程序变量******* /

    unsigned int DC_BUS_CURRENT = 0;

    unsigned int DC_BUS_Voltage = 0;

    unsigned int speed_REF = 0;

    unsigned int Temperature_feedback = 0;

    unsigned int start_count = 0;

    unsigned int HALL_State = 0;

    unsigned int softstart_counter = 0;

    unsigned int CurrentDutyCycle = 100;

    unsigned int direction = 0;

    unsigned int FirstADC_flag = 1;

    unsigned int adc_selection_FLAG = 1;

    unsigned int adc_selection_FLAG_1 = 1;

    unsigned int Block_Rotor_Counter = 0;

    unsigned int Block_Rotor_Counter_1 =0;

    unsigned int ADC_Result = 0;

    unsigned int 换向_time = 0;

    unsigned int 换向_time_counter = 0;

    unsigned int Adv_angle_time_counter = 0;

    unsigned int Adv_angle_time = 0;

    unsigned int sorting_done = 0;

    unsigned int previous_State = 0;

    unsigned int prese_State = 0;

    unsigned int PWM_Duty = PWM_PERIOD;

    unsigned int left_ind;

    unsigned int right_ind;

    /******** ADC 通道选择******** /

    #define measure_speed \

                    ADCCTL0 |= ADCSHT_2 | ADCON;\

                    ADCCTL1 |= ADCSHP;\

                    ADCCTL2 &=~ADCRES;\

                    ADCCTL2 |= ADCRES_2;\

                    ADCMCTL0 |= ADCINCH_0;\

                    ADCIE = ADCIE0;

    #define measure_TEMP \

                    ADCCTL0 |= ADCSHT_2 | ADCON;\

                    ADCCTL1 |= ADCSHP;\

                    ADCCTL2 &=~ADCRES;\

                    ADCCTL2 |= ADCRES_2;\

                    ADCMCTL0 |= ADCINCH_9;\

                    ADCIE = ADCIE0;

    #define measure_VDC \

                    ADCCTL0 |= ADCSHT_2 | ADCON;\

                    ADCCTL1 |= ADCSHP;\

                    ADCCTL2 &=~ADCRES;\

                    ADCCTL2 |= ADCRES_2;\

                    ADCMCTL0 |= ADCINCH_7;\

                    ADCIE = ADCIE0;

    #define measure_IDC \

                    ADCCTL0 |= ADCSHT_2 | ADCON;\

                    ADCCTL1 |= ADCSHP;\

                    ADCCTL2 &=~ADCRES;\

                    ADCCTL2 |= ADCRES_2;\

                    ADCMCTL0 |= ADCINCH_8;\

                    ADCIE = ADCIE0;

    #define measure_BEMF_A \

                    ADCCTL0 |= ADCSHT_2 | ADCON;\

                    ADCCTL1 |= ADCSHP;\

                    ADCCTL2 &=~ADCRES;\

                    ADCCTL2 |= ADCRES_2;\

                    ADCMCTL0 |= ADCINCH_6;\

                    ADCIE = ADCIE0;

    #define measure_BEMF_B \

                    ADCCTL0 |= ADCSHT_2 | ADCON;\

                    ADCCTL1 |= ADCSHP;\

                    ADCCTL2 &=~ADCRES;\

                    ADCCTL2 |= ADCRES_2;\

                    ADCMCTL0 |= ADCINCH_5;\

                    ADCIE = ADCIE0;

    #define measure_BEMF_C \

                    ADCCTL0 |= ADCSHT_2 | ADCON;\

                    ADCCTL1 |= ADCSHP;\

                    ADCCTL2 &=~ADCRES;\

                    ADCCTL2 |= ADCRES_2;\

                    ADCMCTL0 |= ADCINCH_4;\

                    ADCIE = ADCIE0;

    #define conversion 转换_enable \

                    ADCCTL0 |= ADCENC | ADCSC;

    #define conversion 禁用\

                    ADCCTL0 &=~ADCENC;\

                    ADCCTL1 = 0;

    /******** ADC 通道选择结束******** /

    INT LPM3_ON = 0;

    void Init_clocks (void);

    void init_io (void);

    void init_wdt (void);

    void init_adc (void);

    void init_TimerB (void);

    void Hall_State_Change_Forward (void);

    void Hall_State_Change_Reverse (void);

    void a_PWM (void);

    void B_PWM (void);

    void C_PWM (void);

    void a_low (void);

    void B_low (void);

    void C_low (void);

    void a_Z (void);

    void B_Z (void);

    void C_Z (void);

    void a_high (void);

    void B_high (void);

    void C_high (void);

    void main (void)

      WDTCTL = WDTPW + WDTHOLD;//停止 WDT

      _delay_cycles (1000000);

      init_clocks ();//初始化25MHz 的时钟

      init_adc ();

      init_TimerB ();

      init_wdt();

      init_io ();

      A_Z();

      B_Z();

      C_Z();

      _DELAY_CYCLES (1000000);

      /*** 为 DRV8323启用****** /

          P4OUT &=~BIT1;

          _DELAY_CYCLES (2500);//100us 延迟

          P4OUT |= BIT1;//延迟周期 MA 更改 Karya CH 07/04/2021 nA Roj

          _DELAY_CYCLES (250);//10us 延迟

      方向=(P5IN 和 BIT4);

      HALL_STATE =((P3IN & BIT0)+(P3IN & BIT1)+(P3IN & BIT2));

      P3DIR &=~BIT3;// left_indicator 作为输入

      P3REN |= BIT3;

      P3OUT |= BIT3;

      P3IES |= BIT3;

      P3DIR &=~BIT4;// right_indicator 作为输入

      P3REN |= BIT4;

      P3OUT |= BIT4;

      P3IES |= BIT4;

      P2DIR |= BIT3;//继电器1作为输出

      P2DIR |= BIT4;//继电器2作为输出

     /*//--设置定时器 timer0_B3

      TB0CTL |= TBCLR;

      TB0CTL |= MC__UP;

      TB0CTL |= TBSSEL_ACLK;

      TB0CCR0 = 32768;*/

      unsigned char bits_to_set = 0;

      //---制动系统

      P5DIR &=~BIT3;//左侧制动器作为输入

      P5REN |= BIT3;

      P5OUT |= BIT3;

      P5IES |= BIT3;

      P5DIR &=~BIT2;// RIGHT _BRAKE 作为输入

      P5REN |= BIT2;

      P5OUT |= BIT2;

      P5IES |= BIT2;

    /*//--设置定时器比较 IRQ

      TB0CCTL0 |= CCIE;

      _enable_interrupt ();

      TB0CCTL0 &=~CCIFG;

      //--设置 IRQ

      P3IE |= BIT3;

      P3IE |= BIT4;

      _enable_interrupt ();

      P3IFG &=~ BIT3;

      P3IFG &=~ BIT4;*/

      _enable_interrupt ();

      P5IE |= BIT3;

      P5IE |= BIT2;

      P5IFG &=~ BIT3;

      P5IFG &=~ BIT2;

      P4DIR |= BIT0;

      P4DIR |= BIT1;

      P6DIR |= BIT0;

      P6DIR |= BIT1;

      P6DIR |= BIT2;

      P6DIR |= BIT3;

      P6DIR |= BIT4;

      P6DIR |= BIT5;

        while (1)

        {

           P4OUT |= BIT1;

           P4OUT |= BIT0;

           P6OUT |= BIT0;

           P6OUT |= BIT1;

           P6OUT |= BIT2;

           P6OUT &=~BIT3;

           P6OUT |= BIT4;

           P6OUT |= BIT5;

            

           if (left_ind = 0) bits_TO_set |= BIT3;

           if (right_ind = 0) bits_TO_set |= BIT4;

           if (bits_TO_SET!= 0)

           {

             P3OUT |= bits_TO_SET;//打开

             _DELAY_CYCLES (25000000);//暂停

             P3OUT &=~bits_TO_SET;//关闭

             _DELAY_CYCLES (25000000);//暂停

           }

           P3OUT &=~(BIT3|BIT4);//全部关闭

           }

         // if (softstart_counter >= ACCEL_RATE)

          //{

              softstart_counter = 0;

              IF (CurrentDutyCycle < SPED_REF)

              {

                CurrentDutyCycle ++;

              }

              否则、如果(CurrentDutyCycle > SPED_REF)

              {

                电流占空比--;

              }

              IF (CurrentDutyCycle >= MAX_DUTYCYCLE)

              {

                CurrentDutyCycle = MAX_DUTYCYCLE;

              }

              否则、如果(CurrentDutyCycle <= MIN_DUTYCYCLE)

              {

                CurrentDutyCycle = MIN_DUTYCYCLE;

              }

          //}

          if (DIRECTION ==0)

          {

            HALL_State_Change_Forward ();

          }

          其他

          {

            HALL_State_Change_Reverse ();

          }

          }

    //结束 main

    //--ISR --//

    #pragma vector = TIMER0_B0_vector

    _interrupt void ISR_TB0_CCR0 (void)

      P2OUT ^= BIT3;

      P2OUT ^= BIT4;

      TB0CCTL0 &=~CCIFG;

    #pragma vector=PORT5_vector

    _interrupt void Port_5 (void)

    //WDT 以重新启动 ADC

     void init_WDT (void)

       WDTCTL = WDT_MDLY_32;//从1MHz 到 SMCLK 的 WDT 32ms、间隔时间

       SFRIE1 |= WDTIE;//启用 WDT 中断

    空 init_TimerB (空)

      {

        TB3CTL = TBSSEL_SMCLK | MC_3 | TBCLR;// SMCLK、UP_DOWN 模式、清除 TBR

        TB3CCR0 = PWM_PERIOD;// PWM 周期

        TB3CCR1 = PWM_PERIOD;// CCR1 PWM 占空比

        /*TB3CCR2 = PWM_PERIOD;// CCR2 PWM 占空比

        TB3CCR3 = PWM_PERIOD;// CCR3 PWM 占空比

        TB3CCR4 = PWM_PERIOD;// CCR4 PWM 占空比

        TB3CCR5 = PWM_PERIOD;// CCR3 PWM 占空比

        TB3CCR6 = PWM_PERIOD;// CCR4 PWM 占空比*/

        TB3CCTL1 = OUTMOD_6;// CCR1复位/置位

        /*TB3CCTL2 = OUTMOD_2;// CCR2复位/置位

        TB3CCTL3 = OUTMOD_6;// CCR3复位/置位

        TB3CCTL4 = OUTMOD_2;// CCR4复位/置位

        TB3CCTL5 = OUTMOD_6;// CCR4复位/置位

        TB3CCTL6 = OUTMOD_2;// CCR4复位/置位*/

        TB3CCTL0 |= CCIE;

        // TB3CCTL1 |= CCIE;

       _bis_SR_register (GIE);//启用中断

       __no_operation();//用于调试器

        _EINT();//启用中断

      }

    //时钟和 Vcore

    void Init_clocks (void)

      FRCTL0 = FRCTLPW | NWAITS_2;

      _bis_SR_register (SCG0);//禁用 FLL

      CSCTL3 |= SELREF_REFOCLK;//将 REFO 设置为 FLL 基准源

      CSCTL0 = 0;//清除 DCO 和 MOD 寄存器

      CSCTL1 |= DCORSEL_7;//设置 DCO = 24MHz

      CSCTL2 = FLLD_0 + 731;// DCOCLKDIV = 24MHz

      _DELAY_CYCLES (3);

      _BIC_SR_register (SCG0);//启用 FLL

      while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));// FLL 锁定

      CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;//将默认 REFO (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz

                                //默认 DCOCLKDIV 为 MCLK 和 SMCLK 源

    //IO 初始化//

    void init_io (void)

      {

        //霍尔传感器输入

        P3SEL0 &=~(BIT0+BIT1 + BIT2);//GPIO -霍尔传感器

        P3DIR &=~(BIT0+BIT1 + BIT2);//输入-霍尔传感器

        ///PWM 输出

        //GPIO-PWM

        P6DIR |=(BIT0+BIT1 +BIT2 + BIT3 + BIT4 + BIT4);//OutputPWM

        //指示

        P2SEL0 &=~(BIT6);/GPIO-LED3

        P2DIR |=(BIT6);//输出 LED3

        //方向控制

        P5SEL0 &=~(BIT4);//GPIO - DIR

        P5DIR &=~(BIT4);//输入- DIR

        //启用栅极驱动器

        P4SEL0 &=~(BIT1);//GPIO - DIR

        P4DIR |=(BIT1);//输入- DIR

        //故障输入

        P4SEL0 &=~(BIT0);//GPIO - DIR

        P4DIR &=~(BIT0);//输入- DIR

        //为霍尔传感器端口启用边沿中断

        P3IES |=((BIT0)+(BIT1)+(BIT2));//将霍尔中断更改为下降边沿以检测两个边沿

        P3IE |=(BIT0 | BIT1 | BIT2);

        PM5CTL0 &=~LOCKLPM5;

        P3IFG &=~(BIT0| BIT1 | BIT2);

        _bis_SR_register (GIE);

      }

    void init_adc (void)

      //配置 ADC12

      ADCCTL0 |= ADCSHT_2 | ADCON;// ADCON、S&H=16 ADC CLKS

      ADCCTL1 |= ADCSHP;// ADCCLK = MODOSC;采样计时器

      ADCCTL2 &=~ADCRES;//清除 ADCCTL 中的 ADCRES

      ADCCTL2 |= ADCRES_2;// 12位转换结果

      ADCMCTL0 |= ADCINCH_0;// A1 ADC 输入选择;Vref=AVCC

      ADCIE |= ADCIE0;//启用 ADC 转换完成中断

    /********* TIMERD0.1中断********* /

    //计时器 B1中断服务例程

    #pragma vector = TIMER3_B1_vector

    _interrupt void Timer3_B1_ISR (void)

       PWM_Duty =(PWM_Period - CurrentDutyCycle);

       /*TB3CCR1 = PWM_Duty;// CCR1 PWM 占空比

       TB3CCR2 = PWM_DUTY;

       TB3CCR3 = PWM_DUTY;// CCR1 PWM 占空比

       TB3CCR4 = PWM_DUTY;

       TB3CCR5 = PWM_Duty;// CCR1 PWM 占空比

       TB3CCR6 = PWM_DUTY;*/

         测量速度

         转换_ENABLE

         TB3CCR1 = PWM_Duty;// CCR1 PWM 占空比

         P6OUT &=~ BIT0;

         TB3CCTL1 &=~CCIFG;

       /* softstart_counter ++;

         Block_Rotor_Counter_1_+;

         IF (Block_Rotter_Counter_1_=30000)

         {

           Block_Rotor_Counter++;

         }

         IF (Block_Rotor_Counter > Block_Rotor_Duration)

         {

           A_Z();

           B_Z();

           C_Z();

           disable_interrupt ();

           while (1);

         }*/

    #pragma vector = TIMER3_B0_vector

    _interrupt void ISR_TB3_CCR0 (void)

      P6OUT |= BIT0;

      TB3CCTL0 &=~ CCIFG;

    /********* TIMERD0.1中断结束******* /

    /********* ADC 中断******* /

    // ADC 中断服务例程

    #pragma vector=ADC_vector

    _interrupt void ADC_ISR (void)

      switch (__evo_in_range (ADCIV、ADCIV_ADCIFG))

      {

        案例 ADCIV_NONE:

          中断;

        ADCIV_ADCOVIFG 案例:

          中断;

        案例 ADCIV_ADCTOVIFG:

          中断;

        ADCIV_ADCHIIFG 案例:

          中断;

        ADCIV_ADCLOIFG 案例:

          中断;

        ADCIV_ADCINIFG 案例:

          中断;

        ADCIV_ADCIFG 案例:

          ADC_RESULT = ADCMEM0;

          SPEED_REF =(ADC_RESULES>>2);

          中断;

        默认值:

          中断;

      }

    /*** 端口1中断服务例程******* /

    #pragma vector=PORT3_vector

    _interrupt void Port_3 (void)

      HALL_STATE =((P3IN & BIT0)+(P3IN & BIT1)+(P3IN & BIT2));

      if (DIRECTION ==0)

      {

        HALL_State_Change_Forward ();

      }

      其他

      {

        HALL_State_Change_Reverse ();

      }

      Block_Rotor_Counter = 0;

      Block_Rotor_Counter_1 = 0;

      P3IES ^=(BIT0)+(BIT1)+(BIT2);

      P3IFG &=~(BIT0| BIT1 | BIT2);

     /* right_ind = P3IN & BIT4;

       if (right_ind = 0)

       {

         P2OUT ^= BIT4;

       }

       其他

       {

         P2OUT &=~BIT4;

       }

       P3IFG &=~ BIT4;

       LEFT_ind = P3IN & BIT3;

       if (left_ind = 0)

       {

         P2OUT ^= BIT3;

       }

       其他

       {

         P2OUT &=~BIT3;

       }

       P3IFG &=~ BIT3;*/

    /*** ADC 中断结束******** /

    //看门狗定时器中断服务例程

    #pragma vector=WDT_Vector

    _interrupt void WDT_ISR (void)

    /******* 换向序列前进******** /

    void Hall_State_Change_Forward (void)

          开关(HALL_State)

          {

            案例2:

                C_Z();

                a_pwm ();

                b_low ();

            中断;

            案例6:

                B_Z();

                a_pwm ();

                c_low();

              中断;

            案例3:

                A_Z();

                c_PWM ();

                b_low ();

                中断;

            案例1:

                B_Z();

                c_PWM ();

                a_low ();

                中断;

            案例4:

                A_Z();

                b_pwm ();

                c_low();

                中断;

            情况5:

                C_Z();

                b_pwm ();

                a_low ();

                中断;

            默认值:

              A_Z();

              B_Z();

              C_Z();

              中断;

          }

    /******* 换向序列反向******** /

    void Hall_State_Change_Reverse (void)

          开关(HALL_State)

          {

            案例2:

                C_Z();

                b_pwm ();

                a_low ();

            中断;

            案例6:

                B_Z();

                c_PWM ();

                a_low ();

              中断;

            案例3:

                A_Z();

                b_pwm ();

                c_low();

                中断;

            案例1:

                B_Z();

                a_pwm ();

                c_low();

                中断;

            案例4:

                A_Z();

                c_PWM ();

                b_low ();

                中断;

            情况5:

                C_Z();

                a_pwm ();

                b_low ();

                中断;

            默认值:

              A_Z();

              B_Z();

              C_Z();

              中断;

          }

    /******* PWM GPIO 的定义********* /

    void A_PWM (void)

      P6SEL0 |= BIT0;

      P6SEL0 |= BIT1;

    void B_PWM (void)

      P6SEL0 |= BIT2;

      P6SEL0 |= BIT3;

    void C_PWM (void)

      P6SEL0 |= BIT4;

      P6SEL0 |= BIT5;

    void a_low (void)

      P6SEL0 &=~BIT0;

      P6OUT &=~BIT0;

      P6SEL0 &=~BIT1;

      P6OUT |= BIT1;

    void B_low (void)(空)

      P6SEL0 &=~BIT2;

      P6OUT &=~BIT2;

      P6SEL0 &=~BIT3;

      P6OUT |= BIT3;

    void C_low (void)

      P6SEL0 &=~BIT4;

      P6OUT &=~BIT4;

      P6SEL0 &=~BIT4;

      P6OUT |= BIT5;

    void A_Z (void)

      P6SEL0 &=~BIT0;

      P6OUT &=~BIT0;

      P6SEL0 &=~BIT1;

      P6OUT &=~BIT1;

    空 B_Z (空)

      P6SEL0 &=~BIT2;

      P6OUT &=~BIT2;

      P6SEL0 &=~BIT3;

      P6OUT &=~BIT3;

    空 C_Z (空)

      P6SEL0 &=~BIT4;

      P6OUT &=~BIT4;

      P6SEL0 &=~BIT4;

      P6OUT &=~BIT4;

    void a_high (void)(空)

      P6SEL0 &=~BIT0;

      P6OUT |= BIT0;

      P6SEL0 &=~BIT1;

      P6OUT &=~BIT1;

    空 B_HIGH (空)

      P6SEL0 &=~BIT2;

      P6OUT |= BIT2;

      P6SEL0 &=~BIT3;

      P6OUT &=~BIT3;

    void C_high (void)(空)

      P6SEL0 &=~BIT4;

      P6OUT |= BIT4;

      P6SEL0 &=~BIT4;

      P6OUT &=~BIT4;

    /******* 结束******* /

    这是我们的 code....in main (void)函数,有 while (1)循环使用我们的电机运行代码和指示灯代码...

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

    为了摆脱__delay_cycles (),您需要一个调度程序来计算秒数。 这并不(必然)意味着 RTOS、您只需要一些可以可靠地解释为实时的事件。 对于简单的情况、具有中断的周期性计时器可能就足够了。

    看起来您以32ms 的周期(WDT_MDLY_32)运行 WDT、因此33x 的周期大约为1秒。 常见的习语可能如下所示:

    __interrupt void WDT_ISR(void)      // Every 32ms
    {
        static int second_counter;
        if (++second_counter >= 1000/32) { // 1000ms/32ms= 1 second
            second_counter = 0;         // Start a new second
            if (bits_to_set == 0)       // No indicators at all
                P3OUT &= ~(BIT3|BIT4);  // All off
            else                        // Input checker in main wants some blinks
                P3OUT ^= bits_to_set;   // Toggle the relevant indicator(s)
        }
    }

    未经请求:如果您要发布700多行代码、请附加它、而不是粘贴。 (插入->图像/视频/文件)。

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

    Bruce、您好!  
    您能否简单解释一下我们在哪里编写此代码? 以及如何执行。
    如果您提供完整的代码、它将非常有帮助。
    提前感谢您。

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

    出于我提到的原因、我将其放在程序中的 WDT_ISR 函数内。 这是一个示例、您应该根据自己的需求进行调整。 我无法为论坛上的个人编写定制代码。

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

    感谢您提供参考代码、但我们的主要问题是、当我们按下指示灯开关时、电机停止运行、仅指示灯亮起、并且当我们停止时、指示灯电机启动...因此我们希望这两个指示灯必须同时运行... 我们的逻辑代码中也会出现同样的问题... 请帮助  

    提前感谢您!!

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

    您的代码现在是什么样的? WDT_ISR 执行所有工作、并且在后台运行、因此没有用于阻止其他活动的__DELAY_CYCLES 调用。

    您的实际目标是在电机运行时点亮 LED (仅限)吗? 您比我更清楚此代码的作用、但我的第一个猜测是打开 A_PWM 中的指示器并在 A_low (或可能是 A_Z?)中将其关闭。

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

    是的、我们的目标是在电机运行时点亮 LED!!! 我们为电动汽车中使用的 BLDC 电机控制器编写了此代码。 因此、很明显、指示灯在电机运行时运行。 我们编写了您的 WDT_ISR、但它停止了电机和指示灯也不能正常工作...

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

    听起来好像您对1秒闪烁完全不感兴趣(直接根据按钮)。 相反、您希望在打开/关闭电机时打开/关闭指示灯。 到目前为止提供的任何代码都不会执行此操作。

    A_PWM 打开电机并 A_LOW 关闭电机是否正确? (类似 B_PWM 和 B_LOW。 以及 C_PWM 的适用位置?) 还是 HALL_State 告诉您?

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

    我们使用 TIDA-010056设计文件制造了自己的电路板。 我们将该板用于电动汽车的 BLDC 电机控制器。 我们将成功获得输出电压。 我们希望使用板载的相同微控制器来开发指示灯代码(1秒、1秒)。  

    引脚

    左侧指示开关- P3.3

    右侧指示开关- P3.4

    默认引脚电平为高电平。 当开关工作时、它将变为低电平。

    灯使用继电器连接。 它已连接

    左侧指示继电器- P2.3

    右侧指示灯继电器- P2.4

    我们已开发了使用延迟函数进行指示的代码。 但是、当我们打开指示器电机停止时、我们面临的问题是。 我们发现、由于我们使用了延迟函数、因此我们遇到了这个问题。 是否还有其他选项可以使用同一微控制器并行运行指示灯和电机?

    注意:我们仅用于指示器用途的引脚。 出于 BLDC 控制目的、使用了其他引脚。

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

    我理解、您希望指示继电器显示指示开关已激活(无论电机是否正在运行)。  

    因此、您需要在后台运行一秒的闪烁、这正是 WDT_ISR 代码所做的。 我刚刚尝试过它、发现它没有暂停 main 中的循环 、因此我想它不会暂停电机。 (我使用快速闪烁 LED 作为代理、因为我无法测试电机。)

    它的闪烁速度比预期的快、因为它看起来您以24MHz 而非1MHz 运行、所以 WDT 每隔(32/24) ms 而不是每32ms 触发一次。 因此、我将常量从(1000/32)更改为(24000/32)。 我不确定为什么您和我会获得不同的结果。

    顺便提一下:

    >   P3OUT &=~(BIT3|BIT4);//全部关闭

           >}

    这种右括号是有意的吗? 它具有关闭 while (1)循环的效果、因此不执行以下任何代码。 (编译器对此发出警告。) 删除了__delay_cycles 代码后,我将其留在那里,但似乎这可能会干扰电机。  

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

    谢谢 Bruce、

    你是对的!!!  右括号是问题...非常感谢 Bruce、现在两个人都在同时运行...

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

     Bruce、您好!

    我们希望在讨论的同一微控制器上开发制动程序。 为此,在 P5.2和 P5.3上连接了两个开关。 开关通常是打开的开关。
    当开关运行时、微控制器必须停止它正在执行的任何操作。


    开关操作:当开关1和开关2打开时,P5.2和 P5.3中的输入为逻辑1。 (这是默认条件)
                    当开关运行时、端口引脚 P5.3上的输入变为逻辑0。

    为此、我开发了程序、但它无法正常工作。   

    程序代码

    switch_1 = P5IN 和 BIT2;
    switch_2 = P5IN 和 BIT3;

    while (switch_1 == 0 | switch_2 == 0)
    {}                                  //当开关1或开关2变为0时,不执行任何操作  

    我在程序持续运行的代码主循环中编写此代码。 但是、当我切换运行程序时、程序不会停止。 当我在 CCS 调试模式下显示开关1和开关2的值时、它不会获得正确的开关值。 但是、当我专门为开关1和开关2的读取值编写代码时、它会在 CCS 调试模式下捕获正确的值。

    那么、可能是什么问题、请提供帮助。

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

    您仅获取 P5IN 一次(正常、两次)、因此如果值稍后更改、您将看不到它。 我建议:

    do {
       switch_1 = P5IN & BIT2;
       switch_2 = P5IN & BIT3;
    } while( switch_1 == 0 | switch_2 == 0);

    [编辑:已修复缺少分号]

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

    非常感谢 Bruce。我们的问题已经得到解决。