当前位置:   article > 正文

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函数
  1. #include "stm32f10x.h" // Device header
  2. void PWM_Init(void)
  3. {
  4. //1开启时钟TIM2的时钟线是APB1
  5. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
  6. //2.开启GPIOA时钟
  7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  8. //开启AFIO时钟,将GPIO引脚从PA0移到PA15
  9. //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开AFIO时钟
  10. //GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2,ENABLE);//再用AFIO重映射外设复用的引脚
  11. //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//刚好是JTAG调试端口,解除JTAG调试端口,保留swlink
  12. //3.结构体初始化
  13. GPIO_InitTypeDef GPIO_Inistructure;
  14. GPIO_Inistructure.GPIO_Mode= GPIO_Mode_AF_PP;//复用推挽输出,用计时器(片上外设控制GPIO引脚,选择复用推挽输出)
  15. GPIO_Inistructure.GPIO_Pin=GPIO_Pin_0;
  16. GPIO_Inistructure.GPIO_Speed= GPIO_Speed_50MHz;
  17. GPIO_Init(GPIOA,&GPIO_Inistructure);//读取结构体的参数
  18. //4.配置时钟源,选择TIM2为内部时钟
  19. TIM_InternalClockConfig(TIM2);
  20. //5.时基单元初始化
  21. TIM_TimeBaseInitTypeDef TIM_timBaseInitStructure;
  22. TIM_timBaseInitStructure.TIM_ClockDivision= TIM_CKD_DIV1;//一分频
  23. TIM_timBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
  24. TIM_timBaseInitStructure.TIM_Period=100-1;//ARR
  25. TIM_timBaseInitStructure.TIM_Prescaler=720-1;//PSC
  26. TIM_timBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器是高级定时器才有的
  27. TIM_TimeBaseInit(TIM2,&TIM_timBaseInitStructure);
  28. //6.配置捕获单元在TIM2的OC1通道上输出PWM波形
  29. TIM_OCInitTypeDef TIM_OCInitStructure;
  30. TIM_OCStructInit(&TIM_OCInitStructure);//结构体赋初值
  31. TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; 输出比较模式,选择PWM模式1
  32. TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High ;//极性不反转
  33. TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable ;//状态使能
  34. TIM_OCInitStructure.TIM_Pulse=0; //初始的CCR值
  35. TIM_OC1Init(TIM2,&TIM_OCInitStructure);
  36. TIM_Cmd(TIM2,ENABLE);//开启定时器
  37. //产生1KHZ,分辨率为1%。占空比为50%的PWM
  38. }
  39. //设置CCR的值
  40. void PWM_SetCompare1(uint16_t Compare)
  41. {
  42. TIM_SetCompare1(TIM2,Compare);
  43. }
 2.5.2main,c函数
  1. #include "stm32f10x.h" // Device header
  2. #include "Delay.h"
  3. #include "OLED.h"
  4. #include "PWM.h"
  5. uint8_t i; //定义for循环的变量
  6. int main(void)
  7. {
  8. /*模块初始化*/
  9. OLED_Init(); //OLED初始化
  10. PWM_Init(); //PWM初始化
  11. while (1)
  12. {
  13. for (i = 0; i <= 100; i++)
  14. {
  15. PWM_SetCompare1(i); //依次将定时器的CCR寄存器设置为0~100,PWM占空比逐渐增大,LED逐渐变亮
  16. Delay_ms(10); //延时10ms
  17. }
  18. for (i = 0; i <= 100; i++)
  19. {
  20. PWM_SetCompare1(100 - i); //依次将定时器的CCR寄存器设置为100~0,PWM占空比逐渐减小,LED逐渐变暗
  21. Delay_ms(10); //延时10ms
  22. }
  23. }
  24. }

2.6PWM驱动舵机

2.6.1舵机介绍

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

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

2.7PWM驱动电机

2.7.1直流电机介绍

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

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号