OpenEdv-开源电子网

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

PWM 输入测占空比和频率问题

[复制链接]

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2013-8-19
在线时间
4 小时
发表于 2015-5-6 11:57:19 | 显示全部楼层 |阅读模式
5金钱
void TIM2_PWMInput_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_ICInitTypeDef  TIM2_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIO外设
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                               //GPIO??
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
 
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值  
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 

/*配置中断优先级*/
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;                     
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
 
TIM2_ICInitStructure.TIM_Channel = TIM_Channel_4;                   
  TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;       
  TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;   
  TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; 
TIM2_ICInitStructure.TIM_ICFilter = 0x0F; 
 
TIM_PWMIConfig(TIM2, &TIM2_ICInitStructure);     //PWM输入配置           
  TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);     //选择有效输入端        
  TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);  //配置为主从复位模式
  TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);                                       
  TIM_ITConfig(TIM2, TIM_IT_CC2|TIM_IT_Update, ENABLE);          //中断配置
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2|TIM_IT_Update); //清除中断标志位
TIM_Cmd(TIM2, ENABLE); 
}
void TIM3_PWMInput_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_ICInitTypeDef  TIM3_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIO外设
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                               //GPIO??
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
 
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值  
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 

/*配置中断优先级*/
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;                     
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
 
TIM3_ICInitStructure.TIM_Channel = TIM_Channel_1;                   
  TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;       
  TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;   
  TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; 
TIM3_ICInitStructure.TIM_ICFilter = 0x0F; 
 
TIM_PWMIConfig(TIM3, &TIM3_ICInitStructure);     //PWM输入配置           
  TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);     //选择有效输入端        
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);  //配置为主从复位模式
  TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);                                       
  TIM_ITConfig(TIM3, TIM_IT_CC2|TIM_IT_Update, ENABLE);          //中断配置
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2|TIM_IT_Update); //清除中断标志位
TIM_Cmd(TIM3, ENABLE); 
}
//Ay
u16 period1 = 0;
u16 duty1  = 0;
u8 CollectFlag1 = 1;
//Ax
u16 period2 = 0;
u16 duty2  = 0;
u8 CollectFlag2 = 1;
void TIM2_IRQHandler(void)
{

if(CollectFlag1)
{
if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)//捕获1发生捕获事件
{
duty1 = TIM_GetCapture1(TIM2); //采集占空比
 period1 = TIM_GetCapture2(TIM2);     //采集周期
}
CollectFlag1 = 0;
}
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2|TIM_IT_Update); //清除中断标志位
}
//
void TIM3_IRQHandler(void)
{

if(CollectFlag2)
{
if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET)//捕获1发生捕获事件
{
duty2 = TIM_GetCapture1(TIM3); //采集占空比
 period2 = TIM_GetCapture2(TIM3);     //采集周期
}
CollectFlag2 = 0;
}
TIM_ClearITPendingBit(TIM3, TIM_IT_CC2|TIM_IT_Update); //清除中断标志位
}
程序得到的数值完全不对头,已知PWM输入的频率在100HZ左右,求大师指点

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

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5779
金钱
5779
注册时间
2013-11-22
在线时间
1211 小时
发表于 2015-5-6 22:35:20 | 显示全部楼层
再去琢磨下  参考手册   定时器PWM输入模式
回复

使用道具 举报

7

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2013-8-19
在线时间
4 小时
 楼主| 发表于 2015-5-7 15:22:26 | 显示全部楼层
好像CH1/CH2 或CH3/CH4 是一对使用的
回复

使用道具 举报

5

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2016-8-2
在线时间
107 小时
发表于 2016-8-9 14:55:41 | 显示全部楼层
CH3不能映射到IC1和IC2上
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 06:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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