13.3STM32定时器PWM输出

1.定时器PWM工作请添加图片描述

计数器中有一个CCRx值,在计数的时候比它小的时候,输出0信号,比它大的时候输出1信号
周期是用ARR决定,占控比是由CCRx决定
就是生成一个想要的周期信号

2.定时器PWM框图

请添加图片描述
1.OCM[2:0]位
请添加图片描述
2.CCEP:CC1P位
输入输出极性,0:高电平有效,1:低电平有效
2.CCEP:CC1E位
使能位,0关闭,1开启

3.定时器PWM通道

通常每一个通用定时器有4个或2个通道,而每一个通道可能可以映射到多个IO口的选择。

4.定时器PWM库函数

1.定时器PWM时基初始化函数
HAL_TIM_PWM_Init(TIM_HandleTypeDef *htim);
就是配置预分频系数,重装载值,工作模式等
2.定时器PWM回调函数
HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim);
定时器时钟使能,初始化IO口等设置
3.定时器PWM比较通道配置函数
HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH4Handler,TIM_CHANNEL_4);
第一个参数为定时器结构体
第二个参数为通道结构体


其中第一个参数为模式,控制模式,大于是有效电平,还是小于是有效电平
其中第二个参数为比较值,计数器与比较值比大小而确定电平
其中第三个参数为极性,控制有效电平是高还是低电平
后面为高级定时器用

请添加图片描述
第三个参数为通道选择
4.使能定时器与PWM输出比较通道
HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel);
HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel);
第二个就是开启了比较中断,就是刚好等于比较值有一个中断
5.定时器PWM中断处理函数
需要的话就写,和上一个实验一样的方法

5.定时器PWM配置步骤

请添加图片描述

5.定时器PWM代码

目的:使能定时器PWM功能,输出可控的PWM波,然后用于小灯由暗变亮
,又从亮变暗。

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"

TIM_HandleTypeDef htim;
TIM_OC_InitTypeDef sConfig;
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
		if(htim->Instance==TIM3)
		{
			GPIO_InitTypeDef GPIO_Initure;
			__HAL_RCC_TIM3_CLK_ENABLE();
			__HAL_RCC_GPIOB_CLK_ENABLE();
	
			__HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
	
			GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1; 
			GPIO_Initure.Mode= GPIO_MODE_AF_PP;  
			GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
			GPIO_Initure.Speed= GPIO_SPEED_FAST;
			GPIO_Initure.Alternate =  GPIO_AF2_TIM3;   
			HAL_GPIO_Init(GPIOB,&GPIO_Initure);
		}

}
void TIM1INit()
{
		htim.Instance = TIM3;
		htim.Init.CounterMode = TIM_COUNTERMODE_UP;
		htim.Init.Period = 500-1;      //PWM重装值
		htim.Init.Prescaler = 90-1;   //计数频率1M
		HAL_TIM_PWM_Init(&htim);
	
		sConfig.OCMode  =  TIM_OCMODE_PWM1;
		sConfig.Pulse = 250;
		sConfig.OCPolarity = TIM_OCPOLARITY_LOW;
		HAL_TIM_PWM_ConfigChannel(&htim,&sConfig,TIM_CHANNEL_3);
		
		HAL_TIM_PWM_Start(&htim,TIM_CHANNEL_3);
}

void TIM_SetTIM3COMPare1(u32 n)  //方法一设置比较值
{
	TIM3->CCR3 = n;
}
void TIM_SetTIM3COMPare2(TIM_HandleTypeDef *htim,u32 n) //方法二设置比较值
{
	htim->Instance->CCR3=n;
}
int main(void)
{
		u8 dir=1;
		u32 n;
    HAL_Init();                     //初始化HAL库   
    Stm32_Clock_Init(360,25,2,8);   //设置时钟,180Mhz
    delay_init(180);                //初始化延时函数
    uart_init(115200);              //初始化USART
    LED_Init();                     //初始化LED 
    KEY_Init();                     //初始化按键
		TIM1INit();
    while(1)
    {
			delay_ms(10);
			if(dir==1)
			{
				n++;
			}
			else
			{
				n--;
			}
			
			if(n>300)
			{
				dir=0;
			}
			if(n==0)
			{
				dir=1;
			}
			
			TIM_SetTIM3COMPare1(n);
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值