eefocus_3957219 发表于 2025-8-18 00:01:05

【RISC-V 先楫半导体HPM5E00 MCU开发板试用体验】PWM触发ADC

使用互联管理器TRGM将PWM和ADC关联起来,在PWM波谷时同时触发ADC0和ADC1采样,采样结束后进入ADC中断,在ADC中断中完成电机控制相关逻辑。

关键代码:

```
trgm_output_cfg.invert = false;
trgm_output_cfg.type   = trgm_output_same_as_input;
trgm_output_cfg.input= HPM_TRGM0_INPUT_SRC_PWM0_TRGO_0;
trgm_output_config( HPM_TRGM0, HPM_TRGM0_OUTPUT_SRC_ADCX_PTRGI0A, &trgm_output_cfg );
```

`trgm_output_cfg.input = HPM_TRGM0_INPUT_SRC_PWM0_TRGO_0;`使用PWM作为触发源。

`HPM_TRGM0_OUTPUT_SRC_ADCX_PTRGI0A`将触发信号链接至ADC的TRG0A触发输入。

```
adc16_pmt_config_t adc16;

adc16.trig_ch   = ADC16_CONFIG_TRG0A;
adc16.trig_len= 2;
adc16.inten = false;
adc16.inten = true;
adc16.adc_ch = 4;
adc16.adc_ch = 5;
adc16_set_pmt_config( HPM_ADC0, &adc16 );

adc16.trig_ch   = ADC16_CONFIG_TRG0A;
adc16.trig_len= 2;
adc16.inten = false;
adc16.inten = false;
adc16.adc_ch = 6;
adc16.adc_ch = 7;
adc16_set_pmt_config( HPM_ADC1, &adc16 );

adc16_enable_pmt_queue( HPM_ADC0, ADC16_CONFIG_TRG0A );
adc16_enable_pmt_queue( HPM_ADC1, ADC16_CONFIG_TRG0A );
```

在ADC配置时,由于该点点taptap安卓只有两个ADC,所以将母线电压、U、V、W四个采样信号分为两组,分别分配给ADC0和ADC1。

两个ADC的采样都使用ADC16_CONFIG_TRG0A触发,这样就可以实现在PWM波谷处同时触发两个ADC完成模拟量采样。

中断部分代码:

```
SDK_DECLARE_EXT_ISR_M(BOARD_BLDC_ADC_IRQn, isr_adc)
void isr_adc(void)
{
    uint32_t status;
    status = adc16_get_status_flags( BOARD_BLDC_ADC_U_BASE );
    if ((status & BOARD_BLDC_ADC_TRIG_FLAG) != 0)
    {
      adc16_clear_status_flags( BOARD_BLDC_ADC_U_BASE, BOARD_BLDC_ADC_TRIG_FLAG );
   
      /* 电流、电压信息读取 */


      /* 位置信息读取 */


      /* FOC */


      /* 设置占空比 */
      pwmv2_shadow_register_unlock( HPM_PWM0 );
      pwmv2_set_shadow_val( HPM_PWM0, PWMV2_SHADOW_INDEX(1), (reload - duty_cmp) >> 1, 0, false );
      pwmv2_set_shadow_val( HPM_PWM0, PWMV2_SHADOW_INDEX(2), (reload + duty_cmp) >> 1, 0, false );
      pwmv2_set_shadow_val( HPM_PWM0, PWMV2_SHADOW_INDEX(3), (reload - duty_cmp) >> 1, 0, false );
      pwmv2_set_shadow_val( HPM_PWM0, PWMV2_SHADOW_INDEX(4), (reload + duty_cmp) >> 1, 0, false );
      pwmv2_set_shadow_val( HPM_PWM0, PWMV2_SHADOW_INDEX(5), (reload - duty_cmp) >> 1, 0, false );
      pwmv2_set_shadow_val( HPM_PWM0, PWMV2_SHADOW_INDEX(6), (reload + duty_cmp) >> 1, 0, false );
      pwmv2_shadow_register_lock( HPM_PWM0 );
    }
}
```



跑一下电机:

!(//m.qjumbo.com/forum/data/attachment/forum/202508/17/235752qirr84ffsd5s5swh.gif)



页: [1]
查看完整版本: 【RISC-V 先楫半导体HPM5E00 MCU开发板试用体验】PWM触发ADC

Baidu
map