19
83
868
高级会员
使用道具 举报 送花
86
5979
1万
超级版主
void PWMA_Isr(void) interrupt PWMA_VECTOR { if(PWMA_SR1&0x02) { PWMA_SR1&=~0x02; Cap[0]=Cap[1]; Cap[1]=(PWMA_CCR1H<<8)|PWMA_CCR1L; Cap[2]=Cap[1]-Cap[0]; Flag=1; } }复制代码
Debu*** 发表于 2025-1-9 15:11 https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=12187&pid=124999
Crysta*** 发表于 2025-1-9 15:29 为什么我测低频他一直跳
Debu*** 发表于 2025-1-9 17:00 发原理图和程序
#include <STC8H.H> #include <Seg.h> uchar Seg_Buf[] = {10,10,10}; uchar pos = 0; uint Seg_Slow_Down = 0; uint Time_1000ms = 0; uint Freq = 0; uchar Time1ms = 0; uchar led_light = 2; uchar take_time = 0; //保存进入中断的次数 #define FILTER_SIZE 10 int filter_buffer[FILTER_SIZE]; // 存储最新的10个频率值 int filter_index = 0; // 用于指示当前存储位置 int filtered_freq = 0; // 存储滤波后的频率值 typedef struct { int cap; int cap_new; int cap_old; }Freq_Type; Freq_Type Freq1; Freq_Type Freq2; Freq_Type Freq3; void Timer1_Isr(void) interrupt 3 { if(++Seg_Slow_Down == 2000) Seg_Slow_Down = 0; if(++Time1ms == 10){ Time1ms = 0; if(++pos ==3) pos = 0; } if(Time1ms <= led_light) //亮 { Seg_Disp(pos,Seg_Buf[pos]); } else Seg_Disp(pos,10); //灭 } void Timer1_Init(void) //100微秒@12.000MHz { AUXR &= 0xBF; //定时器时钟12T模式 TMOD &= 0x0F; //设置定时器模式 TL1 = 0x9C; //设置定时初始值 TH1 = 0xFF; //设置定时初始值 TF1 = 0; //清除TF1标志 TR1 = 1; //定时器1开始计时 ET1 = 1; //使能定时器1中断 } void System_Init() { P_SW2 |= 0x80; //扩展外部XFR PWMB_PS = 0x54; //01 01 01 00 选用P54\P33\P34作为输入捕获引脚 PWMB_PSCRH = 0x2E; //预分频寄存器 PWMB_PSCRL = 0xDF; /*必须先关闭CCER才能设置CC1*/ PWMB_CCER1 = 0x00;PWMB_CCER2 = 0x00 ; PWMB_CCMR2 = 0x01;PWMB_CCMR3 = 0x01; PWMB_CCMR4 = 0x01; //通道6、7、8设为输入 //PWMB_CCMR2 |= 0xC0; PWMB_CCMR3 |= 0xC0; PWMB_CCMR4 |= 0xC0; //8个事件触发一次 PWMB_CCER1 = 0x10; PWMB_CCER2 = 0x11; //使能通道6、7、8 PWMB_IER = 0x1C; PWMB_CR1 |= 0x01; //使能计数器 IP |= 0x0f; //拉低定时器1的优先级 P1M0 = 0xff; P1M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00; P3M0 = 0xe0; P3M1 = 0x00; Timer1_Init(); EA = 1; } void Seg_Proc() { if(Seg_Slow_Down) return; Seg_Slow_Down = 1; //Freq = Freq1.cap + Freq2.cap + Freq3.cap; // if(Freq <= 999){ // Seg_Buf[0] = (Freq/100)?Freq/100:10; // Seg_Buf[1] = (Freq/10)?Freq/10%10:10; // Seg_Buf[2] = Freq%10; // } // else // Seg_Buf[0] = Seg_Buf[1] = Seg_Buf[2] = 9; filtered_freq = 1000 / filtered_freq; Seg_Buf[0] = (filtered_freq/100)?filtered_freq/100:10; Seg_Buf[1] = (filtered_freq/10)?filtered_freq/10%10:10; Seg_Buf[2] = filtered_freq%10; } void main() { System_Init(); while(1) { Seg_Proc(); } } void PWMB_ISR() interrupt 27 { long sum; uchar i; if(PWMB_SR1 & 0x04) //是CC6的中断 { Freq1.cap_old = Freq1.cap_new; Freq1.cap_new = PWMB_CCR6; Freq1.cap = Freq1.cap_new - Freq1.cap_old; filter_buffer[filter_index] = (Freq1.cap >= 0) ? Freq1.cap : -Freq1.cap; filter_index = (filter_index + 1) % FILTER_SIZE; for(i = 0;i<FILTER_SIZE;i++) sum += filter_buffer[i]; filtered_freq = sum / FILTER_SIZE; PWMB_SR1 &= ~0x04; } // if(PWMB_SR1 & 0x08) //是CC7的中断 // { // Freq2.cap_old = Freq2.cap_new; // Freq2.cap_new = PWMB_CCR7; // Freq2.cap = Freq2.cap_new - Freq2.cap_old; // PWMB_SR1 &= ~0x08; // } // if(PWMB_SR1 & 0x10) //是CC8的中断 // { // Freq3.cap_old = Freq3.cap_new; // Freq3.cap_new = PWMB_CCR8; // Freq3.cap = Freq3.cap_new - Freq3.cap_old; // PWMB_SR1 &= ~0x10; // } }复制代码
Crysta*** 发表于 2025-1-10 11:50
76
6636
梁*** 发表于 2025-1-10 14:23 被测信号频率多少?是否稳定?可以使用晶振做时钟发出频率来测试。
Crysta*** 发表于 2025-1-10 14:48 我还有个疑问就是PWMB_CNTR和PWMB_CCR1不是16位的吗为什么要用int类型?int类型不是-32768-32767吗,要是计 ...
本版积分规则 发表回复 回帖后跳转到最后一页
|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )
GMT+8, 2025-8-24 06:41 , Processed in 0.134353 second(s), 108 queries .
Powered by Discuz! X3.5
© 2001-2025 Discuz! Team.