OpenEdv-开源电子网

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

原子大哥,请教stm32用一个通用定时器捕获四路PWM的方法

[复制链接]

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-7-23
在线时间
0 小时
发表于 2013-7-23 11:54:00 | 显示全部楼层 |阅读模式
四路PWM,上升沿同步,周期相同,不同的是脉宽,请问怎么设置寄存器可以使第一个通道捕获到上升沿后同时使四个通道计数器都清零且下降沿有效?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-23 12:27:04 | 显示全部楼层
一个定时器,总共才一个计数器啊.
你清零了,就是0了.
下降沿有效是你设置定时器输入捕获通道的时候就设置好了.不过过程中可以通过修改寄存器修改捕获沿.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-7-23
在线时间
0 小时
 楼主| 发表于 2013-7-23 19:18:41 | 显示全部楼层
回复【2楼】正点原子:
我的程序如下,为什么中断都没有进入呢?是少了什么设置还是哪些设置错了?
---------------------------------
//?¨?±?÷2?¨??123????????????
TIM_ICInitTypeDef  TIM2_ICInitStructure; 
void TIM2_Cap_Init(u16 arr,u16 psc) 
{     
GPIO_InitTypeDef GPIO_InitStructure; 
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; 
NVIC_InitTypeDef NVIC_InitStructure; 
 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  //????TIM2?±??
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //????GPIOA?±?? 
   
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1;  //PA2????     
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA2 ????   
GPIO_Init(GPIOA, &GPIO_InitStructure);//??????GPIOA.2
GPIO_ResetBits(GPIOA,GPIO_Pin_0);  //PA0 ????
       
TIM_TimeBaseStructure.TIM_Period = arr; //?è?¨?????÷×?????×°??
TIM_TimeBaseStructure.TIM_Prescaler =psc;    //?¤·?????     
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim 
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM?ò??????????
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //??????TIM2
    
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1|TIM_Channel_2|TIM_Channel_3; // ??????????  IC3??????TI2??
TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  //??????????
TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //??????TI2??
TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;    //????????·???????·???   
TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000  ?????¨
TIM_ICInit(TIM2, &TIM2_ICInitStructure);//??????TIM2?????????¨??3
 
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2????
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //??????????2 
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //????????0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ?¨??????
NVIC_Init(&NVIC_InitStructure);  //??????NVIC   

  /* Select the slave Mode: Reset Mode */
  TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);          //????????
        
  /* Enable the Master/Slave Mode */
  TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);        //?÷??????????

TIM_ITConfig( TIM2,TIM_IT_Update|TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_Trigger,ENABLE);//???í?ü??????????????
 
   
TIM_Cmd(TIM2,ENABLE );    //?????¨?±?÷2 

 
u16 maikuan1,maikuan2,maikuan3;

//?¨?±?÷2????·??????ò    
void TIM2_IRQHandler(void) 
{   
  if((TIM_GetITStatus(TIM2,TIM_IT_Trigger) == SET))//????????
{      
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling);  //?è??????????????
TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Falling);  //?è??????????????
TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Falling);  //?è??????????????

}  
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//????3·??ú????????
{   
maikuan1=TIM_GetCapture1(TIM2);
maikuan2=TIM_GetCapture2(TIM2);
maikuan3=TIM_GetCapture3(TIM2);
TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising);  //
TIM_OC2PolarityConfig(TIM2,TIM_ICPolarity_Rising);  //
TIM_OC3PolarityConfig(TIM2,TIM_ICPolarity_Rising);  //?è??????????????



   TIM_ClearITPendingBit(TIM2, TIM_Channel_1|TIM_Channel_2|TIM_IT_CC3|TIM_IT_Update|TIM_IT_Trigger);
 //????????±ê????


回复【2楼】正点原子:

一个定时器,总共才一个计数器啊.
你清零了,就是0了.
下降沿有效是你设置定时器输入捕获通道的时候就设置好了.不过过程中可以通过修改寄存器修改捕获沿.

---------------------------------
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-7-23 19:33:29 | 显示全部楼层
回复【3楼】tiantian马:
---------------------------------
你这代码看起来很是痛苦啊 .
你参考下我们的库函数版本例程,输入捕获实验,有用到中断.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-7-23
在线时间
0 小时
 楼主| 发表于 2013-7-23 20:03:32 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
呵呵,不好意思,后面的注释贴出来变成乱码了。我找出了一点错误,改改看看。
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-7-23
在线时间
0 小时
 楼主| 发表于 2013-7-23 20:49:49 | 显示全部楼层



以上程序运行起来结果如下:




只在while循环里走,SR寄存器一直显示为4F.这是什么情况啊????求教原子大哥
我要采集的PWM周期70Hz,脉宽在1-2ms之间,所以时钟2的初始化用了(27000-1,8-1),足够了,要减一吗?看到有的地方减了有的没减。。。。
回复 支持 反对

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-7-23
在线时间
0 小时
 楼主| 发表于 2013-7-23 20:52:01 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
请原子大哥再帮我看一下,代码发在5楼了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-16 17:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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