STC8H8K64U的P2.0脚可以用PWM捕获功能做频率计吗
板子只有P2.0可以利用,想用来测量22M四分频后的5M多的频率,P2.0可以用PWMB的捕获功能测试这么高的频率吗我目前参考程序写的一段,能进中断,但测到的数据好像不对:
void PWM2_ISR() interrupt PWM2_VECTOR
{
unsigned int ccr;
if(PWM2_SR1 & 0x01) // 更新中断(PWM计数器溢出)
{
PWM2_SR1 &= ~0x01; // 清零更新中断标志
cap_overflow += 65536; // 捕获值要加上计数器一次溢出65536
}
if (PWM2_SR1 & 0x02)
{
PWM2_SR1 &= ~0x02;
ccr_old=ccr; //保存当前捕获值
ccr = (PWM2_CCR1H<<8)+PWM2_CCR1L; //CC5捕获周期宽度
cycle=ccr+cap_overflow-ccr_old; //计算周期
cap_overflow = 0;
f1=1; //周期完成
}
}
void Frq_TEST()
{
P_SW2 = 0x80;
PWM2_CCER1 = 0x00; //CC5为输入模式,且映射到T15FP5上
PWM2_CCMR1 = 0x01;
PWM2_CCER1= 0x01; //使能CC5,CC6的捕获功能
PWM2_CCER1 |= 0x00; //设置捕获极性为CC5的上升沿
PWM2_CR1 = 0x01;
PWM2_IER = 0x03; //使能CC5捕获中断和更新中断
EA = 1;
while (1)
{
if(f1)
{
f1=0;
PWM2_IER=0x00;
}
delay(500);
freq = (u16)(FOSC/cycle)+1;
UartSend(0xAA);
UartSend(freq>>24);//串口发送
UartSend(freq>>16);
UartSend(freq>>8);
UartSend(freq);
UartSend(0xBB);
PWM2_IER=0x03;
}
}
捕捉要用到中断,5M的频率是不行的,中断会响应不过来。
应该用一个计数器对外计数,最高可以测量主频一半的频率,我常用32.768M做主频,最高可以测量15M的频率。 梁工 发表于 2023-7-19 13:00
捕捉要用到中断,5M的频率是不行的,中断会响应不过来。
应该用一个计数器对外计数,最高可以测量主频一半 ...
好的,也就是没办法用P2.0来做输入脚了对吧 ahong 发表于 2023-7-19 13:17
好的,也就是没办法用P2.0来做输入脚了对吧
是的 梁工 发表于 2023-7-19 13:00
捕捉要用到中断,5M的频率是不行的,中断会响应不过来。
应该用一个计数器对外计数,最高可以测量主频一半 ...
请问有例程可以参考吗?
xxkj2010 发表于 2024-1-3 11:56
请问有例程可以参考吗?
没有现成的程序,很简单的,你用定时器例程,只需要设置为对外计数即可。 梁工 发表于 2024-1-3 13:46
没有现成的程序,很简单的,你用定时器例程,只需要设置为对外计数即可。 ...
需要两个定时器吗?一个作1秒计时,一个作为对外脉冲计数 xxkj2010 发表于 2024-1-3 14:19
需要两个定时器吗?一个作1秒计时,一个作为对外脉冲计数
做频率计,可以参考我的示波器的频率计:P3.5(T1)输入频率信号,P3.3是闸门信号。