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.

RM42L432: N2HET: How to enable and disable PWM via an input signal

Part Number: RM42L432
Other Parts Discussed in Thread: DRV8332

Hi.

I am currently in the process of developing a more-or-less standalone N2HET application that controls a sensored 3 phase BLDC motor using the DRV8332 driver.

For this application, I need to produce the following commutation sequence according to the U, V, W hall effect inputs:

Therefore, I need to turn on/off the PWM outputs for 3 pins: PWM_A, PWM_B, and PWM_C according to the 3 hall sensor inputs.

To test this concept, I made the following N2HET program. It simply turns on the PWM output (pin 2) whenever the input (pin 0) is low and vice versa:

PIN_EN      .equ 0  ; ENABLE
PIN_PWM_OUT .equ 2 ; PWM OUTPUT

PWM_DATA   .equ 15 ; Data for PWM
PWM_HRDATA .equ 0 ; HRData for PWM

; ********* START: Global counter for PWM *********
START   CNT { reg = A, max = 19, data = 0 }
PWM     ECMP { hr_lr = HIGH, en_pin_action = ON, pin = PIN_PWM_OUT, action = CLEAR,
                 reg = A, data = PWM_DATA, hr_data = PWM_HRDATA }

; ********* ENABLE PIN is low - Output PWM Signal *********
ENABLE  BR { next = DISABLE, cond_addr = PWM_ON, event = Low, pin = PIN_EN }

PWM_ON  DADM64 { remote = PWM, en_pin_action = ON, pin = PIN_PWM_OUT, comp_mode = ECMP, action = PULSELO, reg = A, data = 0 }

; ********* ENABLE PIN is low - Output PWM Signal *********
DISABLE BR { next = START, cond_addr = PWM_OFF, event = High, pin = PIN_EN }

PWM_OFF DADM64 { next = START, remote = PWM, en_pin_action = ON, pin = PIN_PWM_OUT, comp_mode = ECMP, action = CLEAR, reg = A, data = 0 }

However, I get this weird output:

Notice the increasing undesirable amount of delay (highlighted in yellow).

How do I fix this problem?

Thank you very much for your time and help,

Jae

  • Hello Jae,

    I am forwarding your question to an associate that has more experience with motor control and the N2HET in general. They should get back to you soon.
  • Hi. It has been around a week and I was wondering if you have found the solution by any chance?

    Thanks again!

    Jae,

  • Hi. Is it possible if you could give any updates on this issue? It has been two weeks and it would be great to at least get some information on this problem.

    Thanks again.

  • Hello Jae,

    Sorry for late response. The delay may be caused by the non-zero register A when you start the PWM. Please clear register A or data field in CNT before starting the PWM.
  • Hi, so I have updated the code in the past month and here is my current setup:

    ENC_U   .equ 0  ; Signal U from UVW encoder
    ENC_V   .equ 2  ; Signal V from UVW encoder
    ENC_W   .equ 4  ; Signal W from UVW encoder
    OUT_U   .equ 6  ; Output phase U
    OUT_V   .equ 8  ; Output phase V
    OUT_W   .equ 10 ; Output phase W
    RESET_U .equ 12 ; Reset signal phase U
    RESET_V .equ 14 ; Reset signal phase V
    RESET_W .equ 16 ; Reset signal phase W
    
    PWM_DATA   .equ 15 ; Data for PWM
    PWM_HRDATA .equ 0 ; HRData for PWM
    
    ; ********* START: Global counter for PWM *********
    START      CNT {reg = A, max = 19, data = 0}
    
    ;PWM code for given HCLK frequency = 100MHz  ,PWM frequency = 0.15MHz  ,duty cycle = 0.5% ,HETPFR value =1280 is below:
    ;L00 CNT {reg=A, max=19, data=0}
    ;L01 ECMP {next=UVW_HLH, hr_lr=HIGH,en_pin_action=ON,pin=0,action=PULSELO,reg=A,data=10,hr_data=0}
    
    
    ;PWM code for given HCLK frequency = 100MHz  ,PWM frequency = 0.02MHz  ,duty cycle = 0.5% ,HETPFR value =1536 is below:
    ;L01 ECMP {next=L00,hr_lr=HIGH,en_pin_action=ON,pin=0,action=PULSELO,reg=A,data=7,hr_data=64}
    
    
    ; ********* UVW Encoder is: U:1 V:0 W:1 *********
    UVW_HLH    BR { next = UVW_HLL, cond_addr = UVW_HLH1, event = High, pin = ENC_U}
    UVW_HLH1   BR { next = UVW_HLL, cond_addr = UVW_HLH2, event = Low, pin = ENC_V}
    UVW_HLH2   BR { next = UVW_HLL, cond_addr = OUT_HLH_U, event = High, pin = ENC_W}
    
    OUT_HLH_U  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_U, action = PULSELO,
                     reg = A, data = PWM_DATA, hr_data = PWM_HRDATA}
    OUT_HLH_V  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_V, action = PULSEHI,
                     reg = A, data = PWM_DATA, hr_data = PWM_HRDATA}
    OUT_HLH_W  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_W, action = PULSELO,
                     reg = A, data = 0, hr_data = 0}
    RES_HLH_U  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_U, action = PULSEHI,
                     reg = A, data = 0, hr_data = 0}
    RES_HLH_V  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_V, action = PULSEHI,
                     reg = A, data = 0, hr_data = 0}
    RES_HLH_W  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_W, action = PULSELO,
                     reg = A, data = 0, hr_data = 0}
    
    ; ********* UVW Encoder is: U:1 V:0 W:0 *********
    UVW_HLL    BR { next = UVW_HHL, cond_addr = UVW_HLL1, event = High, pin = ENC_U}
    UVW_HLL1   BR { next = UVW_HHL, cond_addr = UVW_HLL2, event = Low, pin = ENC_V}
    UVW_HLL2   BR { next = UVW_HHL, cond_addr = OUT_HLL_U, event = Low, pin = ENC_W}
    
    OUT_HLL_U  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_U, action = PULSELO,
                     reg = A, data = PWM_DATA, hr_data = PWM_HRDATA}
    OUT_HLL_V  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_V, action = PULSELO,
                     reg = A, data = 0, hr_data = 0}
    OUT_HLL_W  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_W, action = PULSEHI,
                     reg = A, data = PWM_DATA, hr_data = PWM_HRDATA}
    RES_HLL_U  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_U, action = PULSEHI,
                     reg = A, data = 0, hr_data = 0}
    RES_HLL_V  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_V, action = PULSELO,
                     reg = A, data = 0, hr_data = 0}
    RES_HLL_W  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_W, action = PULSEHI,
                     reg = A, data = 0, hr_data = 0}
    
    ; ********* UVW Encoder is: U:1 V:1 W:0 *********
    UVW_HHL    BR { next = UVW_LHL, cond_addr = UVW_HHL1, event = High, pin = ENC_U}
    UVW_HHL1   BR { next = UVW_LHL, cond_addr = UVW_HHL2, event = High, pin = ENC_V}
    UVW_HHL2   BR { next = UVW_LHL, cond_addr = OUT_HHL_U, event = Low, pin = ENC_W}
    
    OUT_HHL_U  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_U, action = PULSELO,
                     reg = A, data = 0, hr_data = 0}
    OUT_HHL_V  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_V, action = PULSELO,
                     reg = A, data = PWM_DATA, hr_data = PWM_HRDATA}
    OUT_HHL_W  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_W, action = PULSEHI,
                     reg = A, data = PWM_DATA, hr_data = PWM_HRDATA}
    RES_HHL_U  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_U, action = PULSELO,
                     reg = A, data = 0, hr_data = 0}
    RES_HHL_V  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_V, action = PULSEHI,
                     reg = A, data = 0, hr_data = 0}
    RES_HHL_W  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_W, action = PULSEHI,
                     reg = A, data = 0, hr_data = 0}
    
    ; ********* UVW Encoder is: U:0 V:1 W:0 *********
    UVW_LHL    BR { next = UVW_LHH, cond_addr = UVW_LHL1, event = Low, pin = ENC_U}
    UVW_LHL1   BR { next = UVW_LHH, cond_addr = UVW_LHL2, event = High, pin = ENC_V}
    UVW_LHL2   BR { next = UVW_LHH, cond_addr = OUT_LHL_U, event = Low, pin = ENC_W}
    
    OUT_LHL_U  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_U, action = PULSEHI,
                     reg = A, data = PWM_DATA, hr_data = PWM_HRDATA}
    OUT_LHL_V  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_V, action = PULSELO,
                     reg = A, data = PWM_DATA, hr_data = PWM_HRDATA}
    OUT_LHL_W  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_W, action = PULSELO,
                     reg = A, data = 0, hr_data = 0}
    RES_LHL_U  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_U, action = PULSEHI,
                     reg = A, data = 0, hr_data = 0}
    RES_LHL_V  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_V, action = PULSEHI,
                     reg = A, data = 0, hr_data = 0}
    RES_LHL_W  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_W, action = PULSELO,
                     reg = A, data = 0, hr_data = 0}
    
    ; ********* UVW Encoder is: U:0 V:1 W:1 *********
    UVW_LHH   BR { next = UVW_LLH, cond_addr = UVW_LHH1, event = Low, pin = ENC_U}
    UVW_LHH1  BR { next = UVW_LLH, cond_addr = UVW_LHH2, event = High, pin = ENC_V}
    UVW_LHH2  BR { next = UVW_LLH, cond_addr = OUT_LHH_U, event = High, pin = ENC_W}
    
    OUT_LHH_U  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_U, action = PULSEHI,
                     reg = A, data = PWM_DATA, hr_data = PWM_HRDATA}
    OUT_LHH_V  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_V, action = PULSELO,
                     reg = A, data = 0, hr_data = 0}
    OUT_LHH_W  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_W, action = PULSELO,
                     reg = A, data = PWM_DATA, hr_data = PWM_HRDATA}
    RES_LHH_U  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_U, action = PULSEHI,
                     reg = A, data = 0, hr_data = 0}
    RES_LHH_V  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_V, action = PULSELO,
                     reg = A, data = 0, hr_data = 0}
    RES_LHH_W  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_W, action = PULSEHI,
                     reg = A, data = 0, hr_data = 0}
    
    ; ********* UVW Encoder is: U:0 V:0 W:1 *********
    UVW_LLH   BR { next = START, cond_addr = UVW_LLH1, event = Low, pin = ENC_U}
    UVW_LLH1  BR { next = START, cond_addr = UVW_LLH2, event = Low, pin = ENC_V}
    UVW_LLH2  BR { next = START, cond_addr = OUT_LLH_U, event = High, pin = ENC_W}
    
    OUT_LLH_U  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_U, action = PULSELO,
                     reg = A, data = 0, hr_data = 0}
    OUT_LLH_V  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_V, action = PULSEHI,
                     reg = A, data = PWM_DATA, hr_data = PWM_HRDATA}
    OUT_LLH_W  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = OUT_W, action = PULSELO,
                     reg = A, data = PWM_DATA, hr_data = PWM_HRDATA}
    RES_LLH_U  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_U, action = PULSELO,
                     reg = A, data = 0, hr_data = 0}
    RES_LLH_V  ECMP { hr_lr = HIGH, en_pin_action = ON, pin = RESET_V, action = PULSEHI,
                     reg = A, data = 0, hr_data = 0}
    RES_LLH_W  ECMP { next = START, hr_lr = HIGH, en_pin_action = ON, pin = RESET_W, action = PULSEHI,
                     reg = A, data = 0, hr_data = 0}

    But as you can see in the screenshot below, I have the unwanted delays again (highlighted in yellow). You mentioned that I have to clear the A register or the CNT register, but I am a bit lost on how I can achieve this. Any advice will be appreciated. Thanks!

  • Hello Jae,

    I read your code, and they look good to me. Did you do the test on the hardware? What HET IDE does is just a simulation which is little bit different from the result in real hardware.