
这个有点像红外线遥控解码。。网上有,你可以参考一下。。
一定要外部中断的话
大概原理是
先设外部中断响应为下降沿响应,等到中断了就开始用定时器计时,并设置外部中断为上升沿响应。。等外部中断再次发生时,判断计时时间是否达到9MS(这个要接近,而不能定死),如果达到了就进入下一步,没达到或超过了,那就重新开始(可能是干扰信号)
在满足9MS时,设外部中断为下降沿响应,原理同上,判断560US是否满足了。。。。
这个是知道每个信号都知道的情况,我刚看了下 STC单片机的外部中断。。。只要有变化就能触发中断,这个时候对不确定的信号好处理(不知道下一个信号是高还是低的情况下)只要时间处理好就行!
int PORT_PULSE_IN = 3; //定义信号采集端口为3
void setup() {
pinMode(PORT_PULSE_IN, INPUT); //设置端口为输入模式
Serialbegin(9600); //启动串口通信,查看脉宽数值
}
void loop() {
long int PulseTime; //定义脉宽时间变量
PulseTime = GetPulseTime(); //测脉宽时间
Serialprintln(PulseTime); //串口输出脉宽时间
}
long int GetPulseTime()
{
long int StartTime; //定义测量脉宽的开始时间
while(digitalRead(PORT_PULSE_IN) == HIGH){}; // 如果调用函数时,脉宽为高电平,则等待其变低,测量下一组完整的脉宽信号
while(digitalRead(PORT_PULSE_IN) == LOW){}; // 检测到低电平,脉宽即将发生,等待信号变高电平
StartTime = micros(); //在信号变高的瞬间,记录下uS值
while(digitalRead(PORT_PULSE_IN) == HIGH){}; // 等待信号变低
return(micros() - StartTime); // 返回变低瞬间的uS值 - 高电平开始时刻的uS值,即脉宽长度
}
// 注意:while(digitalRead(PORT_PULSE_IN) == HIGH){}; 表示,只要检测到高电平就一直在语句内循环,只有信号变低电平才能跳出语句;反之为LOW则表示,信号必须变高才能跳出语句。
需求没说清楚,脉宽的具体宽度,数量级先搞清楚。对具体实施很关键的。
方法有一下:
1、如果单片机有捕捉功能,则在沿上捕捉后记录定时器时间,然后计算出时间,即可比较输出信号。
2、如果没有,接入单片机的中断管脚(上下沿中断,如果没有,进入后立马改变下次中断触发方式,进行上升下降沿中断的切换),单片机外部中断服务中记录定时器时间,然后下次中断来临后计算时间,即可比较输出信号。
3、如果都没有,功能且单一,脉宽比较宽,要求不高,硬件又没有在中断管脚上,可以考虑主程序定时查询,记录时间。
5ms,很宽的,如果功能单一的话,定时器都可以免了,直接用单片机指令周期算时间,定义一个长整型变量,不断监测管脚,监测完变量加一,后再比较。
不过呢,希望还是用我提到的方法2吧,通用些。具体实施自己多想想,另位朋友的代码慎重使用,问题较多,不一一说明了
原理:分别用脉冲的上升沿和下降沿出发单片机,下降沿给出中断2停止计数,最后换算出高电平宽度=计数周期数×一个计数的时间。
脉冲有间隔性的特征,因此我们可以把脉冲作为一种信号。脉冲信号的定义由此产生:
相对于连续信号(在整个信号周期内短时间中都有的信号),大部分脉冲信号周期内是没有信号的。就象人的脉搏一样。脉冲信号一般指数字信号,它已经是一个周期内有一半时间(甚至更长时间)有信号。计算机内的信号就是脉冲信号,又叫数字信号。
最大脉宽计算:知道计数器中断的产生是从全1变为全0产生溢出中断,所以计数器的处置设定为00H,如果让其工作在方式1计数下,最大计数值为2^16=65536,那么最大计数脉冲宽度就是655362us。
扩展资料:
脉宽由信号的周期和占空比确定,其计算公式是脉宽W=T×P(T:周期,P:占空比)。例如在飞思卡尔的S12dg128寄存器中的具体的
占空比计算方式是:
左对齐方式:
占空比=[(PWMPERx-PWMDTYx)/PWMPERx]×100%
中心对齐方式:
占空比=[PWMDTYx/PWMPERx]×100%
周期的计算公式:
左对齐方式:
输出周期=通道周期×PWMPERx
中心对齐方式:
输出周期=通道周期×PWMPERx×2
脉宽的计算方法就不言而喻了。
参考资料来源:百度百科-脉冲宽度
参考资料来源:百度百科-脉冲
以上就是关于求助:51单片机脉宽宽度测量;如何用外部中断测量下面没一个高低电平的宽度;请用C语言帮忙写下程序!!全部的内容,包括:求助:51单片机脉宽宽度测量;如何用外部中断测量下面没一个高低电平的宽度;请用C语言帮忙写下程序!!、Arduino中求一秒左右的脉宽怎么做、求助,通过52单片机测量外部脉冲宽度,如果脉宽小于某个设定值则输出一个信号,比如灯亮等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)