Skip to content

定时器

基本定时器

image-20231201195117247

image-20231201195219189

image-20231201195239509

基本定时器的计数模式和时钟分频因子是没有用的, 也没有重复计数器

生成PWM

配置

image-20231202210853799

image-20231202211037959

image-20231202211147643

PWM模式只需要设置前面三个

实际的使用

image-20231202213837866

测量脉冲长度

image-20231202221230514

image-20231202223150133

image-20231202223222103

image-20231202223417148

捕获脉冲

image-20231203190002368

image-20231203190705953

image-20231203190746699

高级定时器输出指定数量的PWM

image-20231203195856354

输出比较

image-20231203210128991

image-20231203210149474

带死区的PWM输出

image-20231204154458900

image-20231204154539724

image-20231204154557967

比较极性就是有效电平, 空闲状态下的电平就是刹车以后得电平

image-20231204154619245

关闭状态就是定时器不工作时候的输出信号设置

锁寄存器也不使用

自动恢复会在下一个时钟更新事件以后恢复输出

image-20231204161502074

捕获PWM

image-20231204170107764

image-20231204170243714

image-20231204170300039

image-20231219193602286

c
	HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);

开启的时候只打开了通道一的中断

c
uint32_t ccrl_val1a=0, ccrl_val1b=0, frq1 = 0, ccrl_val2a=0, ccrl_val2b=0, frq2 = 0;
float duty1 = 0, duty2 = 0;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
	if(htim->Instance==TIM2)
	{
		ccrl_val1a = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);//获取捕获到的值
		ccrl_val1b = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
		__HAL_TIM_SetCounter(htim, 0);
		frq1 = (80000000/80)/ccrl_val1a;//计算周期
		duty1 = (ccrl_val1b*1.0/ccrl_val1a)*100;//计算占空比
		HAL_TIM_IC_Start(htim, TIM_CHANNEL_1);//重新使能通道
		HAL_TIM_IC_Start(htim, TIM_CHANNEL_2);
	}
	if(htim->Instance==TIM3)
	{
		ccrl_val2a = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
		ccrl_val2b = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
		__HAL_TIM_SetCounter(htim, 0);
		frq2 = (80000000/80)/ccrl_val2a;
		duty2 = (ccrl_val2b*1.0/ccrl_val2a)*100;
		HAL_TIM_IC_Start(htim, TIM_CHANNEL_1);
		HAL_TIM_IC_Start(htim, TIM_CHANNEL_2);
	}
}

电容按键

image-20231205194310309

image-20231205195147621