1.定时器PWM工作![请添加图片描述](https://img-blog.csdnimg.cn/23576a0e47e84a6299f294e3d03d97a2.png)
计数器中有一个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);
}
}