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中加入中断回调函数即可,具体程序如下:
/* 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