前言:利用定时器TIM特性“输出比较”完成一个呼吸灯的实验
目录
四、 实验: 利用通用定时器TIM11的通道1,实现PWM呼吸灯效果
一、PWM概念:
PWM(Pulse Width Modulation):脉冲宽度调制
占空比:就是输出的PWM中,高电平保持的时间 与该PWM的时钟周期的时间之比
上图的空占比200/1000
二、应用
它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用于测量,通信,功率控制与变换等许多领域。脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。常见应用有:电机控制,DAC输出等
三、输出比较功能框图
1、输出比较
就是通过定时器的计数比较控制外部引脚对外输出高低电平
比较输出有很多种模式,其中PWM模式是输出比较中使用的最多的模式。
2、PWM输出模式
3、PWM输出极性
- 高电平有效
- 低电平有效
控制CCR,超过CCR计数器清零,能改变高电平保持的时间
四、 实验: 利用通用定时器TIM11的通道1,实现PWM呼吸灯效果
1、硬件平台分析
(1)、原理图分析
led对应PF9、PF10管脚,低电平有效。
(2)、查看数据手册table7,是否支持TIM定时器
发现只有PF9可以利用通用定时器TIM14的通道1,实现PWM呼吸灯效果。
(3)、查看定时器功能,TIM14属于通用定时器
2、Cubmx配置
(1)开启Rcc时钟,串口UART1,这里不详细介绍了,打开TIM14,选择PWM Generation CH1
(2) 配置时钟
(3)查看GPIO配置,对应PF9
3、编程思路及开发
(1)设置一个比较函数,传入一个参数去修改比较寄存器CCR的值
(2)分析中文参考手册CCR1寄存器
void TIM14_Set_Compare(uint32_t compare)
{
TIM14->CCR1 = compare; //把值赋给CCR1
}
(3)主函数中:设置一个compare增长方向标志位,设置一个递增和递减得过程。
向上增长由暗到亮循环,下向增长由亮到暗循环。
HAL_TIM_PWM_Start(&htim14, TIM_CHANNEL_1); 开启PWM函数
int fputc(int ch, FILE *p)
{
while(!(USART1->SR & (1<<7)));
USART1->DR = (uint8_t)ch;
return ch;
}
void TIM14_Set_Compare(uint32_t compare)
{
TIM14->CCR1 = compare;
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
*
* @retval None
*/
int main(void)
{
/* USER CODE BEGIN 1 */
int32_t compare = 0; //Òª¸ºÖµ²»Äܶ¨ÒåΪuint
uint8_t dir = 0; //Ôö³¤·½ÏòµÄ±äÁ¿
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM14_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
printf("pwm test\r\n");
HAL_TIM_PWM_Start(&htim14, TIM_CHANNEL_1); //¿ªÆôpwmģʽ
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(!dir) //ÏòÉÏÔö³¤£¬°µµ½ÁÁ
{
compare += 100;
if(compare>=1000)
{
compare = 1000-1;
dir = 1;
}
}
else //ÏòÏÂÔö³¤£¬ÁÁµ½°µ
{
compare -= 100;
if(compare<=0)
{
compare = 0;
dir = 0;
}
}
TIM14_Set_Compare(compare);
HAL_Delay(50);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
4、 实验效果演示
STM32定时器TIM功能特性pwm呼吸灯实验演示