关于使用STM32单片机完成脉冲计数功能的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于使用STM32单片机完成脉冲计数功能的问题相关的知识,希望对你有一定的参考价值。
如题,想需要使用STM32单片机完成脉冲计数功能,被计数的脉冲是每隔50ms左右发送一组脉冲群,我需要记录这组脉冲群的频率和脉宽,脉冲群计数结束后隔50ms左右后再重新对下一组脉冲群进行计数。最好有个例程供参考,谢谢!
interrupt 外部中断ISR()定时器打开
T++;
interrupt 定时器中断()
关定时器;
time = 读取定时器值;
定时器初始化归零;
time 就是脉冲宽度;T就是脉冲数
具体实现就将我的汉字版翻译成你的C就行 参考技术A 用定时器计数,用中断就好,例程里有自己参考一下就好了。
关于STM32F103 脉冲计数的问题
//TIM2_CH2 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数 计数器功能
void TIM2_ETR_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO口设置
RCC->APB1ENR|=1<<0; //TIM2时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL &= 0XFFFFFF0F; //
GPIOA->CRL |= 0X00000080; //PA1下拉输入
GPIOA->ODR |= 0<<1;
TIM2->ARR=arr; //设定计数器自动重装值
TIM2->PSC=psc; //预分频器不分频
TIM2->CCMR1|=1<<8; //CC2S=01 选择输入端 IC1映射到TI2上
TIM2->CCMR1|=0<<12; //IC2F=0000 配置输入滤波器 以Fck_int采样
TIM2->CCMR1|=0<<10; //IC2PS=00 配置输入分频,不分频
TIM2->CCER |=0<<5; //CC2P=0 上升沿捕获
TIM2->SMCR |=0X07<<0; //SMS =111
TIM2->SMCR |=0X06<<4; //TS =110
TIM2->CR1 |= 0x01; //使能计数器1
}
首先我们要先明白,其实定时器就是在对时钟脉冲的计数的累加,因为定时器的每个时钟脉冲都是固定并且是可设置,那么当累加到一定程度的数值时候,再去乘以对应的脉冲宽度,就能计算出脉冲时间了。那么脉冲计数的道理跟这个一样,我们只需要将内部时钟源改为外部时钟,M3的外部时钟有两种模式1和模式2的区别在于极性选择和分频器,对于比较稳稳定并且连续的脉冲,建议选择ETR 触发;对于其他情况可以选择TIMX_CHX 捕获通道对脉冲进行捕获。
在STM32中文参考手册中,同样给出了配置步骤:
对于脉冲计数,我们不对采集到的脉冲进行计数,ARR重载寄存器的值配置为最大65535,否则计数器CNT一旦到达这个值就会从0开始。最终只需读取CNT的值就可以知道脉冲的个数了。
以上是关于关于使用STM32单片机完成脉冲计数功能的问题的主要内容,如果未能解决你的问题,请参考以下文章
STM32 TIM1 ETR计数外部脉冲数,怎么用中断方法实现?