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

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

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

109

主题

1900

回帖

5214

积分

论坛元老

积分
5214
发表于 2024-1-4 11:46:08 | 显示全部楼层
梁*** 发表于 2024-1-4 11:32
不是,频率计的计数是纯硬件完成的,中断不会导致误差。
造成误差的原因是使用的是内部时钟,秒级的间隔 ...

同一时刻同一环境,芯片内部的IRC振荡频率会漂移吗?

点评

秒级的间隔,抖动在0.1%~0.2%左右。  详情 回复 发表于 2024-1-4 12:10
回复 支持 反对

使用道具 举报 送花

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

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-1-4 12:09:38 | 显示全部楼层
本帖最后由 梁工 于 2024-1-4 12:15 编辑
xxkj*** 发表于 2024-1-4 11:44
恒温晶振一个近100元,那不如买个二手的频率计呢。频率计应该都用上恒温晶振吧? ...

便宜的频率计一般都是10ppm级别的精度。那些国外大牌子的不知道。

那不如买个二手的频率计呢”,这让我想起了一句话:造不如买,买不如租!这可就是当前光刻机、高端芯片等等的困境。
我这样提示,是想让人多学学技术。如果什么都去买,那没必要学电子技术了,因为对一般的玩电子的人来说,你想要的,这个世界基本都有了,某宝搜搜基本都能买到。比如一个红外遥控器,5毛钱就可以买一本,为什么要自己做?  所以,我觉得好多人红外遥控器、接收程序都做不好。
回复 支持 反对

使用道具 举报 送花

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

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-1-4 12:10:12 | 显示全部楼层
xxkj*** 发表于 2024-1-4 11:46
同一时刻同一环境,芯片内部的IRC振荡频率会漂移吗?

秒级的间隔,抖动在0.1%~0.2%左右。
回复 支持 反对

使用道具 举报 送花

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

109

主题

1900

回帖

5214

积分

论坛元老

积分
5214
发表于 2024-1-11 12:09:18 | 显示全部楼层
本帖最后由 xxkj2010 于 2024-1-11 12:10 编辑
梁*** 发表于 2024-1-3 14:37
做频率计,可以参考我的示波器的频率计:P3.5(T1)输入频率信号,P3.3是闸门信号。

大佬,没有你的水平,现在参考你的示波器代码,还是无法实现外部中断1(无法等到中断)
  1. //PWMB 设置        
  2.         PWMB_ENO    = 0;        // IO输出禁止
  3.         PWMB_IER    = 0;        // 禁止中断
  4.         PWMB_SR1    = 0;        // 清除状态
  5.         PWMB_SR2    = 0;        // 清除状态
  6.         ccer1 = 0;
  7.         ccer2 = 0;
  8.         PWMB_ISR_En = 0;
  9.         
  10.         PWMB_PSCRH = (u8)((24000-1)/256);                // 预分频寄存器, 分频 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 边沿对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)), 中央对齐PWM频率 = SYSclk/((PSCR+1)*(AAR+1)*2).
  11.         PWMB_PSCRL = (u8)((24000-1)%256);
  12.         PWMB_ARRH  = (u8)(1010/256);        // 自动重装载寄存器,  控制PWM周期
  13.         PWMB_ARRL  = (u8)(1010%256);
  14.         PWMB_CCMR3  = 0x68;                // 通道模式配置, PWM模式1, 预装载允许
  15.         PWMB_CCR3H  = (u8)(1000/256);        // 比较值, 控制占空比(高电平时钟数)
  16.         PWMB_CCR3L  = (u8)(1000%256);
  17.         ccer2 |= 0x05;                        // 开启比较输出, 高电平有效
  18. //        PWMB_ISR_En|= 0x08;                // 使能中断
  19.         PWMB_CCER1  = ccer1;        // 捕获/比较使能寄存器1
  20.         PWMB_CCER2  = ccer2;        // 捕获/比较使能寄存器2
  21.         PWMB_PS     |= (1<<4);                // 选择IO, 0:选择P2.2, 1:选择P3.3, 2:选择P0.2, 3:选择P7.6,
  22.         PWMB_IER    = PWMB_ISR_En;        //设置允许通道1~4中断处理
  23.         PWMB_BKR    = 0x80;                // 主输出使能 相当于总开关
  24.         PWMB_CR1    = 0x81;                // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,  bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
  25.         PWMB_EGR    = 0x01;                //产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
  26.         PWMB_ENO   |= 0x10;                        // IO输出允许,  bit6: ENO8P, bit4: ENO7P,  bit2: ENO6P,  bit0: ENO5P
  27. void INT1_Isr() interrupt 2
  28. {
  29.         LED = ~LED;                             //测试端口        
  30. }
复制代码
单片机是STC8H1K17T,IRC频率24MHz。

是不是因为STC8与STC32的区别?

点评

外中断初始化就两行: EX1 = 1; //允许中断 IT1 = 1; //下降沿中断 EA = 1; /********************* INT0中断函数 *************************/ void INT1_ISR(void) interrupt INT1_VECTOR { frequency = ((u3  详情 回复 发表于 2024-1-11 15:24
回复 支持 反对

使用道具 举报 送花

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

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-1-11 15:24:15 | 显示全部楼层
xxkj*** 发表于 2024-1-11 12:09
大佬,没有你的水平,现在参考你的示波器代码,还是无法实现外部中断1(无法等到中断)
单片机是STC8H1K17 ...

外中断初始化就两行:
        EX1 = 1;        //允许中断
        IT1 = 1;        //下降沿中断

EA = 1;

/********************* INT0中断函数 *************************/
void INT1_ISR(void) interrupt INT1_VECTOR
{
        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-11 15:50:24 | 显示全部楼层
梁*** 发表于 2024-1-11 15:24
外中断初始化就两行:
        EX1 = 1;        //允许中断
        IT1 = 1;        //下降沿中断

有开外中断1:
EX1 = 1;        //允许中断
IT1 = 1;        //下降沿中断
EA = 1;

点评

那肯定可以进入外中断INT1的。  详情 回复 发表于 2024-1-11 19:16
回复 支持 反对

使用道具 举报 送花

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

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-1-11 19:16:17 | 显示全部楼层
xxkj*** 发表于 2024-1-11 15:50
有开外中断1:
EX1 = 1;        //允许中断
IT1 = 1;        //下降沿中断

那肯定可以进入外中断INT1的。
回复 支持 反对

使用道具 举报 送花

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

109

主题

1900

回帖

5214

积分

论坛元老

积分
5214
发表于 2024-1-11 20:27:35 | 显示全部楼层
梁*** 发表于 2024-1-11 19:16
那肯定可以进入外中断INT1的。

这就怪了,今晚终于有一次测试可以让INT1中断了。
而在这之前,多次测试的结果都不成,
甚至当出现这情况的时候,单独测试P33=~P33;(当然有注意到IO模式的配置等问题)都无法让P33正常的翻转,
我真怀疑这是IO口的问题了,反正觉得这IO口怪怪的。

点评

那你应该用STC官方的例子测试下。  详情 回复 发表于 2024-1-11 21:47
回复 支持 反对

使用道具 举报 送花

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

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-1-11 21:47:03 | 显示全部楼层
xxkj*** 发表于 2024-1-11 20:27
这就怪了,今晚终于有一次测试可以让INT1中断了。
而在这之前,多次测试的结果都不成,
甚至当出现这情况 ...

那你应该用STC官方的例子测试下。
回复 支持 反对

使用道具 举报 送花

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

109

主题

1900

回帖

5214

积分

论坛元老

积分
5214
发表于 2024-1-12 08:25:33 | 显示全部楼层
梁*** 发表于 2024-1-11 21:47
那你应该用STC官方的例子测试下。

有呀,发现IO可能有问题,就用STC-ISP中的IO测试程序直接烧到芯片中进行测试,但是结果还是不太稳定,P33口有时会翻转有时不会,所以才怀疑是P33端口有问题。

点评

这样情况,IO没有问题的。如果IO有问题,会一直有问题,不会“有时”出问题的。  详情 回复 发表于 2024-1-12 09:15
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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