奇怪的问题 请大家帮忙!
本帖最后由 bingtuohun 于 2013-11-18 15:19 编辑上面的我用quartus II 画的原理图
其中模块代码为
module jCU(U,V,W,O);//三相判断
input U,V,W;
output O;
reg O;//寄存器定义
initial
begin
//O = 0;
end
always @ (posedge U )
begin
if(V == 0 && W== 1)
begin
O = 1;
end
else if(V == 1 &&W == 0)
begin
O = 0;
end
end
endmodule
这个是电路图附件有清晰板
附件是电路图
用单片机模拟U,V,W给定三个方波,相差6.6ms
问题来了,U,V,W给定信号是正确时序,O输出为1.但是,不知道为什么不定期的在U下降沿时O会输出0,当U再次上升沿O输出1.
再发下单片机程序
#include"stc.h"
sbit p1_0=P1^0;
sbit p1_1=P1^1;
sbit p1_2=P1^2;
sbit p1_7=P1^7;
#define true 1
#define false 0
unsigned char time=0;//三路定时器用于发生50hz,1:1方波
struct SinTest //三个信号发生器
{
unsigned int time;// 计时器用于发生50hz,1:1方波
unsigned char start;// 开启计时用标志
}SinTest;
unsigned int sleep1,sleep2;
timer0()interrupt 1 using 1
{
TL0 = 0x50; //设置定时初值
TH0 = 0xFB; //设置定时初值
SinTest.time=SinTest.time+1;
if(SinTest.start == true)
SinTest.time=SinTest.time+1;
if(SinTest.start == true)
SinTest.time=SinTest.time+1;
if(SinTest.time >= 100)
{
p1_0= !p1_0;
SinTest.time = 0;
if(sleep1<65)
sleep1=1;//开始记录V延迟
if(sleep2<65)
sleep2=1;//开始记录W延迟
}
if((SinTest.time >= 100)
&&(SinTest.start == true)
)
{
p1_1= !p1_1;
SinTest.time = 0;
}
if((SinTest.time >= 100)
&&(SinTest.start == true)
)
{
p1_2=!p1_2;
SinTest.time = 0;
}
if(sleep1>0 && sleep1<65)
sleep1++;
if(sleep1>63 && sleep1<65)
{
sleep1 = 65;
p1_1=!p1_1;
SinTest.start = true;
}
if(sleep2>0 && sleep2<128)
sleep2++;
if(sleep2>126 && sleep2<128)
{
sleep2 = 128;
p1_2=!p1_2;
SinTest.start = true;
}
}
void Timer0Init(void) //100微秒@12.000MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x50; //设置定时初值
TH0 = 0xFB; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
main()
{
SinTest.start = false;
SinTest.start = false;
sleep1 = 0;
sleep2 = 0;
p1_2=0;
p1_1=0;
p1_0=0;
//p1_7=1;
Delay1ms();
Timer0Init();
IP=0X08;EA=1;ET0=1;ET1=1;
while(1);
{
}
} 今天修改CPLD中代码为
module jCU(U,V,W,O);//三相判断
input U,V,W;
output O;
reg O;//寄存器定义
initial
begin
O = 0;
end
always @ (posedge U )
begin
O<= ~O;
/*if(V == 1'b0 && W== 1'b1)
begin
O <= 1;
end
else if(V == 1'b1 &&W == 1'b0)
begin
O <= 0;
end
else
O <= 0;*/
end
endmodule
通过示波器发现有下降沿误触发的情况。在考虑如何解决中 bingtuohun 发表于 2013-11-19 08:46 static/image/common/back.gif
今天修改CPLD中代码为
module jCU(U,V,W,O);//三相判断
input U,V,W;
不能用数据信号做时钟,这个不是真正的时钟,有可能有毛刺,导致误触发,需要用一个稳定的全局时钟
module jCU(U,V,W,O,clk);//三相判断
input U,V,W,clk;
output O;
reg O;//寄存器定义
always @(posedge clk)
begin
U_1dly <= U;
U_2dly <= U_1dly;
U_3dly <= U_2dly;
U_DGE <= U_2dly &(~U_3dly);
end
always @ (posedge clk)
begin
if(U_DGE == 1'b1)
begin
if(V == 1'b0 && W== 1'b1)
O <= 1;
else if(V == 1'b1 &&W == 1'b0)
O <= 0;
end
end
endmodule 本帖最后由 bingtuohun 于 2013-11-21 19:36 编辑
谢谢四楼,起初我也以为是干扰导致错误判断。所以做了个上升沿滤波,当输入U发生电压变化后,经过8个时钟周期(100us一个周期由10M晶振分频得到,发现计数器非常站宏单元啊)延迟后判断是否还是为高电平,这样我生产的程序,独立在一个工程中实际测试,没有问题,一切安好。但是我把这个独立工程的内容复制到我的实际工程中(原理图工程),测试发现还是有错误脉冲产生,在单独工程一点问题也没有。
所以我怀疑是我总工程有问题,我就将所有其他部分都删除了,只剩下三相判断这一部分,结果还是偶尔有错误脉冲出现。我想还可能是管脚定义导致工程出错,我就将管脚定义和测试用的独立工程设定为完全一样的,程序下载后,问题依旧。
我现在就十分不明白了,同样的东东怎么在2个工程里面得到的结果不同,原因不明啊。
页:
[1]