STM32/STM8技术论坛
直播中

邹佳金

1年用户 4经验值
擅长:嵌入式技术 模拟技术 EMC/EMI设计 处理器/DSP 控制/MCU
私信 关注
[问答]

STM32H743的高精度定时器触发ADC采样

目前做的是移相全桥,配置出一对可以移相互补的PWM波,目前已经能够产生了,但是,还是想要在滞后桥臂导通时采集数据,即在后桥臂开启时使用hrtim中的ADC触发采样,我这个就是在master compare 1 上处产生触发信号给ADC。根据网上的教程也一步步试过了,但是hrtim总是启动不了ADC。为了方便排查所以目前没有使用DMA进行转运数据,也没有写转运数据的处理函数。
STM32Cubemx配置如下:
Master Timer配置
image.png
Timer A配置

image.png
image.png
image.png

Timer B配置
image.png
image.png
image.png
Trigger 配置
image.png
ADC1配置
image.png
ADC2配置

image.png
启动的代码

HAL_ADCEx_Calibration_Start(&hadc2,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);
HAL_ADCEx_Calibration_Start(&hadc3,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);
HAL_ADCEx_Calibration_Start(&hadc1,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED);
HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TA1|HRTIM_OUTPUT_TA2); 
HAL_HRTIM_WaveformCounterStart(&hhrtim, HRTIM_TIMERID_TIMER_A);
HAL_HRTIM_WaveformOutputStart(&hhrtim, HRTIM_OUTPUT_TB1|HRTIM_OUTPUT_TB2); 
HAL_HRTIM_WaveformCounterStart(&hhrtim, HRTIM_TIMERID_TIMER_B);
HAL_HRTIM_WaveformCountStart_IT(&hhrtim, HRTIM_TIMERID_MASTER);

ADC1寄存器
image.png

回帖(1)

douyin8

2025-1-13 17:31:04
根据您的描述,您已经成功生成了一对可以移相互补的PWM波,并且希望在滞后桥臂导通时采集数据。您尝试在master compare 1 上产生触发信号给ADC,但是HRTIM总是启动不了ADC。为了帮助您解决问题,我将提供一些建议和步骤。

1. 确保HRTIM和ADC的时钟已经开启:
在CubeMX中,确保HRTIM和ADC的时钟已经开启。如果没有开启,您可以手动在代码中添加以下代码:
```c
__HAL_RCC_HRTIM1_CLK_ENABLE();
__HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_ADC2_CLK_ENABLE();
__HAL_RCC_ADC3_CLK_ENABLE();
```

2. 配置HRTIM的ADC触发:
在HRTIM的配置中,您需要配置ADC触发。确保您已经设置了ADC触发的通道和比较值。例如,如果您希望在master compare 1 上产生触发信号,您可以设置如下:
```c
hhrtim1.Instance = HRTIM1;
hhrtim1.Init.Prescaler = HRTIM_PRESCALERR_PRESCALER_DIV16;
hhrtim1.Init.HRTImode = HRTIM_MODE_SINGLE;
hhrtim1.Init.ADCTriggerUpdate = HRTIM_ADCTRIGGERUPDATE_EACHBURST;
hhrtim1.Init.ADCTrigger = HRTIM_ADCTRIGGEREVENT_MASTER_CMP1;
hhrtim1.Init.ADCBurstTrigger = HRTIM_ADCBURSTTRIGGER_MASTER_CMP1;
if (HAL_HRTIM_Init(&hhrtim1) != HAL_OK)
{
  Error_Handler();
}
```

3. 配置ADC:
确保您已经正确配置了ADC。在CubeMX中,您可以设置ADC的参数,如分辨率、采样时间等。同时,确保您已经启用了ADC的连续模式:
```c
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
  Error_Handler();
}
```

4. 启动HRTIM和ADC:
在您的启动代码中,确保您已经启动了HRTIM和ADC。例如:
```c
if (HAL_HRTIM_MasterBase_Start(&hhrtim1, HRTIM_TIMERINDEX_MASTER) != HAL_OK)
{
  Error_Handler();
}
if (HAL_ADC_Start(&hadc1) != HAL_OK)
{
  Error_Handler();
}
```

5. 检查错误:
如果以上步骤都无法解决问题,您可以检查HRTIM和ADC的错误状态。例如:
```c
uint32_t hrtim_error = HAL_HRTIM_GetError(&hhrtim1);
if (hrtim_error != HAL_HRTIM_ERROR_NONE)
{
  Error_Handler();
}
uint32_t adc_error = HAL_ADC_GetError(&hadc1);
if (adc_error != HAL_ADC_ERROR_NONE)
{
  Error_Handler();
}
```

通过以上步骤,您应该能够解决HRTIM启动不了ADC的问题。如果问题仍然存在,请检查您的硬件连接和配置是否正确。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分