OpenEdv-开源电子网

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

分享定时器PWM输入捕获,计算PWM占空比,PWM频率。独立完成,已经在开发板上验证。

[复制链接]

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
发表于 2012-2-29 11:17:30 | 显示全部楼层 |阅读模式
 刚刚开始做定时器输入捕获的时候在这个论坛上找了好久,都没有人分享,也有很多人问,无奈自己动手写了。花了一天的时间,这个东西真的不好写了,对比了库的例子,仿真,等。可以说付出了很多。现在完成了和大家分享。希望大家多多支持。这个程序是在定时器输入捕获的基础上看手册完成的,

程序说明:1、程序中定时器4的PB6用于输出频率为1K,占空比为50%的PWM信号。
               2、定时器2的PA0用于输入捕获,当程序下到板子上,只有两个脚连在一起才会发生捕获。
               3、串口用于发送捕获的值到PC机上。
               4、定时器2的CCR1存PWM信号的频率,CCR2存高电平时间。

这里声明一下,如果你要捕获的PWM信号不在ARR,PSC计算的范围内,请自己先计算再使用本程序。
#include "stm32f10x_lib.h"
#include "sys.h"
#include "delay.h" //延时子函数
#include "usart.h"

u16   IC1Value;
u16   IC2Value;
u16   DutyCycle;
u16   Frequency;

void PWM_Init(u16 arr,u16 psc);
void Capture_Init(u16 arr,u16 psc);
int  main(void)
{
  Stm32_Clock_Init(9); //系统时钟设置
  delay_init(72);//延时函数初始化 
  uart_init(72,9600);
  PWM_Init(1000,72-1);  //不分频。PWM频率=72000/1440=5Khz
  Capture_Init(2000,72-1); 
  while(1)
  {
   Frequency = 1000000/IC1Value;
  DutyCycle = (IC2Value*100)/IC1Value;//占空比=(IC2Value/IC1Value)*100;
  printf("Frequency = %d\r\n",Frequency);
  printf("DutyCycle = %d\r\n",DutyCycle); 
  printf("suqingxiao\r\n"); 
  }
}

//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void PWM_Init(u16 arr,u16 psc)
{        
 //此部分需手动修改 IO口设置 
 RCC->APB2ENR|=1<<0;    // 
 RCC->APB1ENR|=1<<2;       //TIM4 时钟使能
 RCC->APB2ENR|=1<<3;    //使能PORTB时钟
  
 GPIOB->CRL&=0XF0FFFFFF;//PB6 输出 
 GPIOB->CRL|=0X0B000000;//复用功能输出      
 GPIOB->ODR|=1<<6;//PB6 上拉  
 
 TIM4->ARR=arr;//设定计数器自动重装值  
 TIM4->SC=psc;//预分频器不分频 

 TIM4->CCMR1|=7<<4;  //CH1 PWM2模式     
 TIM4->CCMR1|=1<<3; //CH1 预装载使能      
 TIM4->CCER|=1<<0;  //OC1  输出使能     
 TIM4->CR1=0x0080;  //ARPE使能  

 TIM4->CR1|=0x01;    //使能定时器 3 

 TIM4->CCR1   = 500;  //占空比初值 =  1440*50% = 720                                      
}


void Capture_Init(u16 arr,u16 psc)
{
 //此部分需手动修改 IO口设置 
 RCC->APB2ENR|=1<<0;    // 
 RCC->APB1ENR|=1<<0;       //TIM2 时钟使能
 RCC->APB2ENR|=1<<2;    //使能PORTA时钟
   
  TIM2->ARR=arr;  //设定计数器自动重装值//刚好1ms   
 TIM2->SC=psc;  //预分频器,

 GPIOA->CRL&=0XFFFFFFF0;//PA0 输出 
 GPIOA->CRL|=0X00000004;//复用功能输出      
 GPIOA->ODR|=1<<0;//PA0 上拉
  
 TIM2->SMCR|=0x00D4;
 //TIM2->SMCR|= 1<<5; //MSM=1 主/从模式
 //TIM2->SMCR|= 5<<4; //TS=101 触发选择
 //TIM2->SMCR|= 4<<0; //SMS=100 复位模式

 TIM2->CCMR1|=1<<0;//CC1S=01 选择输入端 
 TIM2->CCMR1|=3<<4; //IC1F=0011配置输入滤波器
 TIM2->CCER|=0<<1; //CC1P=0 选择有效转换边沿  上升沿有效
 TIM2->CCMR1|=0<<2; //IC1PS=00 配置输入分频
 TIM2->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中


 TIM2->CCMR1|=2<<8;//CC2S=10 选择输入端
 TIM2->CCER|=1<<5; //CC2P=1 选择有交转换边沿 下降沿有效
 TIM2->CCER|=1<<4; //CC2E=1 允许捕获计数器的值到捕获寄存器中

 TIM2->DIER|=1<<1;   //允许更新捕获中断    
    
 TIM2->CR1|=0x01;    //使能定时器2
   MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2         
}

//定时器2中断服务程序 
void TIM2_IRQHandler(void)
{                 
 IC1Value = TIM2->CCR1;//读取CCR1也可以清CC1IF标志位
 IC2Value = TIM2->CCR2;//读取CCR1也可以清CC2IF标志位                   
 TIM2->SR&=~(1<<1);//清除中断标志位     
}

 




 



PWM输入捕获.txt

2.8 KB, 下载次数: 1799

?成功只是最后一小步的坚持!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-2-29 11:25:32 | 显示全部楼层
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2012-3-2 10:08:36 | 显示全部楼层
回复【楼主位】suqingxiao:
---------------------------------
谢谢楼主的分享。
1、我用楼主的代码在原子的板子上做实验,串口调试助手接收的数据很不稳定,而且也不准确。
2、PWM_Init(1000,72-1);  //不分频。PWM频率=72000/1440=5Khz 
    Capture_Init(2000,72-1); 
 还有上面Capture_Init(2000,72-1); 里面的参数与PWM_Init(1000,72-1);  里面的参数有什么具体关系呢? 谢谢!

串口调试助手显示的部分数据:
Frequency = 45575
DutyCycle = 15200
suqingxiao
Frequency = 671
DutyCycle = 87
suqingxiao
Frequency = 515
DutyCycle = 92
suqingxiao
Frequency = 511
DutyCycle = 92
suqingxiao
Frequency = 47619
DutyCycle = 8757
suqingxiao
Frequency = 534
DutyCycle = 87
suqingxiao
Frequency = 501
DutyCycle = 87
suqingxiao
Frequency = 504
DutyCycle = 89
suqingxiao
Frequency = 45575
DutyCycle = 19277
suqingxiao
Frequency = 45575
DutyCycle = 18355
suqingxiao
Frequency = 45575
DutyCycle = 17744
suqingxiao
Frequency = 45575
DutyCycle = 16700
suqingxiao
Frequency = 45575
DutyCycle = 16700
suqingxiao
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
 楼主| 发表于 2012-3-2 10:31:36 | 显示全部楼层
不稳定不确定说明你重载太少了,已经溢出了。你可以改大一点Capture_Init(65536,72-1); 这样可以测几十HZ.
?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
 楼主| 发表于 2012-3-2 10:35:35 | 显示全部楼层

这个程序我已经测试过了,应该不会溢出的,我现在再拷过去测试,也没有见溢出啊,我不知道你那边是不是时间不对。

下面是我后来再拷到工程中测试的数据。你测试如果不行再把重载改大点吧。
suqingxiao
Frequency = 1000
DutyCycle = 50
suqingxiao
Frequency = 1000
DutyCycle = 50
suqingxiao
Frequency = 1000
DutyCycle = 50

?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
 楼主| 发表于 2012-3-2 10:45:16 | 显示全部楼层

还有上面Capture_Init(2000,72-1); 里面的参数与PWM_Init(1000,72-1);  里面的参数有什么具体关系呢? 谢谢!
 
关系是:Capture_Init(2000,72-1)中的2000是用于计数的,就是触发后到下一次触发的计数,如果捕获的PWM信号周期太长20000不够会有溢出的。PWM_Init(1000,72-1);  中的1000是重载,当设置72-1时,分频为1M,重载1000,就是1M/1000=1K。

如果Capture_Init(2000,72-1)设置72-1,说明分频为1M,1M的频率在计数1K的信号那计数器要计数1000次,这个1000次要在Capture_Init(2000,72-1)中的2000内,

如果1000次大于Capture_Init(2000,72-1)中的2000,那就会溢出了。

所以,如果PWM_Init(1000,72-1);  中的1000这个数很大,那Capture_Init(2000,72-1)中的2000要比它大就得了。这样就不会溢出了。

?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2012-3-2 11:32:17 | 显示全部楼层
回复【6楼】suqingxiao:
---------------------------------
谢谢suqingxiao的回复,我再做做实验。
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2012-3-2 12:47:41 | 显示全部楼层
回复【6楼】suqingxiao:
---------------------------------
suqingxiao,我换了一块别家的板子运行你的程序,结果是正确的。
难道我的原子板子坏了,可是我下了个跑马灯的程序可以正常运行。很诡异。
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2012-3-2 13:04:21 | 显示全部楼层
回复【8楼】科科1987:
回复【6楼】suqingxiao:
---------------------------------
suqingxiao,我换了一块别家的板子运行你的程序,结果是正确的。
难道我的原子板子坏了,可是我下了个跑马灯的程序可以正常运行。很诡异。

---------------------------------
找出问题了。
是串口调试助手显示刷新的速度远远慢于所接收的速度。把PA0与PB6连接之前,收到许多数据,在连接两引脚之后,这些数据还在不停的刷新,误以为是当前的数据。解决办法就是点击停止显示,再点继续显示,就可以了。
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

9

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2011-7-7
在线时间
1 小时
发表于 2012-3-6 22:54:30 | 显示全部楼层
回复【楼主位】suqingxiao:
---------------------------------
楼主,APB1的时钟只有36M,为什么这里Capture_Init(2000,72-1)设置72-1,说明分频为1M,分频是1M呢?应该是2M的啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-3-6 23:21:36 | 显示全部楼层
回复【10楼】xin2893:
---------------------------------
看时钟树图.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2011-7-7
在线时间
1 小时
发表于 2012-3-6 23:52:51 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
懂了,谢谢!先还是没自习看APB1的时钟,先以为到APB1的时钟本来就是36然后预分频2的话定时器最后得到的还是36M所以出问题了,现在懂了,呵呵
回复 支持 反对

使用道具 举报

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2012-2-26
在线时间
0 小时
发表于 2012-3-24 16:40:36 | 显示全部楼层

回复【楼主位】suqingxiao:
---------------------------------
请问楼主,为什么定时器2要设置两个输入呀?不是每一个通道对应一个选择输入端嘛?求指教..

他山之石,可以攻玉.
回复 支持 反对

使用道具 举报

6

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2012-2-26
在线时间
0 小时
发表于 2012-3-24 23:29:42 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
请问原子哥。问楼主,为什么定时器2要设置两个输入呀?不是每一个通道对应一个选择输入端嘛?出来了一个2呢?
IC1Value = TIM2->CCR1;//读取CCR1也可以清CC1IF标志位
 IC2Value = TIM2->CCR2;//读取CCR1也可以清CC2IF标志位                   
 TIM2->SR&=~(1<<1);//清除中断标志位      

很疑惑,
他山之石,可以攻玉.
回复 支持 反对

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2012-2-21
在线时间
0 小时
发表于 2012-4-10 20:25:17 | 显示全部楼层
回复【楼主位】suqingxiao:
---------------------------------
最近我也在刚学捕获,感谢楼主的程序给了我很大的帮助啊。(*^__^*)
 
我发现楼主关于捕获的IO口配置的那一部分可以稍稍优化一下

 GPIOA->CRL&=0XFFFFFFF0;//PA0 输出 
 GPIOA->CRL|=0X00000004;//复用功能输出      
 GPIOA->ODR|=1<<0;//PA0 上拉

可以不用写,因为只要CCxS不为00,则通道被配置为输入,手册P267
而且注释好像也有错误哦!
回复 支持 反对

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2012-2-21
在线时间
0 小时
发表于 2012-4-11 16:18:28 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
我将楼主的程序研究了一下,把他修改成了用PA1口的PWM捕获输入
 void Capture_Init(u16 arr,u16 psc)
{
 //此部分需手动修改 IO口设置
  
 RCC->APB2ENR|=1<<0;                //辅助功能开启 
 RCC->APB1ENR|=1<<0;                 //TIM2 时钟使能
 RCC->APB2ENR|=1<<2;              //使能PORTA时钟
   
 TIM2->ARR=arr;                   //设定计数器自动重装值//刚好1ms   
 TIM2->SC=psc;                 //预分频器,
  
//TIM2->SMCR|=0x00D4;               //1101 0100
// TIM2->SMCR|= 1<<7;                 //MSM=1 主/从模式,似乎没用到
// TIM2->SMCR|= 5<<4;     A              //1  t  TS=101 触发选择
 TIM2->SMCR|= 6<<4;               //  TS=110 触发选择,选择TI2FP2
  TIM2->SMCR|= 4<<0;                   //2  SMS=100 复位模式,这个必须有,选中的触发输入信号(TRGi)的上升沿重新初始化计数器,并且产生一个更新寄存器的信号

//捕获周期
// TIM2->CCMR1|=1<<0;     B       //3   CC1S=01 选择输入端      CC1通道被配置为输入,IC1映射到TI1上
 TIM2->CCMR1|=2<<0;                 //cc1通道被配置为输入,IC1映射到TI2上     
// TIM2->CCMR1|=3<<4;      C      //4    IC1F=0011配置输入滤波器,
 TIM2->CCMR1|=3<<12;               //     IC2F=0011配置输入滤波器  ,对TI2滤波 
 TIM2->CCER|=0<<1;                    //5    CC1P=0 选择有效转换边沿,不反相,捕获发生在IC的  
 TIM2->CCMR1|=0<<2;                 //6    IC1PS=00 配置输入分频 定义CC1的预分频系数  
 TIM2->CCER|=1<<0;                    //7    CC1E=1 允许捕获计数器的值到捕获寄存器中,该位决定了计数器的值能否捕获入TIMx_CCR1寄存器中

 //捕获下降沿
// TIM2->CCMR1|=2<<8;     D      //8   CC2S=10 选择输入端
 TIM2->CCMR1|=1<<8;              //CC2S=01 选择输入端    IC2输入,映射于TI2
 TIM2->CCER|=1<<5;                 //9    CC2P=1 选择有交转换边沿 
 TIM2->CCER|=1<<4;                 //10    CC2E=1 允许捕获计数器的值到捕获寄存器中

 TIM2->DIER|=1<<1;   //允许更新捕获中断    
    
 TIM2->CR1|=0x01;    //使能定时器2
   MY_NVIC_Init(1,3,TIM2_IRQChannel,2);//抢占1,子优先级3,组2         
}

因为只要CCxS不为00,则通道被配置为输入,所以我将楼主对于IO口配置那部分删除
对于楼主的程序,我认为只有四个地方需要重新配置,已经用ABCD标注,
至于未修改的部分,我理解是对ICx进行配置,所以只要将ICx与TIx按要求对应上,其他对ICx的配置部分就不需要修改
而且有个地方一直不是很理解,就是字母A标注出的那句话,TI1对应TI1FP1,TI2对应TI2FP2??

这个程序调了一天了,还是一点头绪都没有,原子哥帮忙看看呐

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-4-11 18:06:10 | 显示全部楼层
输入捕获还没研究过...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2012-2-21
在线时间
0 小时
发表于 2012-4-11 20:38:52 | 显示全部楼层
回复【楼主位】suqingxiao:
---------------------------------
好吧 ,呼叫楼主,呼叫楼主,问题在第15楼。
回复 支持 反对

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
 楼主| 发表于 2012-4-26 11:16:34 | 显示全部楼层
QQ 345415244 请注STM32
?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
 楼主| 发表于 2012-4-26 11:24:18 | 显示全部楼层
A:这里是定时器输入口1,我是IC1映射到TI1, 所以是从TI1PF1触发的,具体请看PWM输入图表。
B:通道选择请看手册,CC1通道被配置为输入,IC1映射到TI1上
C:输入滤波器请看手册
D:从输入选择了CCR2,通道TI2.
20120426113344.jpg
?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
 楼主| 发表于 2012-4-26 11:28:09 | 显示全部楼层
你几个问题点没有把握好,

一个是映射,
一个是主输入,
一个是从输入,
只有从输入才有第一个跳变复位,第二个跳变存在CCR2或者CCR1中,
主输入可以先CCR1,也可能选择CCR2,这里要从输入配合,他们不能同用一个CCR.
这几个问题你能搞清楚了,就很清楚了。
?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
 楼主| 发表于 2012-4-26 11:30:10 | 显示全部楼层
//TIM2->SMCR|=0x00D4;               //1101 0100 
这里不能去掉,PWM输入模式要有一个从模式,从模式是设置成了第一个跳变复位。
?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

20

主题

111

帖子

2

精华

高级会员

Rank: 4

积分
541
金钱
541
注册时间
2011-10-18
在线时间
9 小时
 楼主| 发表于 2012-4-26 11:31:01 | 显示全部楼层
主从要分清,选择哪个输入通道就要选择相应的存贮CCR.
?成功只是最后一小步的坚持!
回复 支持 反对

使用道具 举报

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
发表于 2012-5-5 22:51:32 | 显示全部楼层
回复【楼主位】suqingxiao:
---------------------------------
楼主您好!我也在研究PWM输入的问题没搞明白我仿真了一下你的程序和我的程序结果是一样的
也就是说  当CHI上升沿是产生了捕捉CCR1=CNT  CNT=0;程序继续运行当PA0口产生下降沿时CCR2的值=0;CNT的值是脉冲数但是CCR2的值=CNT才对啊??
是我的软件有问题还是你的程序有问题 帮忙解决一下吧
谢谢了。困扰我号几天了
回复 支持 反对

使用道具 举报

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
发表于 2012-5-5 23:01:03 | 显示全部楼层
回复【16楼】shaojunyun:
---------------------------------
我怎么仿真您的程序都以个效果啊 郁闷了总是一个行一个不行 只能捕捉到一个沿
回复 支持 反对

使用道具 举报

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
发表于 2012-5-6 08:40:39 | 显示全部楼层
晕了!仿真软件有问题今天把板子拿来试了一下实现了原来是我的问题,看来我以前的程序也是对的,谢谢各位了
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2012-5-1
在线时间
0 小时
发表于 2012-5-6 10:09:13 | 显示全部楼层
谢谢楼主分享!!!
   我还是对哪个主从模式有点搞不懂希望楼主赐教 
      
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2011-10-1
在线时间
0 小时
发表于 2012-5-7 17:55:10 | 显示全部楼层
手册上PWM输入模式那时有图有说明,你还是先去认真看一下吧。要我一两句话也说不清楚。主要还是自己理解。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2011-10-1
在线时间
0 小时
发表于 2012-5-7 17:57:51 | 显示全部楼层
回复【24楼】shenhao7752376:
回复【楼主位】suqingxiao:
---------------------------------
楼主您好!我也在研究PWM输入的问题没搞明白我仿真了一下你的程序和我的程序结果是一样的
也就是说  当CHI上升沿是产生了捕捉CCR1=CNT  CNT=0;程序继续运行当PA0口产生下降沿时CCR2的值=0;CNT的值是脉冲数但是CCR2的值=CNT才对啊??
是我的软件有问题还是你的程序有问题 帮忙解决一下吧
谢谢了。困扰我号几天了
---------------------------------
这个你可以看PWM输入模式下的时序图就很清楚了,CH1产生捕获是CH2复位,下一个上升沿来时CH1产生中断CCR1=CNT,下降沿时CCR2=CNT.
回复 支持 反对

使用道具 举报

4

主题

10

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2012-4-28
在线时间
0 小时
发表于 2012-5-31 15:32:15 | 显示全部楼层
回复【楼主位】suqingxiao:
---------------------------------
 WM_Init(1000,72-1);  //不分频。PWM频率=72000/1440=5Khz   楼主  这条语句没有分频吗?72—1是怎么回事啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-31 16:06:23 | 显示全部楼层
0~71就是72.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2012-5-31
在线时间
0 小时
发表于 2012-7-20 13:35:55 | 显示全部楼层
LZ                 TIM2->SMCR|=0x00D4; 这一句代码。 
SMS【2:0】=100 复位模式 – 选中的触发输入(TRGI)的上升沿重新初始化计数器,并且产生一个更新寄存器的信号。
TS[2:0]=101滤波后的定时器输入1(TI1FP1) 。 
MSM=1 触发输入(TRGI)上的事件被延迟了,以允许在当前定时器(通过TRGO)与它的从定时器间的完美同步。这对要求把几个定时器同步到一个单一的外部事件时是非常有用的。
不大明白为什么要这么设置,能简单解释下么~谢谢了 
回复 支持 反对

使用道具 举报

18

主题

158

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
400
金钱
400
注册时间
2011-11-23
在线时间
0 小时
发表于 2012-7-27 16:48:34 | 显示全部楼层
回复【5楼】suqingxiao:
---------------------------------
IC1Value = 1000

IC2Value = 499

Frequency = 1000

DutyCycle = 49

---------------

IC1Value = 1000

IC2Value = 499

Frequency = 1000

DutyCycle = 49

---------------

IC1Value = 1000

IC2Value = 499

Frequency = 1000

DutyCycle = 49

---------------
我的占空比一直都是49%,而且我采集了高电平的个数是499,这个应该是硬件的原因还是软件的原因呢
回复 支持 反对

使用道具 举报

18

主题

158

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
400
金钱
400
注册时间
2011-11-23
在线时间
0 小时
发表于 2012-7-27 16:51:50 | 显示全部楼层
回复【14楼】内有元基:
---------------------------------
每个定时器有四个输入捕获通道IC1、IC2、IC3、IC4。且IC1 IC2一组,IC3 IC4一组。并且可是设置管脚和寄存器的对应关系。且同一个TIx输入映射了两个ICx信号。这两个ICx信号分别在相反的极性边沿有效。
回复 支持 反对

使用道具 举报

18

主题

158

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
400
金钱
400
注册时间
2011-11-23
在线时间
0 小时
发表于 2012-7-27 16:55:46 | 显示全部楼层
回复【27楼】stc-mp3:
---------------------------------
输入捕获模式中的一个特例:PWM输入模式见STM32参考手册P267,里面输入捕获模式里面的寄存器设置有一个详细的论述
回复 支持 反对

使用道具 举报

0

主题

21

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2012-7-30
在线时间
0 小时
发表于 2012-8-11 21:26:58 | 显示全部楼层
多谢楼主分享   正郁闷
回复 支持 反对

使用道具 举报

12

主题

432

帖子

0

精华

高级会员

Rank: 4

积分
729
金钱
729
注册时间
2012-6-21
在线时间
59 小时
发表于 2013-7-17 14:12:01 | 显示全部楼层
多谢分享。
回复 支持 反对

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2013-7-16
在线时间
0 小时
发表于 2013-7-18 18:09:12 | 显示全部楼层
留言 有用
回复 支持 反对

使用道具 举报

9

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2013-3-16
在线时间
0 小时
发表于 2013-7-30 09:52:35 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

9

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-2-5
在线时间
0 小时
发表于 2013-8-10 15:29:01 | 显示全部楼层
把这个程序写进我的开发板,中断进不了。郁闷了。不知道怎么检查问题
回复 支持 反对

使用道具 举报

9

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-2-5
在线时间
0 小时
发表于 2013-8-10 15:53:17 | 显示全部楼层
回复【40楼】云中的太阳:

把这个程序写进我的开发板,中断进不了。郁闷了。不知道怎么检查问题

---------------------------------
用示波器检查了一下PWM输出,50%的占空比,是没问题的。。
回复 支持 反对

使用道具 举报

38

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
300
金钱
300
注册时间
2013-8-19
在线时间
0 小时
发表于 2013-12-1 16:37:56 | 显示全部楼层
我是用TIM3_CH2做的试验,CH2 捕捉PWM频率,CH1捕捉高电平 。寄存器的会写,可是库函数的不知道怎么放在一起。
用下面的方法可以调通,请问楼至怎么把寄存器部分写成库函数,如果照着IC2改,就把之前的配置覆盖了

//IC2
   TIM3_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC2S=01     选择输入端 IC2映射到TI2上
      TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;    //上升沿捕获
      TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI ; //映射到TI2上
      TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;     //配置输入分频,不分频
      TIM3_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
    //IC1
    TIM3->CCMR1|=2<<0;//CC1S=10 选择输入端
    TIM3->CCER|=1<<1; //CC1P=1 选择有交转换边沿 下降沿有效
    TIM3->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中

    TIM_ICInit(TIM3, &TIM3_ICInitStructure);

回复 支持 反对

使用道具 举报

13

主题

225

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2013-11-12
在线时间
29 小时
发表于 2013-12-2 10:08:02 | 显示全部楼层
其实可以整个库函数的啊
回复 支持 反对

使用道具 举报

8

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
264
金钱
264
注册时间
2013-9-5
在线时间
31 小时
发表于 2014-3-6 21:29:41 | 显示全部楼层
谢谢分享,记号备用!
回复 支持 反对

使用道具 举报

14

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2012-8-21
在线时间
29 小时
发表于 2014-12-16 11:16:15 | 显示全部楼层
可用,感谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-8-14
在线时间
0 小时
发表于 2015-8-14 10:03:16 | 显示全部楼层
好东西 ,谢谢分享
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2016-3-24
在线时间
28 小时
发表于 2016-4-23 10:53:04 | 显示全部楼层
您好!请问下楼主:用了您的程序之后为什么TIM2->CCR1一直没有读数(没捕获到),而TIM2->CCR2,正常呢?请问能解答下吗?
回复 支持 反对

使用道具 举报

1

主题

119

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2005
金钱
2005
注册时间
2013-10-7
在线时间
330 小时
发表于 2016-5-11 09:23:11 | 显示全部楼层
make,标记以后使用
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-7-27
在线时间
0 小时
发表于 2016-7-27 19:55:27 | 显示全部楼层
楼主,请教一下,PWM的频率最大能设置到多少,STM32能产生Mhz的方波么
回复 支持 反对

使用道具 举报

0

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2016-7-24
在线时间
14 小时
发表于 2016-7-29 10:43:21 | 显示全部楼层
Mark Mark 谢谢楼主分享。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 16:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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