输出比较功能是驱动电机的必要条件,输出比较共有三个实验,3 4 5 三个主题讲解,如何感兴趣的同学对电机感兴趣,可以认真学一下TIM的输出比较功能(其实输出比较就是输出一个PWM波形的)
简单介绍一下PWM----Whappy
PWM原理 PWM频率与占空比详解-CSDN博客
伺服电机基本概念解析:伺服系统组成及其控制原理_伺服系统设计原理-CSDN博客
- 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);
}