如何捕捉信号的上升沿下降沿

思路:设计两个或多个一位的寄存器,用来接收被检测的信号,系统时钟来一次记一次输入信号,如果用了两个寄存器直接异或就可以了;使用高频的时钟对信号进行采样,因此要实现上升沿检测,时钟频率至少要在信号最高频率的2倍以上,否则就可能出现漏检测。具体请参见下面代码:

module edge_detect(clk,rst,signal,pos_edge,neg_edge,both_edge);
 input clk;
 input rst;
 input signal;
 output pos_edge;
 output neg_edge;
 output both_edge;
 
 reg sig_r0,sig_r1;//状态寄存器
 always @(posedge clk)
  begin
      if(rst)
	    begin
		   sig_r0 <= 1'b0;
		   sig_r1 <= 1'b0;
		end
	  else
	    begin
		   sig_r0 <= signal;
		   sig_r1 <= sig_r0;
		end
  end
 
 assign pos_edge = ~sig_r1 & sig_r0;
 assign neg_edge = sig_r1 & ~sig_r0;
 assign both_edge = sig_r0 ^ sig_r1;
endmodule

参考:https://blog.csdn.net/bleauchat/article/details/85322247

在KEAZ64微控制器中,捕捉PWM信号上升沿下降沿通常使用定时器的输入捕捉功能。以下是一个示例代码,展示了如何使用KEAZ64的定时器来捕捉PWM信号上升沿下降沿。 ```c #include "derivative.h" // 定义全局变量用于存储捕捉值 volatile uint16_t rising_edge = 0; volatile uint16_t falling_edge = 0; volatile uint8_t edge_flag = 0; // 定时器输入捕捉中断服务程序 void TIM0_IRQHandler(void) { if (TPM0_C0SC & TPM_CnSC_CHF_MASK) { // 检查通道0中断标志 TPM0_C0SC &= ~TPM_CnSC_CHF_MASK; // 清除中断标志 if (edge_flag == 0) { rising_edge = TPM0_C0V; // 捕捉上升沿 edge_flag = 1; } else { falling_edge = TPM0_C0V; // 捕捉下降沿 edge_flag = 0; } } } int main(void) { // 初始化定时器 SIM_SCGC |= SIM_SCGC_TPM0_MASK; // 使能TPM0时钟 TPM0_SC = TPM_SC_PS(0); // 设置预分频器为1 TPM0_C0SC = TPM_CnSC_ELSA_MASK | TPM_CnSC_ELSB_MASK | TPM_CnSC_CHIE_MASK; // 设置输入捕捉模式,上升沿下降沿捕捉,并使能中断 TPM0_CNT = 0; // 清除计数器 // 配置中断 NVIC_EnableIRQ(TPM0_IRQn); // 使能TPM0中断 // 主循环 while (1) { // 主循环中可以处理捕捉到的PWM信号 } return 0; } ``` ### 代码说明 1. **全局变量定义**:定义了用于存储上升沿下降沿捕捉值的变量。 2. **中断服务程序**:在定时器捕捉到PWM信号的边沿时触发,清除中断标志并根据`edge_flag`的值判断是上升沿还是下降沿。 3. **主函数**: - 初始化定时器时钟和预分频器。 - 配置输入捕捉模式,使能上升沿下降沿捕捉,并使能中断。 - 配置中断向量。 - 进入主循环,主循环中可以处理捕捉到的PWM信号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值