网站建设公众号管理,wordpress开发插件,莱芜做网站建设的公司,wordpress付费下载软件插一、输出比较简介 1、输出比较 OC#xff08;Output Comapre#xff09;输出比较输出比较可以通过比较CNT#xff08;时基单元#xff09;和CCR#xff08;捕获单元#xff09;寄存器值的关系#xff0c;来对输出电平进行置1、置0或翻转的操作#xff0c;用于输出一定频…一、输出比较简介 1、输出比较 OCOutput Comapre输出比较输出比较可以通过比较CNT时基单元和CCR捕获单元寄存器值的关系来对输出电平进行置1、置0或翻转的操作用于输出一定频率的占空比的PWM波形(CC是捕获/比较的意思R是Register寄存器的意思这个捕获/比较寄存器是输入捕获和输出比较共用的当使用输入捕获时他就是捕获寄存器当时用输出比较时它就是比较寄存器。 每个高级定时器和通用定时器都有4个输出比较通道 高级定时器的前3个通道额外拥有死区生成和互补输出的功能注简单来说就是在输出比较这里这块电路会比较CNT和CCR的值CNT计数自增CCR是我们给定的一个值当CNT大于CCR、小于CCR、等于CCR时输出就会输出对应的置1或置0。 对应的数字电路框图为红圈部分 2、PWM简介 PWMPluse Width Modulation脉冲宽度调制在具有惯性的系统中可以通过对一系列脉冲的宽度进行调制来等效地获得所需要的模拟量常用于电机控速等领域也就是说使用这个PWM波形是用来等效地实现一个模拟信号的输出也就是以一个很快的频率给电机通电、断电也就使电机维持在一个中等速度 PWM参数频率1/Ts 占空比Ton/Ts 分辨率占空比变化步距 3、定时器的结构
1、输出比较OC通道通用定时器模块 图解在这个图里左边就是CNT计数器时基单元模块中的和CCR1第一路的捕获/比较寄存器 他俩进行比较当CNTCCR1或者CNTCCR1时就会给输出模式控制器传一个信号然后输出模式控制器就会改变它输出OC1REF的高低电平REF时reference的缩写意思是参考信号然后上面还有个ETRF输入这是定时器的一个小功能一般不用了解接着REF信号可以前往主模式控制器你可以把这个REF映射到主模式的TRGO输出上去但主要还是下面那一路极性选择部分给这个寄存器写0信号会往上走就是信号电平不翻转进来啥样出去啥样写1的话信号就会往下走就是信号通过一个非门取反那输出信号就是输入信号高低电平反转的信号再往后就是输出使能电路就是选择要不要输出最后就是OC1引脚这个引脚就是CH1的通道的引脚。
2、输出比较通道高级定时器 右侧为外围电路则OC1和OC1N为互补输出分别控制上管和下管的导通和截止 理想情况下上管导通的瞬间下管要在同一瞬间关闭但是实际情况下可能会因为器件的不理想导致上管未完全关闭下管就导通了出现了短暂的上下管短暂导通的情况引起器件发热所以有了死区生成电路它会在上管关闭的时候延迟一小段再导通下管下管导通的时候延迟一小段在导通上管。 4、输出模式控制器模式
下图为输出模式控制器可以设置的模式就是通用定时器的输出模式控制器模块的功能 1第一个模式是冻结描述的实CNTCCR时REF保持原态比如在输出PWM波突然想暂停一会儿输出就可以设置成这个模式高低电平维持在暂停时刻 2匹配时值置有效电平匹配时值置无效电平匹配时值电平翻转就是CNTCCR时REF分别置高电平低电平电平翻转在匹配时值电平翻转模式下可以产生一个占空比为50%的方波 3强制为无效电平和强制为有效电平两个模式和冻结模式相似如果你想暂停波形输出并且在暂停期间保持低电平或者高电平那你就可以设置这两个模式4PWM2就是PWM1的取反。最常用的就是PWM1模式。 5、PWM 产生原理及输出比较的抽象出来主要模块 首先左上角这里是时基单元和运行控制的部分再左边是时钟源选择这里省略了配置好时基单元这里的CNT就可以开始不断地自增运行。
输出比较单元电路最开始是CCR捕获/比较寄存器CCR是我们自己设置的CNT不断自增运行同时他俩还在不断的比较后面就是输出模式控制器以PWM1模式为例在右上角的图中在CNT还未计数到CCR时置高电平大于CCR时置低电平当计数到ARR然后归零时又置高电平往复循环且占空比随CCR改变如果CCR设置的高那么输出的占空比就大CCR设置的低一些占空比就小一些最后经过极性选择和输出使能就可以输出了。
6、参数计算 注PWM的频率等于计数器的更新频率 二、外部设备
1、舵机 型号SG90
执行逻辑PWM信号输入到控制板给控制板一个指定的目标角度然后电位器检测输出轴的当前角度如果大于目标角度电机会反转如果小于目标角度电机会正转最终使输出轴固定在指定角度 2、直流电机 代码部分
1、PWM驱动LED呼吸灯
初始化步骤
RCC开启时钟把我们要用的TIM外设和GPIO外设的时钟打开配置时基单元包括前面的时钟源选择配置输出比较单元包括CCR的值、极性选择、输出使能配置GPIO复用推挽输出 运行控制
PWM.C
#include stm32f10x.h // Device headervoid PWM_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);
// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//对应输出比较的GPIO口配置GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; //复用推挽输出GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; //GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_Init(GPIOA, GPIO_InitStructure);TIM_InternalClockConfig(TIM2); //用内部72MHZ时钟选择时基单元的时钟选择内部时钟,可以不写因为定时器上电后默认选择内部时钟//时基单元配置TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1;TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period 100 - 1; //ARRTIM_TimeBaseInitStructure.TIM_Prescaler 720 - 1; //PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; //0不重复计数高级定时器用的TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure);//输出比较模块配置TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(TIM_OCInitStructure); //用默认值填充每个TIM_OCInitStruct成员。因为只需要配置部分结构体参数给结构体赋初始值 里面定义默认给的初始值防止高级定时器出错TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; //PWM1模式TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; //输出比较极性 high 高级性 极性不翻转 有效电平为高电平TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; //输出比较使能TIM_OCInitStructure.TIM_Pulse 0; //CCR 指定要加载到捕获比较寄存器的脉冲值TIM_OC1Init(TIM2, TIM_OCInitStructure);//PA0口对应第一个输出比较通道OC1TIM_Cmd(TIM2, ENABLE);
}void PWM_SetCompare1(uint16_t Compare)
{TIM_SetCompare1(TIM2, Compare); //设置TIM2捕获Compare1寄存器值。CCR为0通过setcompare可以设置CCR的值单独更改通道1的CCR的值
}main.c
#include stm32f10x.h // Device header
#include Delay.h
#include OLED.h
#include PWM.huint8_t i;int main(void)
{OLED_Init();PWM_Init();while (1){for (i 0; i 100; i){PWM_SetCompare1(i);Delay_ms(10);}for (i 0; i 100; i){PWM_SetCompare1(100 - i);Delay_ms(10);}}
}其它函数介绍
输出比较的函数介绍
这四个函数就是配置输出比较模块一个函数配置一个单元
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);//——————————————————————————————————————————————★★★★★★★★★★———————————————————————————————到这里输出比较的配置基本完成————————————————————————单独修改CCR寄存器值的函数————————————————————————————————————★★★★★★★★★★——————————————————更改占空比所用到的四个函数—————————————————————————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);十、重映射重映像
使用AFIO复用功能引脚重映射 重映射方式和引脚对应关系 选择重映射方式 查看参考手册 GPIO_PartialRemap1_TIM2 //部分重映射1
GPIO_PartialRemap2_TIM2//部分重映射2
GPIO_FullRemap_TIM2//完全重映射解除调试端口参数 * arg GPIO_Remap_SWJ_NoJTRST : Full SWJ Enabled (JTAG-DP SW-DP) but without JTRST//解除JTRST引脚的复用 PB4------GPIO* arg GPIO_Remap_SWJ_JTAGDisable : JTAG-DP Disabled and SW-DP Enabled//解除JTAG调试端口的复用 PA15、PB3、PB4* arg GPIO_Remap_SWJ_Disable : Full SWJ Disabled (JTAG-DP SW-DP)//把SWD和JTAG的调试端口全部解除掉把SWD和JTAG的调试端口全部解除掉5个引脚全部变成GPIO没有调试功能了之后st-link下载不进去程序了只能使用串口下载下载一个新的没有调试端口的程序这样才能把调试端口弄回来这个参数不能乱用