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桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速和方向