输出比较简介
1、(Outout Compar输出比较
2、输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
3、每个高级定时器和通用定时器都拥有4个输出比较通道
4、高级定时器的前3个通道额外拥有死区生成和互补输出的功能
通用定时器
输出比较电路
基本定时器
都可以输出4路PWM波形
我们这里使用基本定时器输出PWM波形
高级定时器比较通道
通用定时器的比较电路
输出比较的各种模式
PWM基本结构
PWM的参数设计
编写PWM.c
#include "pwm.h"
#include "stm32f10x.h"
void PWM_Init()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIO时钟 A
GPIO_InitTypeDef GPIO_InitStructure;//配置引脚结构体
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//选择我们的引脚0
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//电平反转的速度
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_InternalClockConfig(TIM2);//选择内部时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;//定义结构体 然后填写参数
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ;//选择1分频
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数器模式 这里选择为向上计数
TIM_TimeBaseInitStruct.TIM_Period = 100-1;//arr -1是因为有偏差 自动重装载值
TIM_TimeBaseInitStruct.TIM_Prescaler = 720-1;//psc 预分频系数 72M分频7200得到10K的
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;//重复计数器高级定时器才有,这里直接给0
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);//配置实基单元
TIM_OCInitTypeDef TIM_OCInitStruct;
TIM_OCStructInit(&TIM_OCInitStruct);//配置结构体方便使用 切换提高代码利用率 不想给单个结构体赋值就使用这个函数
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//设置输出比较的模式
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCNPolarity_High;//设置输出比较的极性
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//设置输出使能
TIM_OCInitStruct.TIM_Pulse = 0;//设置CCR PWM频率=PSC/PSC+1/ARR+1
TIM_OC1Init(TIM2, &TIM_OCInitStruct);//PWM占空比= CCR/ARR+1
//PWM分辨率=1/ARR+1
TIM_Cmd(TIM2, ENABLE);//启动定时器
/*
PWM频率=PSC/PSC+1/ARR+1
PWM占空比= CCR/ARR+1
PWM分辨率=1/ARR+1
arr = 100-1
PSC = 720-1
CRR = 50
现在是频率为1Khz,占空比为50%的PWM波形
*/
}
//编写函数更改CCR的值
void PWM_SetCompare1(uint16_t Compare)
{
TIM_SetCompare1(TIM2,Compare);
}
编写PWM.h
#ifndef __PWM_H
#define __PWM_H
#include "stm32f10x.h" // Device header
void PWM_Init(void);
void PWM_SetCompare1(uint16_t Compare);//设置CCR的值
#endif