当前位置:首页 > 单片机 > 单片机
[导读] 最近在用STM8的过程中需要用到一个频率检测的功能,还好STM8S207的定时器中自带有输入捕获功能,之前还想着用定时器计数方式来实现的,但既然人家提供了该功能,那就试试吧,由于硬件里面接的是PC1引脚就只看了Time

 最近在用STM8的过程中需要用到一个频率检测的功能,还好STM8S207的定时器中自带有输入捕获功能,之前还想着用定时器计数方式来实现的,但既然人家提供了该功能,那就试试吧,由于硬件里面接的是PC1引脚就只看了Timer1,其他的定时器应该也是类似的,看了资料之后发现STM8的输入捕获其实与STC12C5A60S2中的PCA捕获模式很类似,但是看资料没有后者清晰易懂。。。


在捕获模式中,基本上只用到了读进程,在STM8中有一个影子寄存器,但对于我们来说是看不到的,我们仅操作预装载寄存器即可。而且需要注意的是无论是计数器还是捕获/比较寄存器都是先读/写高8位,后读/写低8位数据。

在文档中给出了一个输入捕获模式的流程


[cpp] view plain copyTIM1_CCER1 &= (unsigned char)~0x02;//上升沿或者高电平触发

最后使能捕获功能,设置TIM1_CCER1寄存器的CC1E位=1,由于我们采用中断方式因此也将TIM1_IER寄存器的CC1IE位置1,允许中断请求。

完整的初始化代码如下

[cpp] view plain copyvoid signal_capture_Init(void)

{

TIM1_CNTRH = 0x00;//清零计数器高8位

TIM1_CNTRL = 0x00;//清零计数器低8位

TIM1_PSCRH = 0x00;//计数器时钟分频高8位

TIM1_PSCRL = 0x10;//计数器时钟分频低8位16分频

TIM1_CCER1 &= (unsigned char)~0x01;//清零TIM1_CCER1中的CC1E位,之后才可配置TIM1_CCMR1

TIM1_CCMR1 = 0x01;//配置TIM1_CCMR1中的CC1S位为1,CC1通道配置为输入,IC1映射到TI1FP1上

//无滤波器、无预分频器(捕获输入口上检测到的每一个边沿都触发一次捕获)

TIM1_CCER1 &= (unsigned char)~0x02;//上升沿或者高电平触发

TIM1_IER |= 0x02;//CC1IE=1,使能捕获/比较1中断

TIM1_CCER1 |= 0x01;//捕获使能

TIM1_CR1 |= 0x01;//使能定时/计数器

}

当发生一个输入捕获时,计数器的值被传送到TIM1_CCR1寄存器中,计时器的时钟源在程序中我们设置为16分频


分频过后计数器的频率为1MHz,这里采用分频主要是避免计数器溢出,这样同时也降低了精度,同时设置计数器的初值为0,计数器默认计数方式是向上计数,计到最大值后又从0开始计数,

中断处理代码如下

[cpp] view plain copy@far @interrupt void signal_capture_irq (void)

{

if(TIM1_SR1&0x02)

{

TIM1_SR1 &= (unsigned char)~0x02;//清除CC1IF标志

if(vsync_cap_data_old == 0x00)

{//第一次捕获中断来临

vsync_cap_data_old = TIM1_CCR1H;//先读取高8位数据

vsync_cap_data_old = (unsigned int)(vsync_cap_data_old<<8) + TIM1_CCR1L;//再读取低8位数据

}

else

{

//第二次捕获中断来临

vsync_cap_data_new = TIM1_CCR1H;//先读取高8位数据

vsync_cap_data_new = (unsigned int)(vsync_cap_data_new<<8) + TIM1_CCR1L;//再读取低8位数据

TIM1_IER &= (unsigned char)~0x02;//禁止通道1捕获/比较中断

TIM1_CR1 &= (unsigned char)~0x01;//停止计数器

if(vsync_cap_data_new > vsync_cap_data_old)

vsync_period = (vsync_cap_data_new - vsync_cap_data_old);

else

vsync_period = 0xFFFF + vsync_cap_data_new - vsync_cap_data_old;

vsync_cap_data_old = 0x00;

isCaptureOver = 1;

}

}

}

我们捕获两次中断计算时间差,

[cpp] view plain copyif(isCaptureOver)

{

//如果捕获完成则对数据进行处理

cmd_puts("period:");

cmd_hex((unsigned char)(vsync_period>>8));

cmd_hex((unsigned char)vsync_period);

TIM1_CNTRH = 0x00;//清零计数器高8位

TIM1_CNTRL = 0x00;//清零计数器低8位

TIM1_IER |= 0x02;//CC1IE=1,使能捕获/比较1中断

TIM1_CR1 |= 0x01;//使能定时/计数器

isCaptureOver = 0;

}

这里只从串口输出了周期,结果如下


可以看到周期在一个范围内波动我们取一个值0x79ED来计算,它所对应的频率f=1000000/0x79ED=32.0379Hz还是比较接近我们的实际输入频率30Hz,误差是大了些,可以通过代码继续改进

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

Holtek隆重推出全新一代32-bit Arm® Cortex®-M0+ 5V CAN MCU - HT32F53231/HT32F53241/HT32F53242/HT32F53252。这一系列单片机带有来自Bosc...

关键字: MCU 工业自动化 单片机

Holtek精益求精,宣布推出全新5V宽电压Arm® Cortex®-M0+ 32-bit MCU系列HT32F50431/HT32F50441/HT32F50442/HT32F50452。此系列MCU经多方位升级能满...

关键字: 单片机 智能家居 工业控制

单片机小精灵是一款针对单片机开发者的辅助工具,它集成了代码编辑、编译、调试等多项功能,旨在帮助开发者更加高效地进行单片机项目的开发。本文将详细介绍单片机小精灵的使用方法,帮助读者快速掌握这款工具,提高开发效率。

关键字: 单片机 代码编辑 辅助工具

电磁铁是一种利用电流产生磁场的装置,具有快速响应、易于控制等特点,在工业自动化、电子设备、科学实验等领域有着广泛的应用。STM32是一款功能强大的微控制器,具有高性能、低功耗、易于编程等优点,是控制电磁铁的理想选择。本文...

关键字: 电磁铁 微控制器 STM32

边缘人工智能的实现涉及到三个基本 要素:安全性,连接性、自主性,而其中自主性是AI能力的体现,也是边缘AI有别于其他传统的物联网的关键。而通过ST Edge AI套件,就可以帮助各种不同类型的开发者实现覆盖全硬件平台的全...

关键字: 边缘人工智能 AI STM32

单片机和PLC将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对二者的相关情况以及信息有所认识和了解,详细内容如下。

关键字: PLC 单片机

在这篇文章中,小编将对单片机的相关内容和情况加以介绍以帮助大家增进对单片机的了解程度,和小编一起来阅读以下内容吧。

关键字: 单片机 芯片 集成电路

一直以来,单片机都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来单片机的相关介绍,详细内容请看下文。

关键字: 单片机 控制器

今天,小编将在这篇文章中为大家带来STM32单片机最小系统的有关报道,通过阅读这篇文章,大家可以对它具备清晰的认识,主要内容如下。

关键字: 单片机 单片机最小系统 STM32

51单片机将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对51单片机的相关情况以及信息有所认识和了解,详细内容如下。

关键字: 单片机 51单片机
关闭
关闭