STM32F407在TIM1计数模式为上下计数时,TIM1与TIM2同步配置同时使用TIM2触发ADC

STM32F407在TIM1计数模式为上下计数时,TIM1与TIM2同步配置同时使用TIM2触发ADC

1 概述

SVPWM作为一种脉冲调制方式已被广泛的应用在电机调速,以及变流器的控制中。在通过计算得到每个扇区作用时间后需要转换成MCU对应的计数值,根据SVPWM每个扇区作用时开关的切换顺序,如图1是扇区一作用时开关的切换顺序,可以得到最适合SVPWM的MCU计数方式是上下计数。
图1图一
由于STM32在使用上下计数模式时会在每一次溢出都会产生一次更新事件从而触发中断。
在这里插入图片描述
所以会导致事件中断频率是PWM频率的两倍,所以在这里采用TIM1与TIM2同步的方式让TIM2产生事件跟新中断,TIM2与TIM1周期相同并且同时工作,TIM2采用向上计数方式,占空比设置为50%,从而使得中断频率与PWM频率相同。

TIM1的CubeMX配置

TIM1使用内部时钟源,同时输出三路互补的PWM,计数模式为中心对齐模式1(Center Aligned mode1),频率为10KHz。根据中心对齐模式的特点,计数值为8400.
在这里插入图片描述
由于需要通过TIM1来触发TIM2使得TIM1与TIM2同步,所以需要使能TIM1主模式使能触发,触发源选择计数使能
这是根据F4手册中的一个例子得到的,例子中是用外部触发来使能TIM1计数再通过TIM1使能TIM2计数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来就是死区以及PWM占空比等等的配置,死区时间需要根据具体的开关器件来确定,本文中死区时间设置为0。
在这里插入图片描述

TIM2的CubeMX配置

由于TIM2需要由TIM1触发,所以从模式选着触发模式(Trigger Mode)触发源选着ITR0
在这里插入图片描述
时钟源选着内部时钟,由于需要使用TIM2去触发ADC,所以将通道二配置成PWM不输出
在这里插入图片描述
由于TIM2的总线时钟频率为TIM1时钟频率的一半(TIM2在总线APB1上TIM1在总线APB2上),所以TIM2工作在向上计数模式的时候,计数频率设置为10KHz时,计数值设为8400.需要通过TIM2来触发ADC采样,所以使能TIM2主模式,触发事件选择更新事件(Update Event),
pwm模式选着pwm mode 1.占空比设置为50%即4200。
在这里插入图片描述
并且开启TIM2的中断
在这里插入图片描述

ADC的CubeMX配置

ADC1的CubeMX配置如下图所示
在这里插入图片描述
由于使用了多个采用通道所以需要使能扫描模式,同时禁止连续与不连续模式,使能DMA,触发源选择Timer2 触发输出事件(Timer2 Trigger Out Event),触发检测采用上升沿检测。DMA配置如下图所示
在这里插入图片描述
DMA采用循环模式,数据宽度都采用Word型(32位)。

生成代码后的一些配置

首先对串口进行重定向,我是用的是UART1,在main函数的用户代码区加入如下代码

int fputc(int c, FILE *stream)
{
	HAL_UART_Transmit(&huart1, (unsigned char *)&c, 1, 1000); 
	return 1;
}

在这里插入图片描述
在初始化函数下加入以下代码

	HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_Value,3);
    HAL_TIM_Base_Start(&htim1);
	HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
	HAL_TIMEx_PWMN_Start(&htim1,TIM_CHANNEL_1);
	__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,4200);
	HAL_TIM_Base_Start_IT(&htim2);

在这里插入图片描述
在tim.c里加入TIM回调函数

/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
		if(htim->Instance == TIM2)
		{
				HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_14);
				Udc_in  = ADC_Value[0];
				Udc_out = ADC_Value[1];
				Idc_out = ADC_Value[2];	
		}
}

其中翻转GPIOD14的目的是为了观测中断频率
同时在主函数while循环里打印ADC的值;

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
//		OLED_P6x8Str(0,0,"DC_MODE = DC_CLOSE");
		printf("%d\r\n",Udc_in);
		printf("%d\r\n",Udc_out);
		printf("%d\r\n",Idc_out);
		
  }
  /* USER CODE END 3 */
}

实验结果

从示波器上可以看出PWM输出频率是10K(通道一黄色),中断频率是10K(通道二蓝色显示的是5K,这是因为每一次中断才翻转一次电平),在这里插入图片描述
可以看到TIM2比TIM1略有延迟,手册中也有说明
在这里插入图片描述
串口传输的是ADC寄存器的值
在这里插入图片描述

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: STM32F030C8T6是一款基于ARM Cortex-M0内核的单片机,它具有一些内置的模块和外设,例如ADC和定器。ADC是模数转换器,用于将模拟信号转换为数字信号,而定器则用于生成定中断或脉冲。 要配置STM32F030C8T6的ADC使用触发,首先需要设置ADC钟和引脚。然后,我们需要配置器的钟和相关参数。 对于ADC配置,我们可以使用寄存器来完成。首先,我们需要启用ADC钟,并选择ADC的工作模式和采样间。然后,我们需要配置ADC的引脚和通道。接下来,我们可以设置ADC的转换模式和分辨率。最后,我们需要启用ADC。 对于定器的配置,我们同样需要使用寄存器来完成。首先,我们需要启用定器的钟。然后,我们需要配置器的分频系数和计数模式。接下来,我们可以设置定器的重装载值和计数方向。最后,我们需要启用定器和定器中断。 最后,我们还需要编写中断服务子程序(ISR)来处理定器中断。在ISR中,我们可以执行一些特定的操作,例如启动ADC转换或读取ADC结果等。 需要注意的是,以上只是一个大致的步骤,实际的配置使用可能涉及到更多的细节和设置。具体的配置细节可以参考STM32F030C8T6的参考手册和相关的资料。 通过以上的步骤,我们可以成功地配置使用ADC和定器来实现定触发并测量模拟信号的目的。 ### 回答2: STM32F030C8T6是一款基于ARM Cortex-M0内核的单片机,内置了ADC(模数转换器)和定器。下面是关于如何配置使用触发ADC的步骤: 1. 首先,需要启用ADC和相关的GPIO端口。可以使用RCC(Reset and Clock Control)寄存器配置使能ADC,并将相应的GPIO端口设置为模拟输入模式。 2. 配置ADC的基本参数,例如转换分辨率、采样间等。可以使用ADC_CR寄存器进行配置。 3. 配置ADC的通道和触发源。可以通过ADC_CHSELR寄存器来选择要转换的通道,并使用ADC_CFGR1寄存器来选择ADC触发源。在本例中,我们使用器作为ADC触发源。 4. 配置器的基本参数,例如钟频率、预分频因子、计数模式等。可以使用TIMx_CR1、TIMx_PSC和TIMx_ARR寄存器进行配置。 5. 配置器的触发源和触发模式。可以使用TIMx_SMCR寄存器来选择定器的触发源,并使用TIMx_CR2寄存器来选择触发模式。在本例中,我们选择外部事件触发模式,并将ADC转换触发源设置为TIMx的TRGO信号。 6. 启动定器和ADC。可以分别使用TIMx_CR1和ADC_CR寄存器的相应位来启动定器和ADC。 7. 在定器溢出中断中进行ADC转换。如果定器的计数器溢出中断使能,则可以在该中断处理函数中触发ADC转换。在中断处理函数中,可以使用ADC_CR寄存器的ADSTART位触发ADC转换。 8. 在ADC转换结束中断中读取转换结果。如果ADC转换完成中断使能,则可以在该中断处理函数中读取ADC转换结果。可以使用ADC_DR寄存器读取转换结果。 通过以上步骤,就可以配置使用触发ADC的功能了。需要根据具体的应用场景和需求进行相应的配置和调整。 ### 回答3: stm32f030c8t6是一款32位的ARM Cortex-M0微控制器,提供了多个模块和功能,其中包括一个12位的ADC(模数转换器)和多个定器。 要配置使用触发ADC,首先需要进行以下几个步骤: 1. 选择使用的定器:stm32f030c8t6提供了多个定器,例如TIM2、TIM3、TIM14等。根据需求选择一个合适的定器。 2. 配置器:使用寄存器设置定器的钟源、预分频因子、计数模式和自动重装载值等参数。可以参考芯片手册和相应的寄存器描述来进行配置。 3. 配置ADC使用寄存器设置ADC的采样通道、分辨率、采样间和转换模式等参数。同样可以参考芯片手册和寄存器描述进行配置。 4. 配置触发ADC:将定器的触发源设置为ADC转换触发源,并设置相应的触发极性和触发分频因子。 5. 初始化和启动定器和ADC:根据配置的参数,初始化定器和ADC,并启动它们的工作。 6. 编写中断处理程序(可选):如果需要使用器中断触发ADC转换,可以编写相应的中断处理程序,并在程序中启用定器中断。 以上就是使用触发ADC配置步骤。在实际使用中,需要根据具体的需求和外部电路进行相应的配置和连接。同,还需要注意定器和ADC的初始化顺序和序要求,以确保它们能够按照预期工作。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值