找回密码
 立即注册
楼主: ahong

STC8H8K64U的P2.0脚可以用PWM捕获功能做频率计吗

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-1-12 09:15:02 | 显示全部楼层
xxkj*** 发表于 2024-1-12 08:25
有呀,发现IO可能有问题,就用STC-ISP中的IO测试程序直接烧到芯片中进行测试,但是结果还是不太稳定,P33 ...

这样情况,IO没有问题的。如果IO有问题,会一直有问题,不会“有时”出问题的。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-05-02 09:38:13

109

主题

1900

回帖

5214

积分

论坛元老

积分
5214
发表于 2024-1-12 10:11:40 | 显示全部楼层
梁*** 发表于 2024-1-12 09:15
这样情况,IO没有问题的。如果IO有问题,会一直有问题,不会“有时”出问题的。 ...

大佬,很惭愧,我还是弄不出频率计
  1. TR1 = 0;                                //定时器1停止计时
  2. AUXR |=  (1<<6);// 1T
  3. //TMOD  = (TMOD & ~0x30) | 0x10;        // 16位
  4. TMOD |=  (1<<6);                // 定时器1用做计数器
  5. //TMOD |=  (1<<7);                // 定时器1由外部INT1高电平允许定时计数
  6. TL1 = 0;                                //设置定时初始值
  7. TH1 = 0;                                //设置定时初始值
  8. //TF1 = 0;                                //清除TF1标志
  9. ET1 = 1        ;                        // 允许Timer1中断
  10. TR1 = 1;                                //定时器1开始计时
  11. EA=1;//
  12. void Timer1_Isr(void) interrupt 3
  13. {
  14.         freq_H++;       
  15. }
  16. void INT1_Isr() interrupt 2
  17. {
  18.                 frequency = ((u32)freq_H << 16) + ((u32)TH1 << 8) + (u32)TL1;
  19.         freq_H = 0;        TH1 = 0;        TL1 = 0;
  20.         B_FrequencyOk = 1;
  21. }
复制代码
串口打印结果:
01.jpg

点评

测频(频率计)是非常简单的操作,请重新说明你的要求,我写一个给你: 主频多少?那个IO输入?秒定时怎么来?哪个串口哪对IO返回?  详情 回复 发表于 2024-1-12 10:55
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-1-12 10:55:43 | 显示全部楼层
xxkj*** 发表于 2024-1-12 10:11
大佬,很惭愧,我还是弄不出频率计
串口打印结果:

测频(频率计)是非常简单的操作,请重新说明你的要求,我写一个给你:
主频多少?那个IO输入?秒定时怎么来?哪个串口哪对IO返回?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-05-02 09:38:13

109

主题

1900

回帖

5214

积分

论坛元老

积分
5214
发表于 2024-1-12 11:15:42 | 显示全部楼层
本帖最后由 xxkj2010 于 2024-1-12 11:17 编辑

直接在PWMB中断的时候对定时器1接收到的脉冲进行累计,省了用外部中断1,这样会产生多大的误差?



01.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-05-02 09:38:13

109

主题

1900

回帖

5214

积分

论坛元老

积分
5214
发表于 2024-1-12 11:18:52 | 显示全部楼层
梁*** 发表于 2024-1-12 10:55
测频(频率计)是非常简单的操作,请重新说明你的要求,我写一个给你:
主频多少?那个IO输入?秒定时怎 ...

现在可以实现了,但是不知道我现在采用的方式会产生多大的误差。谢谢你的帮助!

点评

误差是你的时钟误差+1LSB,计数器本身不会引入误差。 比如我使用一个很精确的时钟(压控调整+恒温+北斗模块校准),测频率就可以做到0.01PPM+1个字。  详情 回复 发表于 2024-1-12 13:15
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-05-02 09:38:13

109

主题

1900

回帖

5214

积分

论坛元老

积分
5214
发表于 2024-1-12 11:23:42 | 显示全部楼层
本帖最后由 xxkj2010 于 2024-1-12 11:29 编辑
梁*** 发表于 2024-1-12 10:55
测频(频率计)是非常简单的操作,请重新说明你的要求,我写一个给你:
主频多少?那个IO输入?秒定时怎 ...

请问PWMB进行计数时,它的计数器寄存器是不是PWMB_CNTR?我想在产生PWMB中断时把它清零一下。
另外,单片机主频率24MHz,一般最大可以测多大频率的脉冲?

点评

PWMB的计数器是PWMB_CNTR。 你要清除的话,要注意时刻。设置周期后,计数值等于周期值,就会自动归0,不需要清除的,否则会出现误差。  详情 回复 发表于 2024-1-12 13:12
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-1-12 13:12:58 | 显示全部楼层
xxkj*** 发表于 2024-1-12 11:23
请问PWMB进行计数时,它的计数器寄存器是不是PWMB_CNTR?我想在产生PWMB中断时把它清零一下。
另外,单片 ...

PWMB的计数器是PWMB_CNTR。
你要清除的话,要注意时刻。设置周期后,计数值等于周期值,就会自动归0,不需要清除的,否则会出现误差。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-1-12 13:15:24 | 显示全部楼层
xxkj*** 发表于 2024-1-12 11:18
现在可以实现了,但是不知道我现在采用的方式会产生多大的误差。谢谢你的帮助! ...

误差是你的时钟误差+1LSB,计数器本身不会引入误差。
比如我使用一个很精确的时钟(压控调整+恒温+北斗模块校准),测频率就可以做到0.01PPM+1个字。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-05-02 09:38:13

109

主题

1900

回帖

5214

积分

论坛元老

积分
5214
发表于 2024-1-12 13:28:32 | 显示全部楼层
梁*** 发表于 2024-1-12 13:12
PWMB的计数器是PWMB_CNTR。
你要清除的话,要注意时刻。设置周期后,计数值等于周期值,就会自动归0,不 ...

我以为在PWM中断中运行下面代码的时候,PWM会自动再次计数,从而产生误差

        frequency = ((u32)freq_H << 16) + ((u32)TH1 << 8) + (u32)TL1;                        
        freq_H = 0;        TH1 = 0;        TL1 = 0;
        B_FrequencyOk = 1;        
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:521
  • 最近打卡:2025-05-02 09:38:13

109

主题

1900

回帖

5214

积分

论坛元老

积分
5214
发表于 2024-1-12 13:31:11 | 显示全部楼层
本帖最后由 xxkj2010 于 2024-1-12 21:02 编辑
梁*** 发表于 2024-1-12 13:15
误差是你的时钟误差+1LSB,计数器本身不会引入误差。
比如我使用一个很精确的时钟(压控调整+恒温+北斗模 ...

我有空弄个普通晶振上去,看它测得的数据是否相对稳定些,现在测RX8025的32.768KHz信号 都有20Hz左右的波动。

点评

用MCU内部时钟测量32.768KHz信号,20Hz抖动(或误差)对应的是0.06%,而0.1%都在正常范围内。 如果使用外部晶振,抖动不会超过1个字,这个字还不是抖动造成,而是时钟相位造成。可以用10秒的阈值来测频,这样误差在0  详情 回复 发表于 2024-1-12 13:44
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 12:49 , Processed in 0.178392 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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