STM32定时器四大功能之输出比较

 2.定时器输出比较

2.1输出比较介绍

通过比较CNT和CCR寄存器的值,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波

每个高级定时器和通用定时器都拥有4个输出比较通道

高级定时器的前3个通道额外拥有死区生成和互补输出的功能

2.2PWM波(波形数字输出)

PWM简称脉冲宽度调制,在惯性系统中,对一系列脉冲宽度进行调制,将数字信号等效为所需的模拟信号,用于控制电机速率。

频率 = 1 / TS            占空比 = TON / TS           分辨率 = 占空比变化步距

2.3输出比较模式

在本次实验中,使用PWM模式1向上计数,当CNT<CCR时,REF置有效电平,CNT>=CCR时,REF置无效电平。下图中红线部分位CCR,蓝线位CNT。黄线为ARR值。

 PWM频率:    Freq = CK_PSC / (PSC + 1) / (ARR + 1)

PWM占空比:    Duty = CCR / (ARR + 1)

PWM分辨率:    Reso = 1 / (ARR + 1)

2.4PWM基本结构

 2.4.1PWM波形配置步骤

(1).开启时钟TIM2的时钟

(2).开启GPIOA时钟

(3).GPIOA结构体初始化

注意本次实验是用定时器控制GPIO引脚要选择复用开漏输出或者复用推挽输出。

普通的引脚控制权是来自于输出数据寄存器,只需要选择普通的开漏输出或者是推挽输出。

  (4).配置时钟源,选择TIM2为内部时钟

  (5).时基单元初始化

  (6).配置捕获单元在TIM2的OC1通道上输出PWM波形

 2.5PWM驱动LED呼吸灯

2.5.1PWM,c函数
#include "stm32f10x.h"                  // Device header


void  PWM_Init(void)
{
   	//1开启时钟TIM2的时钟线是APB1
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    //2.开启GPIOA时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//开启AFIO时钟,将GPIO引脚从PA0移到PA15
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开AFIO时钟
	//GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2,ENABLE);//再用AFIO重映射外设复用的引脚
	//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//刚好是JTAG调试端口,解除JTAG调试端口,保留swlink
	//3.结构体初始化
	GPIO_InitTypeDef GPIO_Inistructure;
	GPIO_Inistructure.GPIO_Mode= GPIO_Mode_AF_PP;//复用推挽输出,用计时器(片上外设控制GPIO引脚,选择复用推挽输出)
	GPIO_Inistructure.GPIO_Pin=GPIO_Pin_0;
	GPIO_Inistructure.GPIO_Speed=  GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_Inistructure);//读取结构体的参数
    //4.配置时钟源,选择TIM2为内部时钟
	TIM_InternalClockConfig(TIM2);
	//5.时基单元初始化
	 TIM_TimeBaseInitTypeDef  TIM_timBaseInitStructure;
	 TIM_timBaseInitStructure.TIM_ClockDivision= TIM_CKD_DIV1;//一分频
	 TIM_timBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
	 TIM_timBaseInitStructure.TIM_Period=100-1;//ARR
	 TIM_timBaseInitStructure.TIM_Prescaler=720-1;//PSC
	 TIM_timBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器是高级定时器才有的
	 TIM_TimeBaseInit(TIM2,&TIM_timBaseInitStructure);
	//6.配置捕获单元在TIM2的OC1通道上输出PWM波形
	 TIM_OCInitTypeDef TIM_OCInitStructure;
	 TIM_OCStructInit(&TIM_OCInitStructure);//结构体赋初值
	 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;  输出比较模式,选择PWM模式1    
     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);//开启定时器
	 //产生1KHZ,分辨率为1%。占空比为50%的PWM
}


//设置CCR的值
void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2,Compare);
}
 2.5.2main,c函数
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "PWM.h"

uint8_t i;			//定义for循环的变量

int main(void)
{
	/*模块初始化*/
	OLED_Init();		//OLED初始化
	PWM_Init();			//PWM初始化
	
	while (1)
	{
		for (i = 0; i <= 100; i++)
		{
			PWM_SetCompare1(i);			//依次将定时器的CCR寄存器设置为0~100,PWM占空比逐渐增大,LED逐渐变亮
			Delay_ms(10);				//延时10ms
		}
		for (i = 0; i <= 100; i++)
		{
			PWM_SetCompare1(100 - i);	//依次将定时器的CCR寄存器设置为100~0,PWM占空比逐渐减小,LED逐渐变暗
			Delay_ms(10);				//延时10ms
		}
	}
}

2.6PWM驱动舵机

2.6.1舵机介绍

舵机是一种根据输入PWM信号占空比来控制输出角度的装置

输入PWM信号要求:周期为20ms,高电平宽度为0.5ms~2.5ms

2.7PWM驱动电机

2.7.1直流电机介绍

直流电机是一种将电能转换为机械能的装置,有两个电极,当电极正接时,电机正转,当电极反接时,电机反转 直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作 TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速和方向

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值