PWM波、方波的输出与捕获

一、PWM

使用定时器17的通道1使PA7引脚输出PWM。

STM32CubeMX配置:

系统主频80MHZ,经过(79+1)分频,得到1MHZ,计数值为(999+1),比较值为(299+1),PWM1模式,输出极性为高,则频率为1khz,占空比为30%(小于300,输出高电平)。

注:PWM波的输出不用配置中断。

HAL_TIM_PWM_Start(&htim17, TIM_CHANNEL_1);   // pwm输出

在while循环前调用该函数即可输出波形。

设置PWM波的占空比:__HAL_TIM_SET_COMPARE();

设置PWM波的频率:__HAL_TIM_SET_AUTORELOAD(),一般设置频率时,要使占空比不变,所以,还要重新设置PWM波的占空比。该函数在运行时设置 TIM 自动重新加载寄存器值,而无需再次调用任何 Init 函数。若需要修改频率,需要使能自动重装载寄存器

二、方波

使用定时器16的通道1使PA6输出方波。

STM32CubeMX配置:

 使用定时器输出模式的翻转模式,与设置的比较直相比,若相等则电平翻转一次,并且触发中断,在中断里面在原来的计数值上加上比较值

HAL_TIM_OC_Start_IT(&htim16,TIM_CHANNEL_1); // 方波 ,写在while前的初始化


void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM16)
	{
		if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
		{
			 __HAL_TIM_SET_COMPARE(&htim16, TIM_CHANNEL_1, (__HAL_TIM_GET_COUNTER(&htim16)+100)); // 设置比较值
		}
		HAL_TIM_OC_Start_IT(&htim16,TIM_CHANNEL_1);
	}
}

三、波的输入捕获

使用定时器2的通道2是PA1引脚测量波的频率和占空比。

STM32CubeMX配置:

 

 这里信号的输入为通道2,则通道2必须设置为直接输入捕获模式,并且必须选择上升沿触发。通道1选择间接输入捕获模式,选择下升沿触发。

HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); // 输入捕获
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);



void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM2)
	{
		if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
		{
			period_val = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_2)+1;
			duty_val = HAL_TIM_ReadCapturedValue(&htim2, TIM_CHANNEL_1)+1;
			
			if(period_val)
			{
				__HAL_TIM_SET_COUNTER(&htim2, 0); 
				freq = 1000000/ period_val;      
				duty = (duty_val/period_val)*100;
			}
			
		}
		HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
		HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
	}
	
	
}

注意一定要在每一次捕获数值后,将计数值清0,为下一次捕获做准备。

四、设置PWM波的频率和占空比

①输出频率可调,占空比固定的PWM

每按一次按键1频率增加500hz,每按一次按键2频率减少500hz,并保持占空比不变。

        if(key_up==3)
		{
			pwm7 = freq; // 获取pwm参数
			duty7 = 0.1; // duty7 = duty;
			pwm7 += 500;
			if(pwm7 > 10000)
			{
				pwm7=10000;
			}
			pwm7_val = 1000000/pwm7;
			pwm7_duty = pwm7_val * 0.1;
			__HAL_TIM_SET_AUTORELOAD(&htim3, pwm7_val);
			__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, pwm7_duty);
			
			
		}

 这里如果用输入捕获测得的占空比,频率增加越多,占空比误差越多,建议将占空比固定。

ARR值=1000000 / freq;  (1000000是系统时钟经过预分配提供给定时器的计数时钟)

占空比 = compare值 / arr值 * 100; 

②输出频率可调,占空比可以调的PWM

和①一样的,使用一些函数即可,注意打开使能自动重载载值。

设置PWM波的占空比:__HAL_TIM_SET_COMPARE();

设置PWM波的频率:__HAL_TIM_SET_AUTORELOAD();

③交换两路的PWM的频率和占空比

PA6:1khz,占空比:50%;PA7:0.5khz,占空比:10%。每次按键按下交换频率和占空比。

    	if(key_up==2)
		{
			// 获取各PWM的比较值,arr值
			pwm6_val = __HAL_TIM_GET_AUTORELOAD(&htim16);
			pwm6_duty = __HAL_TIM_GET_COMPARE(&htim16,TIM_CHANNEL_1);
			
			
			pwm7_val = __HAL_TIM_GET_AUTORELOAD(&htim3);
			pwm7_duty = __HAL_TIM_GET_COMPARE(&htim3,TIM_CHANNEL_2);
			
			
			// PA6-->PA7
			__HAL_TIM_SET_AUTORELOAD(&htim16, pwm7_val);
			__HAL_TIM_SET_COMPARE(&htim16, TIM_CHANNEL_1, pwm7_duty);
			
			// PA7-->PA6
			__HAL_TIM_SET_AUTORELOAD(&htim3, pwm6_val);
			__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, pwm6_duty);

		}

注意:修改PWM的参数时,打开使能自动重装载值。

小结

判断定时器的通道:HAL_TIM_ACTIVE_CHANNEL_1

定时器的通道:TIM_CHANNEL_1

启动 PWM 信号生成:HAL_TIM_PWM_Start()

在中断模式下启动 TIM 输入捕获测量:  HAL_TIM_IC_Start_IT()

在中断模式下启动 TIM 输出比较信号生成:HAL_TIM_OC_Start_IT()

设置定时器比较值(占空比):__HAL_TIM_SET_COMPARE()

设置定时器自动重装载值(频率):__HAL_TIM_SET_AUTORELOAD()

获取定时器计数值:__HAL_TIM_GET_COUNTER()

设置定时器计数值:__HAL_TIM_SET_COUNTER()

获取定时器捕获值:HAL_TIM_ReadCapturedValue()

猜你喜欢

转载自blog.csdn.net/qq_53144843/article/details/123880382