Bootstrap

3. STM32之TIM实验--输出比较(PWM输出,电机,四轴飞行器,智能车,机器人)--(实验1:PWM驱动LED呼吸灯)

输出比较功能是驱动电机的必要条件,输出比较共有三个实验,3 4 5 三个主题讲解,如何感兴趣的同学对电机感兴趣,可以认真学一下TIM的输出比较功能(其实输出比较就是输出一个PWM波形的)
简单介绍一下PWM----Whappy
PWM原理 PWM频率与占空比详解-CSDN博客

伺服电机基本概念解析:伺服系统组成及其控制原理_伺服系统设计原理-CSDN博客

3. STM32之定时器,输出比较,pwm控制led呼吸灯。

PWM控制电机的原理

PWM电机控制原理是通过调节PWM信号的占空比来控制电机的转速和方向的一种电机控制方式.。PWM是脉冲宽度调制的缩写,通过改变脉冲的宽度和周期来调节电压的平均值,从而控制电机的输出功率。在电机控制系统中,控制器产生PWM信号,经过功率放大器放大后,驱动电机转动。通过调整PWM信号的占空比,可以实现电机转速的控制,同时也可以改变电机的转向。PWM电机控制原理广泛应用于各种类型的电机控制系统中,如直流电机控制、步进电机控制、交流电机控制等。步进电机驱动器细分原理_步进驱动器细分设置表说明_步进电机细分-CSDN博客

脉冲数=电机移动距离,

脉冲频率=电机速度




上图说明:当作为输入时,可作为输入捕获,输出时,可以作为输出比较(基本功能是输出PWM)。CCR输入捕获和输出捕获寄存器,

定时器的输出比较是怎样生成PWM波形的?



CNT>=CCR1时:--->给输出模式控制器传递一个信号,然后通过参考信号OC1ref,最后通过极性选择,选择相关的高低电平通过输出使能电路通过OC1输出相对应的PWM波形,下表为控制ref输出控制表



通过上表,我们就可以知道STM32的定时器输出pwm波形可以通过配置输出和捕获中的输出模式控制器中的相关寄存器(OC1M[2:0])来进行精确的控制。

(第一个实验)本实验着重使用PWM模式1来输出可调的PWM波形,参考下图


配置PWM波形步骤

配置时基单元-->CCR(捕获比较寄存器自己设定的)-->输出模式配置-->极性选择-->输出使能

代码:配置步骤:配置时钟-->配置时基单元-->配置输入输出捕获CCR-->配置输出模式-->极性选择--GPIO输出

注:PWM和GPIO对应关系是怎样的?

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"

int main(void)
{
	OLED_Init();
	PWM_Init();
	
	uint16_t Compare;
	while (1)
	{
		for(Compare=0; Compare<100; Compare++)
		{
			PWM_SetComparel(Compare);
			Delay_ms(10);
		}
		
		for(Compare=0; Compare<100; Compare++)
		{
			PWM_SetComparel(100-Compare);
			Delay_ms(10);
		}
	}
}
#include "stm32f10x.h"                  // Device header





/************************************************

配置步骤:配置时钟-->配置时基单元(并初始化OC)-->配置输入输出捕获CCR-->配置输出模式-->极性选择--GPIO输出

PWM频率:	Freq = CK_PSC / (PSC + 1) / (ARR + 1)
PWM占空比:	Duty = CCR / (ARR + 1)
PWM分辨率:	Reso = 1 / (ARR + 1)

实验目标:
输出一个PWM频率 = 1kHz,占空比 = 50%,分辨率 = 1%的PWM波形

************************************************/

void PWM_Init(void)
{
	
	//配置时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	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 时基单元中的自动重装值 ARR+1=100-->ARR= 100-1
	/********************************************************
    ARR时基单元中的自动重装值    公式:计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)= CK_PSC / (PSC + 1) / (ARR + 1)
	计数器计数频率:CK_CNT = CK_PSC / (PSC + 1)
	*********************************************************/
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;  //PSC 时基单元中的预分频 PSC + 1 =720-->PSC =720-1
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
	
	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);
	
	//初始化输出比较单元OC
	
	TIM_OCInitTypeDef 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_SetComparel(uint16_t Compare)
{
	TIM_SetCompare1(TIM2,Compare);
}
	
	
	
	
;