xxkj2010 发表于 2024-1-4 11:46:08

梁工 发表于 2024-1-4 11:32
不是,频率计的计数是纯硬件完成的,中断不会导致误差。
造成误差的原因是使用的是内部时钟,秒级的间隔 ...

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

梁工 发表于 2024-1-4 12:09:38

本帖最后由 梁工 于 2024-1-4 12:15 编辑

xxkj2010 发表于 2024-1-4 11:44
恒温晶振一个近100元,那不如买个二手的频率计呢。频率计应该都用上恒温晶振吧? ...
便宜的频率计一般都是10ppm级别的精度。那些国外大牌子的不知道。

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

梁工 发表于 2024-1-4 12:10:12

xxkj2010 发表于 2024-1-4 11:46
同一时刻同一环境,芯片内部的IRC振荡频率会漂移吗?

秒级的间隔,抖动在0.1%~0.2%左右。

xxkj2010 发表于 2024-1-11 12:09:18

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

梁工 发表于 2024-1-3 14:37
做频率计,可以参考我的示波器的频率计:P3.5(T1)输入频率信号,P3.3是闸门信号。



大佬,没有你的水平,现在参考你的示波器代码,还是无法实现外部中断1(无法等到中断)
//PWMB 设置      
      PWMB_ENO    = 0;      // IO输出禁止
      PWMB_IER    = 0;      // 禁止中断
      PWMB_SR1    = 0;      // 清除状态
      PWMB_SR2    = 0;      // 清除状态
      ccer1 = 0;
      ccer2 = 0;
      PWMB_ISR_En = 0;
      
      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).
      PWMB_PSCRL = (u8)((24000-1)%256);
      PWMB_ARRH= (u8)(1010/256);      // 自动重装载寄存器,控制PWM周期
      PWMB_ARRL= (u8)(1010%256);

      PWMB_CCMR3= 0x68;                // 通道模式配置, PWM模式1, 预装载允许
      PWMB_CCR3H= (u8)(1000/256);      // 比较值, 控制占空比(高电平时钟数)
      PWMB_CCR3L= (u8)(1000%256);
      ccer2 |= 0x05;                        // 开启比较输出, 高电平有效

//      PWMB_ISR_En|= 0x08;                // 使能中断
      PWMB_CCER1= ccer1;      // 捕获/比较使能寄存器1
      PWMB_CCER2= ccer2;      // 捕获/比较使能寄存器2
      PWMB_PS   |= (1<<4);                // 选择IO, 0:选择P2.2, 1:选择P3.3, 2:选择P0.2, 3:选择P7.6,
      PWMB_IER    = PWMB_ISR_En;      //设置允许通道1~4中断处理

      PWMB_BKR    = 0x80;                // 主输出使能 相当于总开关
      PWMB_CR1    = 0x81;                // 使能计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数,bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
      PWMB_EGR    = 0x01;                //产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
      PWMB_ENO   |= 0x10;                        // IO输出允许,bit6: ENO8P, bit4: ENO7P,bit2: ENO6P,bit0: ENO5P
void INT1_Isr() interrupt 2
{
      LED = ~LED;                           //测试端口      
}单片机是STC8H1K17T,IRC频率24MHz。

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

梁工 发表于 2024-1-11 15:24:15

xxkj2010 发表于 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;
}

xxkj2010 发表于 2024-1-11 15:50:24

梁工 发表于 2024-1-11 15:24
外中断初始化就两行:
        EX1 = 1;        //允许中断
        IT1 = 1;        //下降沿中断


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

梁工 发表于 2024-1-11 19:16:17

xxkj2010 发表于 2024-1-11 15:50
有开外中断1:
EX1 = 1;      //允许中断
IT1 = 1;      //下降沿中断


那肯定可以进入外中断INT1的。

xxkj2010 发表于 2024-1-11 20:27:35

梁工 发表于 2024-1-11 19:16
那肯定可以进入外中断INT1的。

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

梁工 发表于 2024-1-11 21:47:03

xxkj2010 发表于 2024-1-11 20:27
这就怪了,今晚终于有一次测试可以让INT1中断了。
而在这之前,多次测试的结果都不成,
甚至当出现这情况 ...

那你应该用STC官方的例子测试下。

xxkj2010 发表于 2024-1-12 08:25:33

梁工 发表于 2024-1-11 21:47
那你应该用STC官方的例子测试下。

有呀,发现IO可能有问题,就用STC-ISP中的IO测试程序直接烧到芯片中进行测试,但是结果还是不太稳定,P33口有时会翻转有时不会,所以才怀疑是P33端口有问题。
页: 1 2 [3] 4 5
查看完整版本: STC8H8K64U的P2.0脚可以用PWM捕获功能做频率计吗