找回密码
 立即注册
查看: 906|回复: 54

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

[复制链接]
  • TA的每日心情
    开心
    昨天 07:54
  • 签到天数: 157 天

    [LV.7]常住居民III

    67

    主题

    836

    回帖

    2776

    积分

    金牌会员

    积分
    2776
    发表于 2024-1-12 12:38:35 | 显示全部楼层 |阅读模式
    本帖最后由 xxkj2010 于 2024-1-12 12:56 编辑

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


    主程序:
    1. /*******************************************************************************
    2. 实验:简易频率计
    3. 单片机:STC8H1K17T
    4. IRC频率:24MHz
    5. 2024.1.12
    6. *******************************************************************************/
    7. #include "STC8Hxxx.h"
    8. #include <intrins.h>
    9. #include <stdio.h>
    10. #include "config.h"
    11. #include "delay.h"
    12. bit fBusy;                           
    13. bit B_FrequencyOk = 0;
    14. u8 freq_H;
    15. u32 frequency;
    16. #define LED P54 // LED
    17. /*******************************************************************************
    18. *******************************************************************************/
    19. void UartInit(); // 串口、定时器初始化
    20. void main()
    21. {
    22.         fBusy = 0;
    23.         delay_ms(15); // 等待稳定
    24.         UartInit();          // 串口、定时器初始化
    25.         while (1)
    26.         {
    27.                 if (B_FrequencyOk)
    28.                 {
    29.                         printf("频率:%ld", frequency);
    30.                         B_FrequencyOk = 0;
    31.                         LED = ~LED;                 // 测试端口
    32.                         PWMB_CR1 = 0x01;
    33.                         PWMB_IER = 0x01;
    34.                         TR1 = 1;
    35.                 }
    36.         }
    37. }
    38. void UartInit() // 串口及定时器初始化
    39. {
    40.         P0M0 = 0x00;
    41.         P0M1 = 0x00;
    42.         P1M0 = 0x00;
    43.         P1M1 = 0x00;
    44.         P2M0 = 0x00;
    45.         P2M1 = 0x00;
    46.         P3M0 = 0x01;
    47.         P3M1 = 0x00;
    48.         P5M0 = 0x10;
    49.         P5M1 = 0x00;
    50.         P_SW2 |= 0x80; // 使能访问XFR
    51.         // 串口设置
    52.         T2L = BAUD;
    53.         T2H = BAUD >> 8;
    54.         AUXR = 0x15;
    55.         SCON = 0x50;
    56.         ES = 1;
    57.         TR1 = 0;                  
    58.         AUXR |= (1 << 6); // 1T
    59.         TMOD |= (1 << 6);
    60.         TL1 = 0;                  
    61.         TH1 = 0;                  
    62.         // TF1 = 0;                        
    63.         ET1 = 1;
    64.         TR1 = 1;
    65.         EA = 1;        
    66.         // PWMB 设置
    67.         PWMB_PSCR = 24000 - 1;
    68.         PWMB_ARR = 1000;           
    69.         PWMB_IER = 0x01;           
    70.         PWMB_CR1 = 0x01;           
    71. }
    72. void PWMB_Isr() interrupt 27
    73. {
    74.         if (PWMB_SR1 & 0x01)
    75.         {
    76.                 frequency = ((u32)freq_H << 16) + ((u32)TH1 << 8) + (u32)TL1;
    77.                 PWMB_CR1 = 0x00;   
    78.                 PWMB_IER = 0x00;   
    79.                 PWMB_SR1 &= ~0x01;
    80.                 PWMB_CNTR = 0;
    81.                 TR1 = 0;
    82.                 freq_H = 0;
    83.                 TH1 = 0;
    84.                 TL1 = 0;
    85.                 B_FrequencyOk = 1;
    86.         }
    87. }
    88. void Timer1_Isr(void) interrupt 3
    89. {
    90.         freq_H++;
    91. }
    92. char putchar(char dat)
    93. {
    94.         while (fBusy)
    95.                 ;
    96.         fBusy = 1;
    97.         SBUF = dat;
    98.         return dat;
    99. }
    100. void uart_isr() interrupt 4
    101. {
    102.         if (TI)
    103.         {
    104.                 TI = 0;
    105.                 fBusy = 0;
    106.         }
    107.         if (RI)
    108.         {
    109.                 RI = 0;
    110.         }
    111. }
    复制代码
    测试结果:
    01.jpg





    2024-01-12简易频率计.mp4

    99.9 KB, 下载次数: 7

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 07:54
  • 签到天数: 157 天

    [LV.7]常住居民III

    67

    主题

    836

    回帖

    2776

    积分

    金牌会员

    积分
    2776
     楼主| 发表于 2024-1-12 13:39:17 | 显示全部楼层
    请问各位大佬,用这种方法测频率,单片机主频率24MHz,一般最大可以测多大频率的脉冲?

    点评

    24MHz主频,可以测量最高频率为略小于12MHz的方波。  详情 回复 发表于 2024-1-12 18:19
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 06:50
  • 签到天数: 157 天

    [LV.7]常住居民III

    17

    主题

    370

    回帖

    1301

    积分

    荣誉版主

    积分
    1301
    发表于 2024-1-12 15:29:08 | 显示全部楼层
    可测6MHZ的脉冲,最好用外部晶振,有条件上温补晶振。
    不过,最小频率要1HZ才有意义。

    点评

    定时器每个主频周期检测一次是否有计数,所以最高测频略小于主频一半的方波,即略小于12MHz。  详情 回复 发表于 2024-1-12 18:21
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9297

    回帖

    1万

    积分

    管理员

    积分
    14043
    发表于 2024-1-12 15:47:05 | 显示全部楼层
    STC8H1K08T, STC8H2K08U 系列的 PWM
    ===可以用 PLL-144MHz的时钟【64MHz ~ 192MHz】
    ===测量 占空比 50% 的方波,理论极限可以到 72MHz 附近,所以测方波 24MHz 以下就小儿科了



    截图202401121546192953.jpg


    截图202401121547005713.jpg


    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9297

    回帖

    1万

    积分

    管理员

    积分
    14043
    发表于 2024-1-12 15:48:43 | 显示全部楼层
    截图202401121548404369.jpg
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    551

    主题

    9297

    回帖

    1万

    积分

    管理员

    积分
    14043
    发表于 2024-1-12 15:54:18 | 显示全部楼层
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 07:54
  • 签到天数: 157 天

    [LV.7]常住居民III

    67

    主题

    836

    回帖

    2776

    积分

    金牌会员

    积分
    2776
     楼主| 发表于 2024-1-12 17:41:26 | 显示全部楼层
    神农鼎 发表于 2024-1-12 15:47
    STC8H1K08T, STC8H2K08U 系列的 PWM
    ===可以用 PLL-144MHz的时钟【64MHz ~ 192MHz】
    ===测量 占空比 50%  ...

    意思是用STC32的PWM的捕捉功能来测频率,可以测得更高的频率?
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2932

    回帖

    6609

    积分

    超级版主

    积分
    6609
    发表于 2024-1-12 18:19:54 | 显示全部楼层
    xxkj2010 发表于 2024-1-12 13:39
    请问各位大佬,用这种方法测频率,单片机主频率24MHz,一般最大可以测多大频率的脉冲? ...

    24MHz主频,可以测量最高频率为略小于12MHz的方波。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2932

    回帖

    6609

    积分

    超级版主

    积分
    6609
    发表于 2024-1-12 18:21:14 | 显示全部楼层
    社区闲人 发表于 2024-1-12 15:29
    可测6MHZ的脉冲,最好用外部晶振,有条件上温补晶振。
    不过,最小频率要1HZ才有意义。 ...

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 07:54
  • 签到天数: 157 天

    [LV.7]常住居民III

    67

    主题

    836

    回帖

    2776

    积分

    金牌会员

    积分
    2776
     楼主| 发表于 2024-1-12 18:42:47 | 显示全部楼层
    神农鼎 发表于 2024-1-12 15:47
    STC8H1K08T, STC8H2K08U 系列的 PWM
    ===可以用 PLL-144MHz的时钟【64MHz ~ 192MHz】
    ===测量 占空比 50%  ...

    请问STC8H8K64U的PWM时钟就无法达到64MHz ~ 192MHz吧?
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-3 01:52 , Processed in 0.083240 second(s), 69 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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