栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

STM32F407xx系列HAL库配置定时器及PWM输出和输入捕获

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

STM32F407xx系列HAL库配置定时器及PWM输出和输入捕获

 

 

 HAL库配置基本定时器功能

 TIM7初始化代码CubeMX都帮我们配置好了,我们只需要修改主函数代码即可

main.c

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM7_Init();
	HAL_TIM_Base_Start_IT(&htim7);
  while (1)
  {

  }
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_15);
}

PWM输入捕获

概念理解

输入捕获就是当连接到定时器的引脚上产生电平变化时对应的捕获装置会立即将当前计数值复制到另一个寄存器中。你可以开启捕获中断然后在中断处理函数中读出保存的计数值。

与输入捕获不同的是PWM输入模式会将同一个输入信号(TI1或TI2)连接到两个捕获装置(IC1和IC2)。这两个捕获装置一个捕获上升沿一个捕获下降沿。TI1FP1、TI2FP2它们中的一个被选择为触发输入且从模式控制器被配置为复位模式。

1、每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可是设置管脚和寄存器的对应关系。

2、同一个TIx输入映射了两个ICx信号。

3、这两个ICx信号分别在相反的极性边沿有效。

4、两个边沿信号中的一个被选为触发信号,并且从模式控制器被设置成复位模式。

5、当触发信号来临时,被设置成触发输入信号的捕获寄存器,捕获“一个PWM周期(即连续的两个上升沿或下降沿)”,它等于包含TIM时钟周期的个数(即捕获寄存器中捕获的为TIM的计数个数n)。

6、同样另一个捕获通道捕获触发信号和下一个相反极性的边沿信号的计数个数m,即(即高电平的周期或低电平的周期)

7、由此可以计算出PWM的时钟周期和占空比了

frequency=f(TIM时钟频率)/n。

duty cycle=(高电平计数个数/n),

若m为高电平计数个数,则duty cycle=m/n

若m为低电平计数个数,则duty cycle=(n-m)/n

PWM输出配置

 

 

 PWM输入捕获配置

 

 

 初始化配置代码CubeMX都帮我们配置好了,我们只需要修改TIM8的中断回调函数以及主函数

中断回调函数

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  {
	  
	  IC1Value = HAL_TIM_ReadCapturedValue(&htim8,TIM_CHANNEL_1);
	  IC2Value = HAL_TIM_ReadCapturedValue(&htim8,TIM_CHANNEL_2);	
	  if (IC1Value != 0)
	  {
		
		DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);

		
		Frequency = 168000000/168/(float)(IC1Value+1);
		
	  }
	  else
	  {
		DutyCycle = 0;
		Frequency = 0;
	  }

  }
}

main.c

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM4_Init();
  MX_TIM8_Init();
  MX_USART1_UART_Init();
	
	
	HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
	
	HAL_TIM_IC_Start_IT(&htim8,TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT(&htim8,TIM_CHANNEL_2);
  while (1)
  {
		HAL_Delay(500);
		printf("IC1Value = %d  IC2Value = %d ",IC1Value,IC2Value);
		printf("占空比:%0.2f%%   频率:%0.2fHzn",DutyCycle,Frequency);	
  }

}

实验结果

TIM8输出四路PWM-------输出比较,后续电机控制中需要用到

 

 初始化配置代码CubeMX都帮我们配置好了,我们只需要修改TIM8的比较中断回调函数以及主函数

中断回调函数

void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
  __IO uint16_t count;
  
  
  count = __HAL_TIM_GET_COUNTER(htim);
  
  
  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
  {
    __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, count + 25);
  }
  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
  {
    __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, count + 51);
  }
  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3)
  {
    __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_3, count + 77);
  }
  if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_4)
  {
    __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_4, count + 103);
  }
}

main.c

int main(void)
{

  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();
  MX_TIM8_Init();
  MX_USART1_UART_Init();
	
	HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_1);
  
	HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_2);
  
	HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_3);
  
	HAL_TIM_OC_Start_IT(&htim8, TIM_CHANNEL_4);
	
	
	TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_1, TIM_CCx_ENABLE);
  
	TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_2, TIM_CCx_ENABLE);
  
	TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_3, TIM_CCx_ENABLE);
  
	TIM_CCxChannelCmd(TIM8, TIM_CHANNEL_4, TIM_CCx_ENABLE);
  while (1)
  {

  }
}

实验结果可以用示波器进行测量

刚做完PWM输出实验,这里做一个记录,感谢大家的阅读!!!^_^

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/942345.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号