OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5081|回复: 5

PWM的问题

[复制链接]

30

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2013-3-7
在线时间
6 小时
发表于 2013-5-10 16:54:21 | 显示全部楼层 |阅读模式

各位大神,下面是小弟利用定时器的第二通道做的PWM代码,主要是观察LED的亮暗程度:


void Pwm_Init(void)
 {
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;   
 TIM_OCInitTypeDef TIM_OCInitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE); //使能复用时钟和PB5口
 GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //开启部分重映射功能 现在TIM3_CH2已经重映射到PB5上面

  //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
 
 TIM_TimeBaseStructure.TIM_Prescaler=0x00;       //预分频值 0+1=1
 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;   //向上计数
 TIM_TimeBaseStructure.TIM_Period=50000;        //重装值
 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1 ;    //时钟分割
 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);      //初始化
 TIM_PrescalerConfig(TIM3, 0, TIM_PSCReloadMode_Immediate);   //立即装入预分频值

 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
 TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable;
 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
 TIM_OCInitStructure. TIM_Pulse=40000;
 TIM_OC2Init(TIM3, &TIM_OCInitStructure);
 
 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable); //使能预装载功能
 TIM_ARRPreloadConfig(TIM3, ENABLE);
 
 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);     //使能TIM3的中断
 TIM_Cmd(TIM3, ENABLE);       //使能TIM3定时器

}

u16 temp=0;
void TIM3_IRQHandler()
{
 
 if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
 {
  temp=TIM_GetCapture2(TIM3);
  printf("%d, ",temp);
  printf("Hello ");
 }
 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);


}

我有一下的疑问:
1. 
    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable); //使能预装载功能
 TIM_ARRPreloadConfig(TIM3, ENABLE);
这两句是必须的吗?它们好像也只是重新装载一下之前的值而已,在值不需要改变的时候,好像并无预装载的必要。

2. 
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
这里的更新事件指的是什么?是定时器溢出中断还是达到通道2的值时的中断呢?还是预装载寄存器的时候发生的中断呢?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2013-3-7
在线时间
6 小时
 楼主| 发表于 2013-5-10 17:09:06 | 显示全部楼层
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-10 17:36:10 | 显示全部楼层
1,不是必须的,在精确控制波形的时候才有用。
2,是指更新中断。更新中断产生的情况,如下图所示:


我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

21

主题

92

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2013-3-21
在线时间
0 小时
发表于 2013-5-10 18:01:26 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
预装载是不是为了得到周期和占空比不一样的一个连续的方波??
努力努力
回复 支持 反对

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2013-4-18
在线时间
0 小时
发表于 2013-5-10 18:25:48 | 显示全部楼层
回复【4楼】happy:
---------------------------------
预装载其实就是控制占空比的。以下是我的一些笔记:首先pwm是一个时钟周期里面通过改变占空比而实现的另一个新的周期。这里面主要是2个概念TIMx_ARR和TIMx_CCR,CCR/ARR其实就得到了占空比(pwm1模式,如果是pwm2则占空比会反过来的),而整个ARR的计算方法:时钟频率,分频值,ARR这三个参数决定
回复 支持 反对

使用道具 举报

30

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
219
金钱
219
注册时间
2013-3-7
在线时间
6 小时
 楼主| 发表于 2013-5-10 21:01:10 | 显示全部楼层
回复【4楼】happy:
---------------------------------
这个很有见地,确实如果改变装载的值的话是这样的。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-20 06:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表