您的位置:首页 > 游戏 > 手游 > 西安嵌入式培训_亿动广告公司_百度软件_珠海网络推广公司

西安嵌入式培训_亿动广告公司_百度软件_珠海网络推广公司

2025/5/3 9:30:24 来源:https://blog.csdn.net/2401_88885971/article/details/146484849  浏览:    关键词:西安嵌入式培训_亿动广告公司_百度软件_珠海网络推广公司
西安嵌入式培训_亿动广告公司_百度软件_珠海网络推广公司

一、输出比较简介

<.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 等)的值。}	

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com