定时器的PWM配置流程
1、开启定时器时钟
2、开启定时器输出PWM波的GPIO的时钟
3、初始化定时器输出PWM波的GPIO(利用结构体配置)
4、初始定时器时基单元(利用结构体配置)
5、初始化定时器输出比较单元(利用结构体配置)
注:输出比较单元是输出PWM波的主体,利用比较大小的方式输出高低电平
6、开启定时器
现象:
定时器2的第一个通道(GPIOA_Pin_0)连接LED的正极,此引脚输出频率1000Hz的PWm波,PWM的占空比先一次增加,在依次减小。
OLED用不着,不用管。懒的拆下来。
源码:
主程序
#include "stm32f10x.h"
#include "Delay.h" // Device header
#include "PWM.h"
int main()
{
uint16_t i;
PWM_Init();
while(1)
{
for(i=0;i<=100;i++)
{
PWM_CCR(i);
Delay_ms(5);
}
for(i=0;i<=100;i++)
{
PWM_CCR(100-i);
Delay_ms(5);
}
}
}
PWM.c
#include "stm32f10x.h" // Device header
#include "PWM.h" // Device header
void PWM_Init()
{
TIM_TimeBaseInitTypeDef TIM_BaseInitStruct;//定时器初始化结构体
GPIO_InitTypeDef GPIO_InitStruct; //GPIO初始化结构体
TIM_OCInitTypeDef TIM_OCInitStruct; //定时器输出比较初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出,让GPIO的控制权交给外设(定时器)
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
TIM_BaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1; //定时器分频
TIM_BaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_BaseInitStruct.TIM_Period=100; //周期(ARR)
TIM_BaseInitStruct.TIM_Prescaler=720-1; //定时器预分频(PSC) 时基(定时)频率:72M/720=100K
TIM_BaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM2,&TIM_BaseInitStruct);
TIM_OCStructInit(&TIM_OCInitStruct);//初始化通道1的结构体的值
TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;//选择比较输出模式
TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;//REF高电平有效
TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;//使能
TIM_OCInitStruct.TIM_Pulse=0; //高电平时间(CCR) 占空比:CCR/ARR,后面有函数封装来控制CRR的值
TIM_OC1Init(TIM2,&TIM_OCInitStruct);
TIM_Cmd(TIM2,ENABLE);
}
void PWM_CCR(uint16_t Compare)
{
TIM_SetCompare1(TIM2,Compare);
}
PWM.h
#ifndef __PWM_
#define __PWM_
void PWM_CCR(uint16_t Compare);
void PWM_Init();
#endif