一、输出比较简介
<.OC(Output Compare)输出比较
<.输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形
<.每个高级定时器和通用定时器都拥有4个输出比较通道
<.高级定时器的前3个通道额外拥有死区生成和互补输出的功能
二、PWM
1.简介
【1】PWM(Pulse Width Modulation)脉冲宽度调制
【2】在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域
【3】PWM参数: 频率 = 1 / TS 占空比 = TON / TS 分辨率 = 占空比变化步距
2.基本结构
三、输出比较通道
四、输出比较模式
五、舵机和直流电机
【1】舵机电路
【2】直流电机电路
直流电机是一种将电能转换为机械能的装置,有两个电极,当电极正接时,电机正转,当电极反接时,电机反转 直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作 TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速和方向
红色为驱动电路(TB6612),它是由两路推挽电路组成的。
分析:上管导通,下管断开。则左边输出就是接在VM的电机电源正极。
上管断开,下管导通。则左边就是接在PGND的电源负极。
右边也是同理。
左上导通和右下导通,则电流从左流到右。
左下导通和右上导通,则电流从右流到左。 所以它可以控制电机的正反转。
注:灰色部分分别控制两个电机,分别是A路和B路。
六、代码
//*********用来配置输出比较模块************//
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);void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);
//给输出比较结构体赋一个默认值//**********更改占空比**************//
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);void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);
//仅在高级定时器使用,在使用高级定时器输出PWM时,需要调用这个函数使能主输出,否则PWM将不能正常输出下面不太重要!!!!!!!!!!//**********配置强制输出模式的**********//
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);//**********配置CCR寄存器的预装功能的(影子寄存器)**********//
//影子寄存器:写入的值不会立即生效,而是在更新事件才会生效//
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);//*********配置快速使能**********//
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);
整体代码:
#include "stm32f10x.h" // Device headervoid PWM_Init(void)
{RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM2 ,ENABLE );RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode= GPIO_Mode_AF_PP ; //选择复用推挽输出 GPIO_InitStruct.GPIO_Pin= GPIO_Pin_0; GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStruct);TIM_InternalClockConfig (TIM2);//选择内部时钟(上次代码里的,可选择内部时钟RCC,ETR,TIX,ITRX)TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1;//不分频TIM_TimeBaseInitStruct.TIM_CounterMode= TIM_CounterMode_Up;//向上计数模式TIM_TimeBaseInitStruct.TIM_Period= 100 - 1; //ARR自动重装器的值TIM_TimeBaseInitStruct.TIM_Prescaler=720 - 1; //PSC预分频器的值TIM_TimeBaseInitStruct.TIM_RepetitionCounter= 0; //重复计数器的值TIM_TimeBaseInit (TIM2 ,&TIM_TimeBaseInitStruct );TIM_OCInitTypeDef TIM_OCInitStruct; //定义定时器输出比较通道的初始化参数TIM_OCStructInit(&TIM_OCInitStruct); //给结构体赋一个初始值,否则改用其它定时器。//结构体里面有些值没有赋值,会出问题TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; //输出比较模式TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; //输出比较极性TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;//使能 TIM_OCInitStruct.TIM_Pulse = 0; //CCR的值TIM_OC1Init(TIM2,&TIM_OCInitStruct);TIM_Cmd(TIM2,ENABLE);
}void PWM_SetCompare1(uint16_t Compare)
{TIM_SetCompare1(TIM2,Compare);//设置定时器通道1的比较寄存器 TIMx_CCR1(x 代表具体的定时器编号,如 TIM1、TIM2 等)的值。}