[应用相关]

STM32 TIM的PMW模式

[复制链接]
327|19
手机看帖
扫描二维码
随时随地手机跟帖
结合国际经验|  楼主 | 2022-4-29 23:09 | 显示全部楼层 |阅读模式
脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。
在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位使能自动重装载的预装载寄存器(在向上计数或中心对称模式中)。
因为仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIMx_EGR寄存器中的UG位来初始化所有的寄存器。
OCx的极性可以通过软件在TIMx_CCER寄存器中的CCxP位设置,它可以设置为高电平有效活或低电平有效。TIMx_CCER寄存器中的CCxE位控制OCx输出使能。

使用特权

评论回复
结合国际经验|  楼主 | 2022-4-29 23:10 | 显示全部楼层
在PWM模式(模式1或模式2)下,TIMx_CNT和TIM1_CCRx始终在进行比较,(依据计数器的计数方向)以确定是否符合TIM1_CCRx≤TIM1_CNT或者TIM1_CNT≤TIM1_CCRx。然而为了与OCREF_CLR的功能(在下一个PWM周期之前,ETR信号上的一个外部事件能够清除OCxREF)一致,OCxREF信号只能在下述条件下产生:
●当比较的结果改变

●当输出比较模式(TIMx_CCMRx寄存器中的OCxM位)从“冻结”(无比较,OCxM=’000’)切换到某个PWM模式(OCxM=’110’或’111’)。这样在运行中可以通过软件强置PWM输出。
根据TIMx_CR1寄存器中CMS位的状态,定时器能够产生边沿对齐的PWM信号或中央对齐的PWM信号。

110:PWM模式1-在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
111:PWM模式2-在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

使用特权

评论回复
结合国际经验|  楼主 | 2022-4-29 23:13 | 显示全部楼层
PWM 边沿对齐模式
向上计数配置
当TIMx_CR1寄存器中的DIR位为低的时候执行向上计数。参看13.3.2节。
下面是一个PWM模式1的例子。当TIMx_CNT<TIMx_CCRx时PWM信号参考OCxREF为高,否则为低。如果TIMx_CCRx中的比较值大于自动重装载值(TIMx_ARR),则OCxREF保持为’1’。如果比较值为0,则OCxREF保持为’0’。下图为TIMx_ARR=8时边沿对齐的PWM波形实例。

使用特权

评论回复
结合国际经验|  楼主 | 2022-4-29 23:14 | 显示全部楼层
10872626c009cacf29.png

使用特权

评论回复
结合国际经验|  楼主 | 2022-4-29 23:15 | 显示全部楼层
向下计数的配置


当TIMx_CR1寄存器的DIR位为高时执行向下计数。

在PWM模式1,当TIMx_CNT>TIMx_CCRx时参考信号OCxREF为低,否则为高。如果TIMx_CCRx中的比较值大于TIMx_ARR中的自动重装载值,则OCxREF保持为’1’。该模式下不能产生0%的PWM波形。
PWM 中央对齐模式
当TIMx_CR1寄存器中的CMS位不为’00’时为中央对齐模式(所有其他的配置对OCxREF/OCx信号都有相同的作用)。根据不同的CMS位的设置,比较标志可以在计数器向上计数时被置1、在计数器向下计数时被置1、或在计数器向上和向下计数时被置1。TIMx_CR1寄存器中的计数方向位(DIR)由硬件更新,不要用软件修改它。下图给出了一些中央对齐的PWM波形的例子
●TIMx_ARR=8
●PWM模式1
●TIMx_CR1寄存器中的CMS=01,在中央对齐模式1时,当计数器向下计数时设置比较标志。

使用特权

评论回复
结合国际经验|  楼主 | 2022-4-29 23:15 | 显示全部楼层
通用定时器(TIMx)
65782626c010dd01da.png
使用中央对齐模式的提示:
●进入中央对齐模式时,使用当前的上/下计数配置;这就意味着计数器向上还是向下计数取决于TIMx_CR1寄存器中DIR位的当前值。此外,软件不能同时修改DIR和CMS位。
●不推荐当运行在中央对齐模式时改写计数器,因为会产生不可预知的结果。特别地:
─如果写入计数器的值大于自动重加载的值(TIMx_CNT>TIMx_ARR),则方向不会被更新。例如,如果计数器正在向上计数,它就会继续向上计数。
─如果将0或者TIMx_ARR的值写入计数器,方向被更新,但不产生更新事件UEV。
●使用中央对齐模式最保险的方法,就是在启动计数器之前产生一个软件更新(设置TIMx_EGR 位中的UG位),不要在计数进行过程中修改计数器的值。

使用特权

评论回复
结合国际经验|  楼主 | 2022-4-29 23:16 | 显示全部楼层
本例展示了如何设置TIM工作在脉冲宽度调制模式(PWM Pulse Width Modulation
mode)。

TIM3时钟设置为36MHz,预分频设置为0,TIM2计数器时钟可表达为:
TIM3 counter clock = TIMxCLK / (Prescaler +1) = 36 MHz

设置TIM3_CCR1寄存器值为500,则TIM3通道1产生一个频率为36MHz,占空比(duty cycle)为50%的PWM信号。

同理,根据寄存器TIM3_CCR2 、TIM3_CCR3和 TIM3_CCR4的值,TIM3通道2产生一个频率为36MHz,占空比(duty cycle)为37.5%的PWM信号;TIM3通道1产生一个频率为36MHz,占空比(duty cycle)为25%的PWM信号;TIM3通道1产生一个频率为36MHz,占空比(duty cycle)为12.5%的PWM信号。

使用特权

评论回复
结合国际经验|  楼主 | 2022-4-29 23:17 | 显示全部楼层
可以通过示波器,在相应管脚观察到输出信号。



u16 CCR1_Val = 500;
u16 CCR2_Val = 375;
u16 CCR3_Val = 250;
u16 CCR4_Val = 125;





  TIM_TimeBaseStructure.TIM_Period = 999;         
  TIM_TimeBaseStructure.TIM_Prescaler = 0;      
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);


  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;         
  TIM_OCInitStructure.TIM_Channel = TIM_Channel_1;         
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
   
  TIM_OCInit(TIM3, &TIM_OCInitStructure);

使用特权

评论回复
结合国际经验|  楼主 | 2022-4-29 23:17 | 显示全部楼层
启用CCR1寄存器的影子寄存器(直到产生更新事件才更改设置)

  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);


  TIM_OCInitStructure.TIM_Channel = TIM_Channel_2;         
  TIM_OCInitStructure.TIM_Pulse = CCR2_Val;

  TIM_OCInit(TIM3, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);


  TIM_OCInitStructure.TIM_Channel = TIM_Channel_3;         
  TIM_OCInitStructure.TIM_Pulse = CCR3_Val;

  TIM_OCInit(TIM3, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);


  TIM_OCInitStructure.TIM_Channel = TIM_Channel_4;         
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val;

  TIM_OCInit(TIM3, &TIM_OCInitStructure);

  TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);

  TIM_ARRPreloadConfig(TIM3, ENABLE);


  TIM_Cmd(TIM3, ENABLE);

  while (1)
  {
  }
}

使用特权

评论回复
Uriah| | 2022-10-6 08:30 | 显示全部楼层

51 单片机不使用线性编址

使用特权

评论回复
Bblythe| | 2022-10-6 11:29 | 显示全部楼层

通过对判断条件取反,代码在逻辑表达上会更加清晰

使用特权

评论回复
Pulitzer| | 2022-10-6 14:28 | 显示全部楼层

写程序不难,但是程序怎么样才能写的好,写的快,那是需要点经验积累的

使用特权

评论回复
万图| | 2023-5-1 07:27 | 显示全部楼层

流编辑器,是一个使用简单紧凑的编程语言来解析和转换文本超强实用程序。

使用特权

评论回复
Uriah| | 2023-5-1 08:30 | 显示全部楼层

ART2固定使用PCLK时钟,只有开启和关闭的问题,不存在其它时钟源选择

使用特权

评论回复
帛灿灿| | 2023-5-1 10:26 | 显示全部楼层

每次代码提交的时候都会生成一条提交记录

使用特权

评论回复
Bblythe| | 2023-5-1 11:29 | 显示全部楼层

清除与电镀动作都会在化学过程中完成

使用特权

评论回复
周半梅| | 2023-5-1 13:25 | 显示全部楼层

如果已经找到正确的值,继续测试一个值根本没有意义。

使用特权

评论回复
Pulitzer| | 2023-5-1 14:28 | 显示全部楼层

切割完了第四个字符之后,再依次扫描剩下的空间,直到所扫描的这一竖上的所有点的灰度值不全为0时,认为是字符的开始并依次扫描直到所扫描的这一竖上的所有点的灰度值全为0时认为是字符的结束。

使用特权

评论回复
周半梅| | 2023-5-1 15:31 | 显示全部楼层

不同的代码逻辑就代表了不同的策略

使用特权

评论回复
童雨竹| | 2023-5-1 16:24 | 显示全部楼层

通常用发光二极管LED代替小灯

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

569

帖子

1

粉丝