stm32怎么设置CH4Nstm32输入捕获测频率

stm32 计数器模式――输出比较模式强置输出模式PWM输入模式输入捕获模式_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
stm32 计数器模式――输出比较模式强置输出模式PWM输入模式输入捕获模式
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢&&&&STM32利用输入捕获模式测量频率
&STM32利用输入捕获模式测量频率
STM32利用输入捕获模式测量频率,利用上升沿和下降沿的差值
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
Q.为什么我点的下载下不了,但积分却被扣了
A. 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。
Q.我的积分不多了,如何获取积分?
A. 获得积分,详细见。
完成任务获取积分。
论坛可用分兑换下载积分。
第一次绑定手机,将获得5个C币,C币可。
关注并绑定CSDNID,送10个下载分
下载资源意味着您已经同意遵守以下协议
资源的所有权益归上传用户所有
未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途
CSDN下载频道仅提供交流平台,并不能对任何下载资源负责
下载资源中如有侵权或不适当内容,
本站不保证本站提供的资源的准确性,安全性和完整性,同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
开发技术下载排行
您当前C币:0&&&可兑换 0 下载积分
兑换下载分:&
消耗C币:0&
立即兑换&&
兑换成功你当前的下载分为 。前去下载资源
你下载资源过于频繁,请输入验证码
如何快速获得积分?
你已经下载过该资源,再次下载不需要扣除积分
STM32利用输入捕获模式测量频率
所需积分:2
剩余积分:0
扫描微信二维码精彩活动、课程更新抢先知
VIP会员,免积分下载
会员到期时间:日
剩余下载次数:1000
STM32利用输入捕获模式测量频率
剩余次数:&&&&有效期截止到:
你还不是VIP会员VIP会员享免积分 . 专属通道极速下载
VIP下载次数已满VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员
你的VIP会员已过期VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员【转帖】STM32输入捕获模式
【转帖】STM32输入捕获模式
&本帖最后由 nibutaiguai 于
08:32 编辑
输入捕获模式库函数例程位置: F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examples\TIM\InputCapture在输入捕获模式下,当检测到ICx信号上相应的边沿后,计数器的当前值被锁存到捕获/比较寄存器(TIMx_CCRx)中。当捕获事件发生时,相应的CCxIF标志(TIMx_SR寄存器)被置’1’,如果使能了中断或者DMA操作,则将产生中断或者DMA操作。在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。PWM输入模式库函数例程位置 :STM32F10x_StdPeriph_Lib_V3.3.0\Project\STM32F10x_StdPeriph_Examples\TIM\PWM_Input该模式是输入捕获模式的一个特例例如,你需要测量输入到TI1上的PWM信号的长度(TIMx_CCR1寄存器)和占空比(TIMx_CCR2寄存器),具体步骤如下(取决于CK_INT的频率和预分频器的值)● 选择TIMx_CCR1的有效输入:置TIMx_CCMR1寄存器的CC1S=01(选择TI1)。● 选择TI1FP1的有效极性(用来捕获数据到TIMx_CCR1中和清除计数器):置CC1P=0(上升沿有效)。● 选择TIMx_CCR2的有效输入:置TIMx_CCMR1寄存器的CC2S=10(选择TI1)。● 选择TI1FP2的有效极性(捕获数据到TIMx_CCR2):置CC2P=1(下降沿有效)。● 选择有效的触发输入信号:置TIMx_SMCR寄存器中的TS=101(选择TI1FP1)。● 配置从模式控制器为复位模式:置TIMx_SMCR中的SMS=100。● 使能捕获:置TIMx_CCER寄存器中CC1E=1且CC2E=1。
由于只有TI1FP1和TI2FP2连到了从模式控制器,所以PWM输入模式只能使用TIMx_CH1 /TIMx_CH2信号。强置输出模式在输出模式(TIMx_CCMRx寄存器中CCxS=00)下,输出比较信号(OCxREF和相应的OCx)能够直接由软件强置为有效或无效状态,而不依赖于输出比较寄存器和计数器间的比较结果。例如:CCxP=0(OCx高电平有效),则OCx被强置为高电平。 置TIMx_CCMRx寄存器中的OCxM=100,可强置OCxREF信号为低。输出比较模式此项功能是用来控制一个输出波形,或者指示一段给定的的时间已经到时。 当计数器与捕获/比较寄存器的内容相同时,输出比较功能做如下操作:● 将输出比较模式(TIMx_CCMRx寄存器中的OCxM位)和输出极性(TIMx_CCER寄存器中的CCxP位)定义的值输出到对应的引脚上。在比较匹配时,输出引脚可以保持它的电平(OCxM=000)、被设置成有效电平(OCxM=001)、被设置成无效电平(OCxM=010)或进行翻转(OCxM=011)。● 设置中断状态寄存器中的标志位(TIMx_SR寄存器中的CCxIF位)。● 若设置了相应的中断屏蔽(TIMx_DIER寄存器中的CCxIE位),则产生一个中断。● 若设置了相应的使能位(TIMx_DIER寄存器中的CCxDE位,TIMx_CR2寄存器中的CCDS位选择DMA请求功能),则产生一个DMA请求。输出比较模式的配置步骤:1. 选择计数器时钟(内部,外部,预分频器)2. 将相应的数据写入TIMx_ARR和TIMx_CCRx寄存器中3. 如果要产生一个中断请求和/或一个DMA请求,设置CCxIE位和/或CCxDE位。4. 选择输出模式,例如当计数器CNT与CCRx匹配时翻转OCx的输出引脚,CCRx预装载未用,开启OCx输出且高电平有效,则必须设置OCxM=’011’、OCxPE=’0’、CCxP=’0’和CCxE=’1’。5. 设置TIMx_CR1寄存器的CEN位启动计数器
PWM 模式脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。下面是一个PWM模式1的例子。当TIMx_CNT&TIMx_CCRx时PWM信号参考OCxREF为高,否则为低。如果TIMx_CCRx中的比较值大于自动重装载值(TIMx_ARR),则OCxREF保持为’1’。如果比较值为0,则OCxREF保持为’0’。 下图为TIMx_ARR=8时边沿对齐的PWM波形实例。
单脉冲模式单脉冲模式(OPM)是前述众多模式的一个特例。这种模式允许计数器响应一个激励,并在一个程序可控的延时之后,产生一个脉宽可程序控制的脉冲。可以通过从模式控制器启动计数器,在输出比较模式或者PWM模式下产生波形。设置TIMx_CR1寄存器中的OPM位将选择单脉冲模式,这样可以让计数器自动地在产生下一个更新事件UEV时停止。 仅当比较值与计数器的初始值不同时,才能产生一个脉冲。启动之前(当定时器正在等待触发),必须如下配置:向上计数方式:CNT & CCRx ≤ ARR (特别地,0 & CCRx), 向下计数方式:CNT & CCRx。
编码器接口模式
两个输入TI1和TI2被用来作为增量编码器的接口。参看表77,假定计数器已经启动(TIMx_CR1寄存器中的CEN=’1’),计数器由每次在TI1FP1或TI2FP2上的有效跳变驱动。TI1FP1和TI2FP2是TI1和TI2在通过输入滤波器和极性控制后的信号;如果没有滤波和变相,则TI1FP1=TI1,TI2FP2=TI2。根据两个输入信号的跳变顺序,产生了计数脉冲和方向信号。依据两个输入信号的跳变顺序,计数器向上或向下计数,同时硬件对TIMx_CR1寄存器的DIR位进行相应的设置。不管计数器是依靠TI1计数、依靠TI2计数或者同时依靠TI1和TI2计数。在任一输入端(TI1或者TI2)的跳变都会重新计算DIR位。 编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟。这意味着计数器只在0到TIMx_ARR寄存器的自动装载值之间连续计数(根据方向,或是0到ARR计数,或是ARR到0计数)。所以在开始计数之前必须配置TIMx_ARR;同样,捕获器、比较器、预分频器、触发输出特性等仍工作如常。 在这个模式下,计数器依照增量编码器的速度和方向被自动的修改,因此计数器的内容始终指示着编码器的位置。计数方向与相连的传感器旋转的方向对应。下表列出了所有可能的组合,假设TI1和TI2不同时变换。
下图是一个计数器操作的实例,显示了计数信号的产生和方向控制。它还显示了当选择了双边沿时,输入抖动是如何被抑制的;抖动可能会在传感器的位置靠近一个转换点时产生。在这个例子中,我们假定配置如下:● CC1S=’01’ (TIMx_CCMR1寄存器,IC1FP1映射到TI1)● CC2S=’01’ (TIMx_CCMR2寄存器,IC2FP2映射到TI2)● CC1P=’0’ (TIMx_CCER寄存器,IC1FP1不反相,IC1FP1=TI1)● CC2P=’0’ (TIMx_CCER寄存器,IC2FP2不反相,IC2FP2=TI2)● SMS=’011’ (TIMx_SMCR寄存器,所有的输入均在上升沿和下降沿有效).● CEN=’1’ (TIMx_CR1寄存器,计数器使能)
TIM 与Hall接口霍尔传感器位于三相电机& && && && && && && && && && && && && && &&&
发表评论:
TA的最新馆藏查看: 6653|回复: 29
定时器输入捕获求助
主题帖子精华
初级会员, 积分 75, 距离下一级还需 125 积分
在线时间0 小时
想用定时器捕获脉宽长度,根据库函数捉摸了几天,代码如下
#include "sys.h"
#include "usart.h"&&
#include "delay.h"&
#include "timer.h"
//extern u16&TIM4CH1_CAPTURE_VAL;&//输入捕获值
int main(void)
&&Stm32_Clock_Init(9);&&//系统时钟设置
&uart_init(72,9600);& &&//串口初始化为9600
&delay_init(72);&&& & &&//延时初始化&
&&TIM4_Cap_Init(0XFFFF,72);&//以1Mhz的频率计数
void TIM4_Cap_Init(u16 arr,u16 psc)
&RCC-&APB1ENR|=1&&2;&& &//TIM4 时钟使能
&RCC-&APB2ENR|=1&&3;&&& &//使能PORTB时钟
&RCC-&APB2ENR|=1&&0;&
&GPIOB-&CRL&=0XF0FFFFFF;&//PB6 清除之前设置&
&GPIOB-&CRL|=0X;&//PB6 输入&&
&GPIOB-&ODR|=1&&6;&&//PB6 上拉
&&TIM4-&ARR=& &&//设定计数器自动重装值&&
&TIM4-&gtSC=& &&//预分频器
&TIM4-&CR1&=~(1&&8);&&&&
&TIM4-&CR1&=~(1&&9); &//时钟分割CKD=00
&TIM4-&CR1&=~(1&&4);&&&& //计数器向上计数
&TIM4-&CCMR1|=1&&0;&&//CC1S=01 &选择输入端 IC1映射到TI1上
&&TIM4-&CCMR1&=~(1&&4); &&//IC1F=0000 配置输入滤波器 不滤波
&TIM4-&CCMR1&=~(1&&5);
&TIM4-&CCMR1&=~(1&&6);
&TIM4-&CCMR1&=~(1&&7);
&&TIM4-&CCMR1&=~(1&&2); &//IC1PS=00 &配置输入分频,不分频
&TIM4-&CCMR1&=~(1&&3);
&TIM4-&CCER|=1&&1; &&//CC1P=0&下降沿捕获
&TIM4-&CCER|=1&&0; &&//CC1E=1 &允许捕获计数器的值到捕获寄存器中
&TIM4-&DIER|=1&&1;&& &//允许捕获中断&&&&
&//TIM4-&DIER|=1&&0;&& &//允许更新中断
&&& //TIM4-&DIER|=1&&6;&&&&&& //使能中断&
&TIM4-&CR1|=0x01;&&& &//使能定时器4
&MY_NVIC_Init(1,3,TIM4_IRQChannel,2);//抢占2,子优先级0,组2
&&&&& &&&&
u16&TIM4CH1_CAPTURE_VAL;&//输入捕获值
//定时器5中断服务程序&
void TIM4_IRQHandler(void)
&TIM4CH1_CAPTURE_VAL=TIM4-&CCR1;
&printf("TIM4CH1_CAPTURE_VAL = %d\r\n",TIM4CH1_CAPTURE_VAL);
&TIM4-&SR&=~(1&&1);//清除中断标志位 &&&&
void SystemInit (void){}
结果打印出来的数据竟然是这样的
b8ee93de_365.jpg (0 Bytes, 下载次数: 0)
22:54 上传
各位大侠有时间给看看,都要疯了,对照了手册上的14.3.5章节的“输入捕获模式”感觉寄存器设置没有什么错误,可为什么打印出来的结果会是这样。
主题帖子精华
在线时间343 小时
你的思路是什么?
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 75, 距离下一级还需 125 积分
在线时间0 小时
回复【2楼】正点原子:
---------------------------------
我的思路就是想要捕获PWM波高电平的时间,就是只捕获脉宽
主题帖子精华
在线时间343 小时
你这样代码有问题的。
参考战舰板的例程。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 75, 距离下一级还需 125 积分
在线时间0 小时
回复【4楼】正点原子:
---------------------------------
我明白了,貌似只设一个边沿的话,测出来的还是周期,我之所以会出现这样的乱码,是因为我用两块板实验,一个产生PWM,一个捕获,没有共地。对了,原子哥,战舰输入捕获的例程中捕获状态标志位TIM5CH1_CAPTURE_STA为什么是如下设置,想不明白。
//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到高电平;1,已经捕获到高电平了.
//[5:0]:捕获高电平后溢出的次数
u8&&TIM5CH1_CAPTURE_STA=0; //输入捕获状态
主题帖子精华
在线时间343 小时
回复【5楼】sunky@feeling:
---------------------------------
因为我要捕获高电平脉宽,而输入捕获某个时刻,只能处于一种模式(上升沿捕获/下降沿捕获),所以必须在捕获一个上升沿以后,设置为下降沿捕获,这样才能成功捉到一个高电平啊!
剩下的,如果高电平时间很长,也就是上升沿出现后,长时间没出现下降沿,那么定时器就可能溢出,那就得做溢出处理,所以,剩余的位数,用作溢出计数。这样,整个就比较完美了。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 75, 距离下一级还需 125 积分
在线时间0 小时
回复【6楼】正点原子:
---------------------------------
谢谢原子大哥,我明白了,我想把战舰版上的实验10输入捕获改成4个通道同时捕获,你看能实现不?
主题帖子精华
在线时间343 小时
主题帖子精华
初级会员, 积分 75, 距离下一级还需 125 积分
在线时间0 小时
回复【8楼】正点原子:
---------------------------------
我看了捕获的例程,在单通道里面每次在设置下降沿之前都(TIM4-&CNT=0;)把计数器清零了,如果设置成多路捕获的话,在1通道捕获时其他通道还没有捕获完成计数器就清零了,这样其它的通道就不正确了。怎么办?
if(tsr&0x02)//捕获1发生捕获事件
if(TIM4CH1_CAPTURE_STA&0X40)
//捕获到一个下降沿&
TIM4CH1_CAPTURE_STA|=0X80;
//标记成功捕获到一次高电平脉宽
&&&&TIM4CH1_CAPTURE_VAL=TIM5-&CCR1; //获取当前的捕获值.
TIM4-&CCER&=~(1&&1);
//CC1P=0&设置为上升沿捕获
//还未开始,第一次捕获上升沿
TIM4CH1_CAPTURE_STA=0;
TIM4CH1_CAPTURE_VAL=0;
TIM4CH1_CAPTURE_STA|=0X40;
//标记捕获到了上升沿
TIM4-&CNT=0;
//计数器清空
TIM4-&CCER|=1&&1;&
//CC1P=1&设置为下降沿捕获
主题帖子精华
在线时间343 小时
回复【9楼】sunky@feeling:
---------------------------------
那你就得多加几个变量,记录下开始捕获的时刻,CNT的值,然后减一下就是了。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 75, 距离下一级还需 125 积分
在线时间0 小时
回复【10楼】正点原子:
---------------------------------
恩,我试试,谢谢
主题帖子精华
初级会员, 积分 75, 距离下一级还需 125 积分
在线时间0 小时
回复【11楼】sunky@feeling:
---------------------------------
原子哥,经过几天的思考,我还是有些事情没有想明白:也就是我在中断函数里面,如果设置两个变量(对于1通道):
u16&this_time_ch1=0;
u16&last_time_ch1=0;
u8&ch1_
在上升沿捕获的时候
this_time_ch1=TIM4-&CNT;
在下降沿的时候
last_time_ch1=TIM4-&CNT;
然后1通道捕获的脉宽就是
ch1_value=last_time_ch1-this_time_ch1;
这样就不在去读TIM4-&CCR1中的值了吗?
主题帖子精华
在线时间343 小时
当然还是要读啊
读了CCR1的值,还需要读CNT。两者结合。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 75, 距离下一级还需 125 积分
在线时间0 小时
回复【13楼】正点原子:
---------------------------------
原子哥,不是当以检测到ICx上的边沿的的时候,计数器的值就被直接拷贝到CCR中去了吗,如果我在检测到上升沿是读一下CCR,然后在在下降沿的时候再读一下CCR,这样的话不就可以不去读CNT&中的值了吗,将两个CCR的读数一减就是脉宽了是不是?
主题帖子精华
在线时间343 小时
是这么说,但是如果溢出呢?
比如捕获到上升沿以后,下降沿迟迟不到,导致CNT溢出,此时就必须做标记。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 75, 距离下一级还需 125 积分
在线时间0 小时
回复【15楼】正点原子:
---------------------------------
我捕获的波形是已知的,4路周期已知的PWM波形,占空比是变化的,我主要是捕获其高电平的时间长度,所以是不是不用考虑CNT的溢出吧。
主题帖子精华
在线时间343 小时
那如果能确保不会溢出,那可以不做溢出处理。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 75, 距离下一级还需 125 积分
在线时间0 小时
回复【17楼】正点原子:
---------------------------------
谢谢原子哥指点。
主题帖子精华
初级会员, 积分 75, 距离下一级还需 125 积分
在线时间0 小时
回复【18楼】sunky@feeling:
---------------------------------
原子哥,不好意思,在你百忙之中打扰你,小弟实在表示歉意,由于周围没有老师可问,实在没有办法才一直揪着你问问题,希望你谅解,这是我根据战舰版捕获的里程改的4通道捕获的代码的中断服务程序,前面寄存器的配置没有多大问题,在此就没有贴上来,你看看这样能实现不,谢谢原子哥,最后再一次抱歉打扰你。
#include&&timer.h&
#include&&usart.h&
//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到高电平;1,已经捕获到高电平了.
//[5:0]:捕获高电平后溢出的次数
u8&&TIM4CH1_CAPTURE_STA=0; //输入捕获状态
u8&&TIM4CH2_CAPTURE_STA=0;
u8&&TIM4CH3_CAPTURE_STA=0;
u8&&TIM4CH4_CAPTURE_STA=0;
u16 TIM4CH1_CAPTURE_VAL; //高电平值捕获值
u16 TIM4CH2_CAPTURE_VAL;
u16 TIM4CH3_CAPTURE_VAL;
u16 TIM4CH4_CAPTURE_VAL;
u16 TIM4CH1_U_CAPTURE_VAL; //上升沿捕获当前值
u16 TIM4CH2_U_CAPTURE_VAL;
u16 TIM4CH3_U_CAPTURE_VAL;
u16 TIM4CH4_U_CAPTURE_VAL;
u16 TIM4CH1_D_CAPTURE_VAL; //下降沿捕获当前值
u16 TIM4CH2_D_CAPTURE_VAL;
u16 TIM4CH3_D_CAPTURE_VAL;
u16 TIM4CH4_D_CAPTURE_VAL;&
//定时器4中断服务程序 &
void&TIM4_IRQHandler(void)
{&
tsr=TIM4-&SR;
&&if((TIM4CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
if(tsr&0X01)//溢出
if(TIM4CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
if((TIM4CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
TIM4CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM4CH1_CAPTURE_VAL=0XFFFF;
}else&TIM4CH1_CAPTURE_STA++;
if(tsr&0x02)//捕获1发生捕获事件
if(TIM4CH1_CAPTURE_STA&0X40)
//捕获到一个下降沿&
TIM4CH1_CAPTURE_STA|=0X80;
//标记成功捕获到一次高电平脉宽
&&&&TIM4CH1_D_CAPTURE_VAL=TIM4-&CCR1; //获取当前下降沿的捕获值
TIM4CH1_CAPTURE_VAL=TIM4CH1_D_CAPTURE_VAL-TIM4CH1_U_CAPTURE_VAL;&&//获取高电平时间
TIM4-&CCER&=~(1&&1);
//CC1P=0&设置为上升沿捕获
//还未开始,第一次捕获上升沿
TIM4CH1_CAPTURE_STA=0;
TIM4CH1_CAPTURE_STA|=0X40;
//标记捕获到了上升沿
TIM4CH1_U_CAPTURE_VAL=TIM4-&CCR1;
//获取当前上升沿的值
TIM4-&CCER|=1&&1;&
//CC1P=1&设置为下降沿捕获
&&&&& &&&&
&&
&&if((TIM4CH2_CAPTURE_STA&0X80)==0)//还未成功捕获
if(tsr&0X01)//溢出
if(TIM4CH2_CAPTURE_STA&0X40)//已经捕获到高电平了
if((TIM4CH2_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
TIM4CH2_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM4CH2_CAPTURE_VAL=0XFFFF;
}else&TIM4CH2_CAPTURE_STA++;
if(tsr&0x04)//捕获2发生捕获事件
if(TIM4CH2_CAPTURE_STA&0X40)
//捕获到一个下降沿&
TIM4CH2_CAPTURE_STA|=0X80;
//标记成功捕获到一次高电平脉宽
&&&&TIM4CH2_D_CAPTURE_VAL=TIM4-&CCR2; //获取当前下降沿的捕获值
TIM4CH2_CAPTURE_VAL=TIM4CH2_D_CAPTURE_VAL-TIM4CH2_U_CAPTURE_VAL;&&//获取高电平时间
TIM4-&CCER&=~(1&&5);
//CC2P=0&设置为上升沿捕获
//还未开始,第一次捕获上升沿
TIM4CH2_CAPTURE_STA=0;
TIM4CH2_CAPTURE_STA|=0X40;
//标记捕获到了上升沿
TIM4CH2_U_CAPTURE_VAL=TIM4-&CCR2; //获取当前上升沿的捕获值
TIM4-&CCER|=1&&5;&
//CC2P=1&设置为下降沿捕获
&&&&& &&&&
&&
&&if((TIM4CH3_CAPTURE_STA&0X80)==0)//还未成功捕获
if(tsr&0X01)//溢出
if(TIM4CH3_CAPTURE_STA&0X40)//已经捕获到高电平了
if((TIM4CH3_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
TIM4CH3_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM4CH3_CAPTURE_VAL=0XFFFF;
}else&TIM4CH3_CAPTURE_STA++;
if(tsr&0x08)//捕获3发生捕获事件
if(TIM4CH3_CAPTURE_STA&0X40)
//捕获到一个下降沿&
TIM4CH3_CAPTURE_STA|=0X80;
//标记成功捕获到一次高电平脉宽
&&&&TIM4CH3_D_CAPTURE_VAL=TIM4-&CCR3; //获取当前下降沿的捕获值
TIM4CH3_CAPTURE_VAL=TIM4CH3_D_CAPTURE_VAL-TIM4CH3_U_CAPTURE_VAL;&&//获取高电平时间
TIM4-&CCER&=~(1&&9);
//CC3P=0&设置为上升沿捕获
//还未开始,第一次捕获上升沿
TIM4CH3_CAPTURE_STA=0;
TIM4CH3_CAPTURE_STA|=0X40;
//标记捕获到了上升沿
TIM4CH3_U_CAPTURE_VAL=TIM4-&CCR3; //获取当前上降沿的捕获值
TIM4-&CCER|=1&&9;&
//CC3P=1&设置为下降沿捕获
&&&&& &&&&
&&
&&if((TIM4CH4_CAPTURE_STA&0X80)==0)//还未成功捕获
if(tsr&0X01)//溢出
if(TIM4CH4_CAPTURE_STA&0X40)//已经捕获到高电平了
if((TIM4CH4_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
TIM4CH4_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM4CH4_CAPTURE_VAL=0XFFFF;
}else&TIM4CH4_CAPTURE_STA++;
if(tsr&0x10)//捕获4发生捕获事件
if(TIM4CH4_CAPTURE_STA&0X40)
//捕获到一个下降沿&
TIM4CH4_CAPTURE_STA|=0X80;
//标记成功捕获到一次高电平脉宽
&&&&TIM4CH4_D_CAPTURE_VAL=TIM4-&CCR4; //获取当前下降沿的捕获值
TIM4CH4_CAPTURE_VAL=TIM4CH4_D_CAPTURE_VAL-TIM4CH4_U_CAPTURE_VAL;&&//获取高电平时间
TIM4-&CCER&=~(1&&13);
//CC4P=0&设置为上升沿捕获
//还未开始,第一次捕获上升沿
TIM4CH4_CAPTURE_STA=0;
TIM4CH4_CAPTURE_STA|=0X40;
//标记捕获到了上升沿
TIM4CH4_U_CAPTURE_VAL=TIM4-&CCR4; //获取当前上升沿的捕获值
TIM4-&CCER|=1&&13;&
//CC4P=1&设置为下降沿捕获
&&&&& &&&&
TIM4-&SR=0;//清除中断标志位
}
主题帖子精华
在线时间343 小时
55dc30c5ebf32.jpg (0 Bytes, 下载次数: 0)
22:54 上传
你这代码有问题的,上面是我画的一个简图。
以一个通道为例,CCRx为某个通道的输入捕获值寄存器,CCRx1和CCRx2代表2个不同时刻的捕获值。
1,假设CCRx1是上升沿的捕获值,CCRx2是随后的下降沿捕获值。那么高电平脉宽就是:ARR-CCRx1+CCRx2.
2,假设CCRx1是下降沿捕获值,CCRx2是上升沿捕获的值,那么高电平脉宽就是:ARR-CCRx2+CCRx1.
以上是假设两次捕获之间的时间,不超过CNT的一次溢出时间,当然你前面提到,你的高电平脉宽不会超过1次CNT的溢出时间。那么只要考虑上面两种情况就可以了。
如果要考虑溢出,情况就会复杂一点,请自行分析。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 75, 距离下一级还需 125 积分
在线时间0 小时
回复【20楼】正点原子:
---------------------------------
原子哥,我弄出来了,我没有设捕获标志位,而是像下面这样弄的
&&&&&&&&u16&
tsr=TIM4-&SR;
if(tsr&0x02)//捕获1发生捕获事件
&&& &TIM4-&SR&=~(1&&1);&//清出中断标志位
&if(PB6_IN)&&//输入脚电平
&&& &TIM4-&CCER|=1&&1;//当前为上升沿,设置下次采样为下降沿
&TIM4CH1_U_CAPTURE_VAL=TIM4-&CCR1;
&&& &TIM4-&CCER&=~(1&&1);//当前为下降沿,设置下次采样为上升沿
&TIM4CH1_D_CAPTURE_VAL=TIM4-&CCR1;
&if(TIM4CH1_D_CAPTURE_VAL&TIM4CH1_U_CAPTURE_VAL)
&&TIM4CH1_CAPTURE_VAL=(TIM4CH1_D_CAPTURE_VAL-TIM4CH1_U_CAPTURE_VAL);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&TIM4CH1_CAPTURE_VAL=((0xffff-TIM4CH1_U_CAPTURE_VAL)+TIM4CH1_D_CAPTURE_VAL);
&temp1=TIM4CH1_CAPTURE_VAL;
&&&}
程序用jink仿真结果正常,但就是用串口打印不出结果,谢谢原子哥的指点,太感谢了。
主题帖子精华
中级会员, 积分 456, 距离下一级还需 44 积分
在线时间13 小时
回复【21楼】sunky@feeling:
---------------------------------
哥们,你的程序弄好了吗?正好我在学习多通道捕获,几个定时器的通道工作回了,但是一个定时器的多通道还不会,搞了几天了!不知道你的源码能分享一下吗?
主题帖子精华
中级会员, 积分 456, 距离下一级还需 44 积分
在线时间13 小时
回复【21楼】sunky@feeling:
---------------------------------
就是不用考虑溢出不设置标志变量,那主函数里面如何判断已经捕获了呢?如何再次开启下一次的捕获?
主题帖子精华
初级会员, 积分 153, 距离下一级还需 47 积分
在线时间7 小时
回复【20楼】正点原子:
---------------------------------
原子哥,我在做那个输入捕获试验时,设置计数器TIM2_Cap_Init(0XFFFF,7); //以1MHZ的频率计数,我是默认用系统内部时钟的,为什么改变这个psc预分频值的时候,最后
if(TIM2CH1_CAPTURE_STA&0X80)
temp=TIM2CH1_CAPTURE_STA&0X3F;
temp*=65536;
//溢出时间总和
temp+=TIM2CH1_CAPTURE_VAL; //得到总的低电平时间
//
printf(&周期:%d&us\r\n&,temp); //打印总的低电平时间
TIM2CH1_CAPTURE_STA=0;
//开启下一次捕获
这里的temp根本不变呢?就好像计数器的计数频率没有改变一样,这是为什么,可能是哪里配置错误了么?
这是我按照教程配置的TIM2时钟捕获
//定时器2通道1输入捕获配置
//arr:自动重装值
//psc:时钟预分频数
void&TIM2_Cap_Init(u16&arr,u16&psc)
&//刚开始配置成捕获低电平脉宽
{
RCC-&APB1ENR|=1&&0;//TIM2时钟使能
RCC-&APB2ENR|=1&&2; //使能PORTA时钟
GPIOA-&CRL&=0XFFFFFFF0; //初始化PA0;
GPIOA-&CRL|=0X; //配置PA0为输入
GPIOA-&ODR|=1&&0; //PA0上拉输入&&因为是下降沿捕获
TIM2-&ARR= //设定计数器自动重装值
TIM2-&gtSC= //预分频器
TIM2-&CCMR1|=1&&0; //CC1S=01&选择输入端IC1映射到TI1上
TIM2-&CCMR1&=0XFF0F; //IC1F=0000&配置输入滤波器&不滤波
TIM2-&CCMR1&=0XFFF3; //IC1PS=00&配置输入分频,不分频
TIM2-&CCER|=1&&1; //CC1P=1&&下降沿捕获
TIM2-&CCER|=1&&0; //CC1E=1&允许捕获计数器的值到捕获寄存器中
TIM2-&DIER|=1&&1; //允许捕获中断
TIM2-&DIER|=1&&0; //允许更新中断
TIM2-&CR1|=0x01; //使能定时器2
MY_NVIC_Init(2,0,TIM2_IRQn,2); //抢占2,子优先级0,组2
}
新手菜鸟,还望原子哥帮忙解答一下
主题帖子精华
在线时间343 小时
回复【24楼】whut-showming:
---------------------------------
具体代码在哪里改的?
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 153, 距离下一级还需 47 积分
在线时间7 小时
回复【25楼】正点原子:
---------------------------------
哦,就是根据原子那个开发指南的第十五个实验——输入捕获,改的。因为我用的是STM32F103C8没有TIM5定时器,就全部改为TIM2了,其他的没怎么改。
主题帖子精华
初级会员, 积分 153, 距离下一级还需 47 积分
在线时间7 小时
回复【25楼】正点原子:
---------------------------------
回复【25楼】正点原子:
---------------------------------
哦,对了,原子哥,我昨天找了一个帖子,上面说:按照ST手册说明(见前面引用说明,原文参考英文版页313/679,页/524中文),STM32各定时器不但对外计数有预分频功能,对外捕获也有预分频功能(Ti1~4输入口)。对外计数预分频功能正常,而捕获预分频无效(怎么设置都是一分频),这就是我要说的。大家可以测试ST提供的一个捕获例子,见目录内的..TIMPWM_Input内的例子,此例给的是一分频,可以将分频因子修改测试,见前面所述。
这是帖子的网址:/bbsview-32048.htm&&你看是不是这样呢?
主题帖子精华
初级会员, 积分 153, 距离下一级还需 47 积分
在线时间7 小时
回复【25楼】正点原子:
---------------------------------
原子大哥,再请教一个问题,STM32的输入捕获,一定要把那个捕获端口配置为上下拉模式吗?配置成浮空输入行吗?
主题帖子精华
在线时间343 小时
回复【28楼】whut-showming:
---------------------------------
应该是可以的.
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
新手上路, 积分 46, 距离下一级还需 4 积分
在线时间0 小时
回复【28楼】whut-showming:
---------------------------------
哥们,能把原子哥关于捕获的例程发给我吗,我邮箱,谢谢了
Powered by

我要回帖

更多关于 stm32 pwm输入捕获 的文章

 

随机推荐