xxkj2010 发表于 2024-1-12 12:38:35

STC8H1K17T-TSSOP20系列实验之五----简易频率计

本帖最后由 xxkj2010 于 2024-1-12 12:56 编辑

在梁工的大力支持和帮助下,完成了用STC8H1K17T对RT8025的32.768K信号进行测频实验(测得的结果由串口输出到电脑),代码和实现思路基本上参考了梁工的STC32虚拟示波器的例程,在此再次感谢梁工!
也想抛砖引玉一下,希望得到各位大佬的指教,谢谢!


主程序:
/*******************************************************************************
实验:简易频率计
单片机:STC8H1K17T
IRC频率:24MHz
2024.1.12
*******************************************************************************/
#include "STC8Hxxx.h"
#include <intrins.h>
#include <stdio.h>
#include "config.h"
#include "delay.h"
bit fBusy;                           
bit B_FrequencyOk = 0;
u8 freq_H;
u32 frequency;
#define LED P54 // LED

/*******************************************************************************
*******************************************************************************/
void UartInit(); // 串口、定时器初始化

void main()
{
      fBusy = 0;
      delay_ms(15); // 等待稳定
      UartInit();          // 串口、定时器初始化
      while (1)
      {
                if (B_FrequencyOk)
                {
                        printf("频率:%ld", frequency);
                        B_FrequencyOk = 0;
                        LED = ~LED;               // 测试端口
                        PWMB_CR1 = 0x01;
                        PWMB_IER = 0x01;
                        TR1 = 1;
                }
      }
}

void UartInit() // 串口及定时器初始化
{
      P0M0 = 0x00;
      P0M1 = 0x00;
      P1M0 = 0x00;
      P1M1 = 0x00;
      P2M0 = 0x00;
      P2M1 = 0x00;
      P3M0 = 0x01;
      P3M1 = 0x00;
      P5M0 = 0x10;
      P5M1 = 0x00;
      P_SW2 |= 0x80; // 使能访问XFR

      // 串口设置
      T2L = BAUD;
      T2H = BAUD >> 8;
      AUXR = 0x15;
      SCON = 0x50;
      ES = 1;

      TR1 = 0;                  
      AUXR |= (1 << 6); // 1T
      TMOD |= (1 << 6);
      TL1 = 0;                  
      TH1 = 0;                  
      // TF1 = 0;                        
      ET1 = 1;
      TR1 = 1;
      EA = 1;      

      // PWMB 设置
      PWMB_PSCR = 24000 - 1;
      PWMB_ARR = 1000;         
      PWMB_IER = 0x01;         
      PWMB_CR1 = 0x01;         
}

void PWMB_Isr() interrupt 27
{
      if (PWMB_SR1 & 0x01)
      {
                frequency = ((u32)freq_H << 16) + ((u32)TH1 << 8) + (u32)TL1;
                PWMB_CR1 = 0x00;   
                PWMB_IER = 0x00;   
                PWMB_SR1 &= ~0x01;
                PWMB_CNTR = 0;
                TR1 = 0;
                freq_H = 0;
                TH1 = 0;
                TL1 = 0;
                B_FrequencyOk = 1;
      }
}

void Timer1_Isr(void) interrupt 3
{
      freq_H++;
}

char putchar(char dat)
{
      while (fBusy)
                ;
      fBusy = 1;
      SBUF = dat;

      return dat;
}

void uart_isr() interrupt 4
{
      if (TI)
      {
                TI = 0;
                fBusy = 0;
      }

      if (RI)
      {
                RI = 0;
      }
}
测试结果:






xxkj2010 发表于 2024-1-12 13:39:17

请问各位大佬,用这种方法测频率,单片机主频率24MHz,一般最大可以测多大频率的脉冲?

社区闲人 发表于 2024-1-12 15:29:08

可测6MHZ的脉冲,最好用外部晶振,有条件上温补晶振。
不过,最小频率要1HZ才有意义。

神农鼎 发表于 2024-1-12 15:47:05

STC8H1K08T, STC8H2K08U 系列的 PWM
===可以用 PLL-144MHz的时钟【64MHz ~ 192MHz】
===测量 占空比 50% 的方波,理论极限可以到 72MHz 附近,所以测方波 24MHz 以下就小儿科了








神农鼎 发表于 2024-1-12 15:48:43


神农鼎 发表于 2024-1-12 15:54:18



https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=1360&pid=17769

xxkj2010 发表于 2024-1-12 17:41:26

神农鼎 发表于 2024-1-12 15:47
STC8H1K08T, STC8H2K08U 系列的 PWM
===可以用 PLL-144MHz的时钟【64MHz ~ 192MHz】
===测量 占空比 50%...
意思是用STC32的PWM的捕捉功能来测频率,可以测得更高的频率?

梁工 发表于 2024-1-12 18:19:54

xxkj2010 发表于 2024-1-12 13:39
请问各位大佬,用这种方法测频率,单片机主频率24MHz,一般最大可以测多大频率的脉冲? ...

24MHz主频,可以测量最高频率为略小于12MHz的方波。

梁工 发表于 2024-1-12 18:21:14

社区闲人 发表于 2024-1-12 15:29
可测6MHZ的脉冲,最好用外部晶振,有条件上温补晶振。
不过,最小频率要1HZ才有意义。 ...

定时器每个主频周期检测一次是否有计数,所以最高测频略小于主频一半的方波,即略小于12MHz。

xxkj2010 发表于 2024-1-12 18:42:47

神农鼎 发表于 2024-1-12 15:47
STC8H1K08T, STC8H2K08U 系列的 PWM
===可以用 PLL-144MHz的时钟【64MHz ~ 192MHz】
===测量 占空比 50%...

请问STC8H8K64U的PWM时钟就无法达到64MHz ~ 192MHz吧?
页: [1] 2 3 4 5 6
查看完整版本: STC8H1K17T-TSSOP20系列实验之五----简易频率计