stm32-PWM输出比较配置

配置流程

1.RCC开启时钟

2.时钟源选择和配置时基单元

这一部分上一篇有写,可以参考一下上一篇的内容,此处不多赘述了。

原文链接:https://blog.csdn.net/m0_74246768/article/details/139048136

3.配置输出比较单元

根据你需要使用的GPIO口配置对应的输出比较通道,例如:使用PA0口,使用TIM_OC1Init函数。

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

TIMx:选择要配置的定时器

TIM_OCInitStruct:配置输出比较相关的参数。

void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);

作用:给输出比较结构体赋一个默认值。

配置初始化的办法

(1)先通过TIM_OCStructInit初始化输出比较所有参数,再更改想改的值。

(2)直接用TIM_OC1Init,配置结构体变量的时候引出所有结构体的值进行配置。

4.配置GPIO

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

作用:配置GPIO初始化

5.运行控制

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

作用:使能

其他重要库函数

如果在运行中想要停止输出波形强制输出高或低电平使可以使用下面的函数。

void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);

void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);

void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);

void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);

配置强制输出模式。

void TIM_CCPreloadControl(TIM_TypeDef* TIMx, FunctionalState NewState);

void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

配置CCR寄存器的预装功能(影子寄存器)。使写入的值不会立即生效,而在更新时间后生效。

void TIM_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);

void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);

void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);

void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);

配置快速使能

void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);

void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);

void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);

void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);

清楚REF信号

void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);

void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);

void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);

void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

单独设置输出比较的极性

带N的是高级定时器里互补通道的配置(OC4没有互补通道)

void TIM_CCxCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);

void TIM_CCxNCmd(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);

单独修改输出使能

void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);

单独更改输出比较模式

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);

单独更改CCR寄存器的值,用于更改占空比

void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);

仅高级定时器使用,在使用高级定时器输出PWM时需调用这个函数使能主输出,否则PWM将不能正常输出。

例题

配置频率为1KHz,占空比为50%的PWM波形。

PWM.c

复制代码
#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
//	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//	GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);
//	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_InternalClockConfig(TIM2);
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;		//ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;		//PSC
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//配置模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//有效电平为高电平
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出状态
	TIM_OCInitStructure.TIM_Pulse = 0;		//配置CCR寄存器的值
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);
	
	TIM_Cmd(TIM2, ENABLE);
}

void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2, Compare);
}

main.c

复制代码
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"

uint8_t i;

int main(void)
{
	OLED_Init();
	PWM_Init();
	
	while (1)
	{
		for (i = 0; i <= 100; i++)
		{
			PWM_SetCompare1(i);
			Delay_ms(10);
		}
		for (i = 0; i <= 100; i++)
		{
			PWM_SetCompare1(100 - i);
			Delay_ms(10);
		}
	}
}

注意:
• PWM 频率: Freq = CK_PSC / (PSC + 1) / (ARR + 1)
• PWM 占空比: Duty = CCR / (ARR + 1)
• PWM 分辨率: Reso = 1 / (ARR + 1)
配置PWM波形和调整占空比是通过调整ARR和CCR的值决定的。
有哪里不懂的可以评论区里问。

相关推荐
华清远见IT开放实验室1 天前
喜讯!华清远见参与制定的《电子产品印制电路板可制造性设计(DFM)和可靠性设计规范》正式发布
stm32·嵌入式·制造·设计规范·电子电路
Shang180989357261 天前
T40N君正/INGENIC专业嵌入式CPU计算能力,集成XBurst2双核处理器(1.2GHz)、RISC-V协处理器和神经网络加速器(2TOPS算力)
嵌入式硬件·fpga开发·智能视频应用处理器·t40n
Janspran1 天前
嵌入式硬件 - 51单片机1
单片机·嵌入式硬件·51单片机
智者知已应修善业1 天前
【51单片机6位数码管显示矩阵键值至右向左自左向右】2022-11-29
c语言·经验分享·笔记·嵌入式硬件·51单片机
大阳1231 天前
51单片机(单片机基础,LED,数码管)
开发语言·单片机·嵌入式硬件·算法·51单片机·学习经验
小莞尔1 天前
【51单片机】【protues仿真】基于51单片机呼叫系统
c语言·stm32·单片机·嵌入式硬件·矩阵·51单片机
DebugKitty1 天前
硬件开发1-51单片机1
单片机·嵌入式硬件·51单片机·嵌入式·ram·rom·按位运算
GalaxySinCos1 天前
10 51单片机之DS1302实时时钟
单片机·嵌入式硬件·51单片机
gmmi1 天前
嵌入式学习 51单片机基础
嵌入式硬件·学习·51单片机
Skylar_.1 天前
嵌入式 - 硬件:51单片机
单片机·嵌入式硬件·51单片机