打印

F103为什么在使用PWM时会用 使能预装载寄存器

[复制链接]
2865|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mdk55555|  楼主 | 2016-7-16 22:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
haokeer| | 2016-7-18 14:44 | 只看该作者
先看预加载寄存器中的值和寄存器的值是否一样,如果一样,不更新,不一样的话,需要更新。

使用特权

评论回复
板凳
xiaolong12| | 2016-7-19 15:58 | 只看该作者
自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。根据在TIMx_CR1寄存器中的自动装载预装载使能位(ARPE)的设置,预装载寄存器的内容被立即或在每次的更新事件UEV时传送到影子寄存器。当计数器达到溢出条件(向下计数时的下溢条件)并当TIMx_CR1寄存器中的UDIS位等于’0’时,产生更新事件。更新事件也可以由软件产生。

使用特权

评论回复
地板
喵喵小星人| | 2016-7-19 19:47 | 只看该作者
在精确波形控制的时候,才用到,一般的pwm输出,不用这个也没什么问题。

使用特权

评论回复
5
maninman1981| | 2016-7-20 22:10 | 只看该作者
预装载寄存器的概念应该是相对于影子寄存器来说的。影子寄存器是即时其作用的,而预装载寄存器的值只有传递到影子寄存器才能起作用,你可以把它理解为一个缓存。就程序员的角度观察,两者共用一个地址,无法直接区别访问,只能通过另外的办法来设置对该地址操作的具体行为。

使用特权

评论回复
6
rmbass| | 2016-7-21 09:24 | 只看该作者
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload) 这个可自动重装载 改变脉冲频率

使用特权

评论回复
7
yysforever| | 2016-7-22 10:59 | 只看该作者
设计preload register和shadow register的好处是,所有真正需要起作用的寄存器(shadow register)可以在同一个时间(发生更新事件时)被更新为所对应的preload register的内容,这样可以保证多个通道的操作能够准确地同步。如果没有shadow register,或者preload register和shadow register是直通的,即软件更新preload register时,同时更新了shadow register,因为软件不可能在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上其它因素(例如中断),多个通道的时序关系有可能是不可预知的。

使用特权

评论回复
8
冰是睡着的冰| | 2016-7-22 21:49 | 只看该作者
时基单元中的TIMx_PSC、 TIM_ARR两个寄存器加上捕捉比较模块中TIMX_CCR寄存器,它们都可以动态修改。不过他们的修改和生效可能不在同一个时刻,这里便引入了预装寄存器及影子寄存器的概念。要记住一点,真正在TIMER模块中起作用的是影子寄存器。

使用特权

评论回复
9
yesherecn| | 2016-7-23 11:54 | 只看该作者
动态修改定时器中的值的,这样的话,就可以输出频率可变的波形了。

使用特权

评论回复
10
playergatsby| | 2016-7-23 22:48 | 只看该作者
影子寄存器保存的是定时器当前的计数值(或者溢出值),这个值是立即生效的值
这个计数值是从预装载寄存器(ARR)传过来的,但ARR什么时候把计数值传给影子寄存器呢?
这儿就有个预装载使能位(ARPE):当ARPE=0的时候,你写入ARR的值马上就传到影子寄存器,也就立即生效
当ARPE=1的时候,ARR的值就是直接传过去了,而是等到定时器更新事件发生,才把这个值传到影子寄存器,也就起到一个缓冲作用

使用特权

评论回复
11
jouney316| | 2016-7-24 10:42 | 只看该作者
给你看一段代码,你就清楚了
/************************************
    标题:输出4路PWM
    软件平台:IAR for ARM6.21
    硬件平台:stm32f4-discovery
    主频:168M

    author:小船
    data:2012-02-08
*************************************/

#include <stm32f4xx.h>

void main ()
{   

  SCB->AIRCR = 0x05FA0000 | 0x400;  //中断优先级分组 抢占:响应=3:1

  RCC->AHB1ENR |= (1<<2); //打开GPIOC时钟
  GPIOC->MODER |= 0X000AA000;//pc6789第二功能
        //推挽输出
  GPIOC->OSPEEDR |= 0x000ff000;//速度100m
  GPIOC->PUPDR |= 0x00055000;//上拉  

  GPIOC->AFR[0] |= 0x22000000;//pc6789第二功能AF2
  GPIOC->AFR[1] |= 0x00000022;

  RCC->APB1ENR |= (1<<1); //打开TIM3时钟
  TIM3->PSC = 83; //对时钟84M进行84分频,使得计数频率为1M
  TIM3->ARR = 10000;  //周期10ms
  TIM3->EGR |= 1; //产生一次更新事件

  TIM3->CCMR1 |= 0x6060;//PWM模式1
  TIM3->CCMR2 |= 0x6060;//PWM模式1

  TIM3->CCR1 = 8000;//设置第一通道占空比80%
  TIM3->CCR2 = 6000;//设置第二通道占空比60%
  TIM3->CCR3 = 4000; //设置第三通道占空比40%
  TIM3->CCR4 = 2000; //设置第四通道占空比20%

  TIM3->CCER |= 0x1111;//使能比较输出

  TIM3->CCMR1 |= 0x0808;//启动预装载
  TIM3->CCMR2 |= 0x0808;

  TIM3->CR1 |= 1; //开始计时

  while(1)
  {
  };
}

使用特权

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

本版积分规则

13

主题

151

帖子

1

粉丝