OpenEdv-开源电子网

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

pwm输入捕获的奇怪现象

[复制链接]

2

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2014-10-7
在线时间
1 小时
发表于 2014-10-7 16:40:24 | 显示全部楼层 |阅读模式
5金钱
用stm32f103rb芯片的mini stm32开发板做输入捕获。TIM3CH2输出pwm波,分别用了TIM3的CH1,3,4;TIM2的CH2,3;TIM4的CH1进行捕获,用串口输出高电平时间,但是TIM3的CH1,3,4输出的时间一直为高电平时间加上一个定时器周期,而另外3个则正常,程序其他部分除了必须要改的channel等等参数外没有其他改动,不知道这是什么原因,,,,求助!

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-7 23:54:30 | 显示全部楼层
你用定时器3输出PWM,又用定时器3捕获???
你的思路是什么样的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2014-10-7
在线时间
1 小时
 楼主| 发表于 2014-10-9 11:02:06 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我使用Tim3的ch2输出pwm波,然后把Tim3ch2与Tim3ch1用线连起来,ch1设置为上升沿触发中断,检测到上升沿,记录定时器计数值,然后设置成下降沿触发,捕获到下降沿后记录计数值并结合捕获上升沿时记录的值,计算出高电平时间,设为上升沿捕获,这样循环,中间还有清标志位的过程,但是按照我的想法,高电平时间应该等于(下降沿记录值-上升沿记录值+高电平时间内定时器溢出次数)*定时器加一所用时间+定时器周期*(定时器溢出次数-1),但是这样算出来结果是高电平时间+一个定时器周期,谢谢原子哥!回复的有些晚请见谅
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-9 19:55:07 | 显示全部楼层
回复【3楼】amberfan:
---------------------------------
你直接输入一个固定脉冲,测试下输入捕获。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2014-10-7
在线时间
1 小时
 楼主| 发表于 2014-10-9 20:19:21 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
我用另一块一样的开发板烧写入一样的程序,一块开发板的tim3ch2输出pwm波,另一块只负责捕获,得到了完全一样的结果
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-11 00:00:10 | 显示全部楼层
回复【5楼】amberfan:
---------------------------------
计算公式貌似有问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2014-10-7
在线时间
1 小时
 楼主| 发表于 2014-10-11 21:10:38 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
我用相同的公式在不同的通道得到了不一样的结果。。。
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2014-10-7
在线时间
1 小时
 楼主| 发表于 2014-10-12 12:43:18 | 显示全部楼层
[mw_shl_code=c,true]void TIM3_IRQHandler(void) { /* CH1上升沿标志 捕获到上升沿置1 */ static uint8_t HFlag_CH1 = 0; /* CH1捕获到上升沿计数器值 */ static uint16_t UCapture_CH1 = 0; /* CH1捕获到下降沿计数器值 */ static uint16_t DCapture_CH1 = 0; /* CH1定时器溢出次数 */ static uint8_t CNT_CH1 = 0; static uint8_t HFlag_CH3 = 0; static uint16_t UCapture_CH3 = 0; static uint16_t DCapture_CH3 = 0; static uint8_t CNT_CH3 = 0; static uint8_t HFlag_CH4 = 0; static uint16_t UCapture_CH4 = 0; static uint16_t DCapture_CH4 = 0; static uint8_t CNT_CH4 = 0; /* psc TIM3预分频系数 arr TIM3自动重装值 */ uint8_t psc = TIM3->SC; uint8_t arr = TIM3->ARR; /* 默认系统时钟频率72MHZ,Tout单位us */ uint16_t Tout = (psc+1)*(arr+1)/72; /* 计数一次所用时间,单位us */ uint16_t CountRate = Tout/(arr+1); if(TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET) { if(HFlag_CH1 == 0) { HFlag_CH1 = 1; UCapture_CH1 = TIM_GetCapture1(TIM3); TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Falling); CNT_CH1 = 0; } else if(HFlag_CH1 == 1) { HFlag_CH1 = 0; DCapture_CH1 = TIM_GetCapture1(TIM3); TIM_OC1PolarityConfig(TIM3,TIM_ICPolarity_Rising); if(CNT_CH1>=1) HTime[4] = (DCapture_CH1 - UCapture_CH1) * CountRate + Tout * (CNT_CH1 - 1); else if(CNT_CH1==0) HTime[4] = (DCapture_CH1 - UCapture_CH1) * CountRate; HTimeFlag[4] = 1; CNT_CH1 = 0; } /* 清除捕获中断标志位 */ TIM_ClearITPendingBit(TIM3,TIM_IT_CC1); } void TIM3_CH1_Cap_Init(uint16_t arr,uint16_t psc) { TIM_TimeBaseInitTypeDef TIM3_TimeBaseStruct; GPIO_InitTypeDef GPIO_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; TIM_ICInitTypeDef TIM3_ICStruct; /* 使能TIM3时钟 使能复用时钟 使能GPIOB时钟 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); /* TIM3设为部分重映射 */ GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); /* TIM3_CH1-->B.4 端口配置 复用推挽 */ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStruct); /* 拉低PB.4 */ GPIO_ResetBits(GPIOB,GPIO_Pin_4); /* TIM3配置 自动重装值 预分频系数 时钟分割为零 向上计数 */ TIM3_TimeBaseStruct.TIM_Period = arr; TIM3_TimeBaseStruct.TIM_Prescaler = psc; TIM3_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1; TIM3_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM3_TimeBaseStruct); /* TIM3输入捕获配置 Channel_1 上升沿捕获 捕获输入不分频 直接映射 输入不滤波 */ TIM3_ICStruct.TIM_Channel = TIM_Channel_1; TIM3_ICStruct.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM3_ICStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM3_ICStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM3_ICStruct.TIM_ICFilter = 0; TIM_ICInit(TIM3,&TIM3_ICStruct); /* 设置TIM3中断优先级 */ NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02; NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); /* 使能TIM3更新中断 TIM3_CH1捕获中断 */ TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_CC1,ENABLE); /* 使能TIM3 */ TIM_Cmd(TIM3,ENABLE ); } [/mw_shl_code]
这是代码的一部分。。。。 这里用不正确的公式得到的是正确的结果
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-30 11:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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