STM32-HAL库08-TIM的输出比较模式(输出PWM的另一种方式)

STM32-HAL库08-TIM的输出比较模式(输出PWM的另一种方式)

一、所用材料:

STM32F103C6T6最小系统板
STM32CUBEMX(HAL库软件)
MDK5
示波器或者逻辑分析仪

二、所学内容:

通过定时器TIM的输出比较模式得到预定频率与占空比的PWM波形;其中定时器输出比较模式与PWM模式的区别在于!!!PWM模式在同一个TIM下所有输出口的频率一致不能单独控制单个的频率,而输出比较模式就弥补了这一缺点,可以对同一个TIM下的各个输出口分别设置频率。

三、CUBEMX配置:

第一步:老三件套-RCC,SYS,时钟树配置



第二步:TIM配置

关键参数配置:

  • Prescale-(71)
  • auto reload preload-Disable
  • Output Compare Channel1 -Mode - Toggle on match
  • Output Compare Channel2 -Mode - Toggle on match
    以及点亮TIM2的所有中断


第二步:MDK5程序配置

只需要在main.c中加入中断回调函数即可,具体程序如下:

c 复制代码
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "gpio.h"
/* USER CODE BEGIN PTD */
uint16_t OC_Channel1_Pulse=125;  //改变该值可以改变PWM1的频率
uint16_t OC_Channel2_Pulse=1000;  //改变该值可以改变PWM2的频率
uint32_t F_PWM1;				//PWM1的频率设定值
uint32_t F_PWM2;				//PWM2的频率设定值

float OC_Channel1_Duty=50;		//PWM1占空比设定
float OC_Channel2_Duty=50;		//PWM2占空比设定

void SystemClock_Config(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_OC_Start_IT(&htim1,TIM_CHANNEL_1);                 //使能TIM4通道1的输出比较中断
  TIM_CCxChannelCmd(TIM1,TIM_CHANNEL_1,TIM_CCx_ENABLE);      //使能TIM4通道1
    HAL_TIM_OC_Start_IT(&htim1,TIM_CHANNEL_2);                 //使能TIM4通道1的输出比较中断
  TIM_CCxChannelCmd(TIM1,TIM_CHANNEL_2,TIM_CCx_ENABLE);      //使能TIM4通道1
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  F_PWM1=8000;
	  OC_Channel1_Pulse=1000000/F_PWM1;
	  F_PWM2=5000;
	  OC_Channel2_Pulse=1000000/F_PWM2;
	  HAL_Delay(1);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}


/* USER CODE BEGIN 4 */
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
  uint32_t OC_Count = 0;

  OC_Count = __HAL_TIM_GET_COUNTER(htim);

  if(htim->Instance == TIM1)
  {
    if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
    {
      if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8))
      {
        __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,OC_Count + OC_Channel1_Pulse - OC_Channel1_Duty*OC_Channel1_Pulse/100);
      }
      else
      {
        __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,OC_Count + OC_Channel1_Duty*OC_Channel1_Pulse/100);
      }
    }
    else if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
    {
      if(GPIO_PIN_RESET == HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9))
      {
        __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,OC_Count + OC_Channel2_Pulse - OC_Channel2_Duty*OC_Channel2_Pulse/100);
      }
      else
      {
        __HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_2,OC_Count + OC_Channel2_Duty*OC_Channel2_Pulse/100);
      }
    }
  }
}
/* USER CODE END 4 */

本文中的代码资源免费提供,下载页面如下:
https://download.csdn.net/download/qq_45854134/88495306

相关推荐
lucy153027510791 小时前
【青牛科技】GC5931:工业风扇驱动芯片的卓越替代者
人工智能·科技·单片机·嵌入式硬件·算法·机器学习
scan113 小时前
单片机串口接收状态机STM32
stm32·单片机·串口·51·串口接收
Qingniu0114 小时前
【青牛科技】应用方案 | RTC实时时钟芯片D8563和D1302
科技·单片机·嵌入式硬件·实时音视频·安防·工控·储能
Mortal_hhh15 小时前
VScode的C/C++点击转到定义,不是跳转定义而是跳转声明怎么办?(内附详细做法)
ide·vscode·stm32·编辑器
深圳市青牛科技实业有限公司15 小时前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
Mr.谢尔比16 小时前
电赛入门之软件stm32keil+cubemx
stm32·单片机·嵌入式硬件·mcu·信息与通信·信号处理
LightningJie16 小时前
STM32中ARR(自动重装寄存器)为什么要减1
stm32·单片机·嵌入式硬件
鹿屿二向箔17 小时前
STM32外设之SPI的介绍
stm32
西瓜籽@17 小时前
STM32——毕设基于单片机的多功能节能窗控制系统
stm32·单片机·课程设计
远翔调光芯片^1382879887219 小时前
远翔升压恒流芯片FP7209X与FP7209M什么区别?做以下应用市场摄影补光灯、便携灯、智能家居(调光)市场、太阳能、车灯、洗墙灯、舞台灯必看!
科技·单片机·智能家居·能源