STM32 HAL库 CUBEMX 定时器双通道 高精度捕获PWM波

使用标准库来配置的,可以看我之前的博客
https://blog.csdn.net/yuleitao/article/details/103721812
这个项目是使用CUBEMX配置,hal库来写,实现的功能一样

几个点注意

  • 使用定时器1,将通道1设置为主模式(直接模式),通道2设置为从模式(非直接模式)
  • 通道1捕获上升沿,通道二捕获下降沿
  • 节省CPU时间,提高捕获精度

CUBEMX配置

时钟,系统这些就不说了,直接最关键的部分,开定时器TIM1
在这里插入图片描述

  • trigger source 选择 TI1FP1
  • clock source 选择 internal clock
  • channel1 选择 input capture direct mode
  • channel2 选择 input capture indirect mode
    下方的设置按照图上所设一样就行

最后打开工程,插入如下代码,开启定时器1通道1和通道2的捕获中断

  /* USER CODE BEGIN 2 */

	HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_2);

  /* USER CODE END 2 */

在这里插入图片描述

在tim.c里添加如下代码,捕获中断的逻辑

/* USER CODE BEGIN 0 */

uint32_t Cap_Data1 ;
uint32_t Cap_Data2 ;
float Fre_Cap = 0.0;
float zhouqi_Cap = 0.0;
float Pwm_Duty = 0.0;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
		{
			Cap_Data1 = HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_1);
			if(Cap_Data1 != 0 )
			{
				Fre_Cap = 16.8 * 1000000/Cap_Data1;
				zhouqi_Cap = 1 / Fre_Cap;
				Pwm_Duty = Cap_Data2 * 1.0 /Cap_Data1;
			}
		}
	if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
		{
			Cap_Data2 = HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_2);
		}
}

/* USER CODE END 0 */

在这里插入图片描述

工程文件

上传到我的github 链接
https://github.com/yltzdhbc/PwmCapture_2Chanel

您可以使用STM32HAL库来配置定时器并输出双极性SPWM。下面是一个基本的示例代码,演示了如何使用STM32HAL库定时器来生成双极性SPWM。 首先,您需要在CubeMX中配置定时器和引脚。在"Pinout & Configuration"选项卡中,选择定时器并将其配置为PWM输出模式。然后,将定时器的引脚连接到适当的输出引脚。 接下来,在您的代码中包含必要的头文件,并定义一些全局变量和宏: ```c #include "stm32f4xx_hal.h" // 定时器句柄 TIM_HandleTypeDef htim; // SPWM的周期和占空比 uint16_t period = 2000; float dutyCycle = 0.5; // SPWM的参数 float amplitude = 1000.0; float frequency = 50.0; ``` 然后,在`main`函数中初始化定时器和GPIO引脚: ```c int main(void) { // 初始化HAL库 HAL_Init(); // 配置系统时钟 SystemClock_Config(); // 初始化定时器 TIM_Config(); // 启动定时器 HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1); // 无限循环 while (1) { // 更新占空比 TIM_SetDutyCycle(dutyCycle); // 延时一段时间 HAL_Delay(10); } } ``` 接下来,在`TIM_Config`函数中进行定时器的配置: ```c void TIM_Config(void) { // 使能定时器时钟 __HAL_RCC_TIM1_CLK_ENABLE(); // 初始化定时器句柄 htim.Instance = TIM1; htim.Init.Prescaler = 0; htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = period - 1; htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim.Init.RepetitionCounter = 0; HAL_TIM_PWM_Init(&htim); // 配置PWM通道 TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = period * dutyCycle; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1); } ``` 最后,在`TIM_SetDutyCycle`函数中更新占空比: ```c void TIM_SetDutyCycle(float dutyCycle) { // 计算SPWM的脉冲宽度 uint16_t pulseWidth = amplitude * (1 + sin(2 * PI * frequency * dutyCycle)) / 2; // 更新PWM通道的脉冲宽度 TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = pulseWidth; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1); // 重新启动PWM通道 HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1); } ``` 这样,您就可以使用STM32HAL库定时器来输出双极性SPWM。请根据您的具体需求调整代码中的参数和配置。希望对您有所帮助!
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值