初学stm32 --- PWM输出

金歌  论坛元老 | 2024-12-21 13:50:57 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1059|帖子 1059|积分 3177

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x


目录
STM32 PWM工作过程​编辑
 STM32 PWM工作过程(通道1为例)
PWM模式1 & PWM模式2
 向上计数配置阐明​编辑
STM32 定时器3输出通道引脚
主动重载的预装载寄存器
​编辑
PWM输出相关库函数
输出比较初始化函数:
设置比较值函数:
使能输出比较预装载:
使能主动重装载的预装载寄存器答应位:


STM32 PWM工作过程


 

 STM32 PWM工作过程(通道1为例)



  • CCR1:捕捉比较(值)寄存器(x=1,2,3,4):设置比较值。
  • CCMR1: OC1M[2:0]位:
                对于PWM方式下,用于设置PWM模式1【110】或者PWM模式2【111】



  • CCER:CC1P位:输入/捕捉1输出极性。0:高电平有效,1:低电平有效。
  • CCER:CC1E位:输入/捕捉1输出使能。0:关闭,1:打开。
PWM模式1 & PWM模式2

寄存器TIMx_CCMR1的OC1M[2:0]位来分析:


 向上计数配置阐明


        这里的OCXREF是比较的结果,在PWM模式一下,向上计数,当计数值CNT<比较值CCR时,输出有效值。
        这里的CCxIF是终端触发标志位。


STM32 定时器3输出通道引脚


主动重载的预装载寄存器



  1. void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
复制代码
         简朴的说:
        ARPE=1,ARR立刻生效。原来原来是向上计数到36,然后溢出,再回到0。
假如计数中间修改了ARR的值,好比修改到了F5,那么再计数到F5时会立刻溢出。
        APRE=0,ARR下个比较周期生效。原来原来是向上计数到36,然后溢出,再回到0。
假如计数中间修改了ARR的值,好比修改到了FF,那么再计数到FF时不会溢出,他要到下个比较的周期,再到FF才会溢出。
PWM输出相关库函数

输出比较初始化函数:

  1. void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
复制代码
  1. typedef struct
  2. {
  3.   uint16_t TIM_OCMode;  //PWM模式1或者模式2
  4.   uint16_t TIM_OutputState; //输出使能 OR失能
  5.   uint16_t TIM_OutputNState;
  6.   uint16_t TIM_Pulse; //比较值,写CCRx
  7.   uint16_t TIM_OCPolarity; //比较输出极性
  8.   uint16_t TIM_OCNPolarity;
  9.   uint16_t TIM_OCIdleState;  
  10.   uint16_t TIM_OCNIdleState;
  11. } TIM_OCInitTypeDef;
复制代码
实例:
  1. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2
  2. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  3. TIM_OCInitStructure. TIM_Pulse=100;
  4. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  5. TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2
复制代码
设置比较值函数:

  1. void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Compare2);
复制代码
使能输出比较预装载:

  1. void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
复制代码
使能主动重装载的预装载寄存器答应位:

  
  1. void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
复制代码
总结 ---PWM输出配置步骤:
  
① 使能定时器3和相关IO口时钟。

  
        使能定时器3时钟:RCC_APB1PeriphClockCmd();

  
        使能GPIOB时钟:RCC_APB2PeriphClockCmd();

  
② 初始化IO口为复用功能输出。函数:GPIO_Init();

  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      

  
③ 这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,

  
        所以必要开启AFIO时钟。同时设置重映射。

  
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

  
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

  
④ 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();

  
⑤ 初始化输出比较参数:TIM_OC2Init();

  
⑥ 使能预装载寄存器: TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

  
⑦   使能定时器。TIM_Cmd();

  ⑧   不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金歌

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表