High-resolution timer ,HRTIM(二)

        本篇以STM32G474芯片为例,主要讲述HRTIM如何在PWM中点处触发Dual ADC采样。首先,我会介绍Dual ADC,然后介绍PWM触发ADC采样。模块的详细描述,见RM0440 Rev8。我此前也没有independent adc和dual adc的概念,这次程序移植过程,给了我些浅薄认知,不管对错,先记录下来。另外,再给大家推荐一个链接,这是ST工作人员写的文章。

STM32G474 中 ADC 触发分频的实现方式 - STM32团队 ST意法半导体中文论坛 (stmicroelectronics.cn)

Dual ADC

      相对于indepent adc模式而言,dual adc模式下,分为主从定adc模块,2个模块的不同通道同时进行采样,特别适合计算瞬时功率,因为可以获得同一时刻的电流,电压数据。采样结束后,会将数据存储在ADC公用数据寄存器(ADCx_CDR)中,MCU可以同时转换2个模块的adc数据。通常主ADC通道数据存储在ADCx_CDR寄存器高16为,从ADC模块通道数据存储在ADCx_CDR寄存器低16位。我配置时,采用Dual regulation simultaneously mode only,ADC1为主ADC,ADC2为从ADC。芯片手册里面有说明要开始dual mode转换之前,需要通过设定EXTEN[1:0](extern enable),EXTSET(extern selection)为选择ADC的外部触发源,规则触发亦或者注入触发。我选择的是规则模式,外部硬件触发。

PWM触发ADC采样

       我通过下图设置了主从ADC通道的转换顺序,并设置了ADC的外部触发源,这里可以看出触发源为高精度定时器触发事件1,且在上升沿触发。

       为了设置PWM中点处触发adc采样,需要再去配置HRTIM模块,下图使能HRTIM模块ADC触发配置1,并将触发源设置为HRTIM从定时器TimerB,并在数值与Timer B compare 3数值相同时触发。该数值为2720,始终是HRTIM PWM周期5440的1/2,故可以做到在PWM中点处触发ADC采样。

DMA传输ADC数据

        ADC采样完成后,触发DMA模块,DMA传输采用循环模式,每次传输一个字(4Byte,32bit),DMA源地址不变,为ADCx_CCR寄存器所在地址,目的地址为程序声明的全局数组。主从ADC我各开启三个通道,攻击3*2*16bit,一次传输3个字即可完成ADC数据传输。

        但是,实际应用过程中,我发现,每读取一次数据都需要重新开启ADC转换。最后,粘贴一段代码。

   printf("ADC test\r\n");
   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5|GPIO_PIN_6);
   HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
   HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);
//   HAL_ADC_Start_DMA(&hadc1,volArr,4);

   HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t *)volArr,2);


  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

//	printf("Vout %x,Vin %x  Iin %x Iout %x\n",volArr[0],volArr[1],volArr[2],volArr[3]);
	for(int i=0;i<2;i++){
//		printf("volArr[%d] %d %d %x  ",i,(volArr[i]>>16),volArr[i]&0xFFFF,volArr[i]);
		printf("volArr[%d] %d %d ",i,(int)(volArr[i]>>16),(int)volArr[i]&0xFFFF);
	}
	printf("\n");
//	HAL_ADC_Start_DMA(&hadc1,volArr,4);
//	HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t *)volArr,2);

	LL_ADC_REG_StartConversion(ADC1);

	HAL_Delay(1000);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值