搜索
bottom↓
回复: 4

奇怪的问题 请大家帮忙!

[复制链接]

出0入0汤圆

发表于 2013-11-18 14:15:14 | 显示全部楼层 |阅读模式
本帖最后由 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.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-11-18 14:18:39 | 显示全部楼层
再发下单片机程序
#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[3]=0;//三路定时器用于发生50hz,1:1方波
struct SinTest         //三个信号发生器
{
        unsigned int time;//        计时器用于发生50hz,1:1方波
        unsigned char start;// 开启计时用标志
}SinTest[3];
unsigned int sleep1,sleep2;
timer0()interrupt 1 using 1
{

        TL0 = 0x50;                //设置定时初值
        TH0 = 0xFB;                //设置定时初值
        SinTest[0].time=SinTest[0].time+1;
        if(SinTest[1].start == true)
        SinTest[1].time=SinTest[1].time+1;
        if(SinTest[2].start == true)
        SinTest[2].time=SinTest[2].time+1;
        if(SinTest[0].time >= 100)
        {
                p1_0= !p1_0;
                SinTest[0].time = 0;
                if(sleep1<65)
                sleep1=1;//开始记录V延迟
                if(sleep2<65)
                sleep2=1;//开始记录W延迟
               
        }
        if((SinTest[1].time >= 100)
                &&(SinTest[1].start == true)
                )
        {
                p1_1= !p1_1;
                SinTest[1].time = 0;
               
        }
        if((SinTest[2].time >= 100)
                &&(SinTest[2].start == true)
                )
        {
                p1_2=  !p1_2;
                SinTest[2].time = 0;
               
        }


        if(sleep1>0 && sleep1<65)
                sleep1++;
        if(sleep1>63 && sleep1<65)
        {
                sleep1 = 65;
                p1_1=!p1_1;
                SinTest[1].start = true;
        }
        if(sleep2>0 && sleep2<128)
                sleep2++;
        if(sleep2>126 && sleep2<128)
        {
                sleep2 = 128;
                p1_2=!p1_2;
                SinTest[2].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[1].start = false;
        SinTest[2].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);
        {

        }
}

出0入0汤圆

 楼主| 发表于 2013-11-19 08:46:37 | 显示全部楼层
今天修改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
通过示波器发现有下降沿误触发的情况。在考虑如何解决中

出0入0汤圆

发表于 2013-11-20 21:35:45 | 显示全部楼层
bingtuohun 发表于 2013-11-19 08:46
今天修改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

出0入0汤圆

 楼主| 发表于 2013-11-21 19:07:49 | 显示全部楼层
本帖最后由 bingtuohun 于 2013-11-21 19:36 编辑

谢谢四楼,起初我也以为是干扰导致错误判断。所以做了个上升沿滤波,当输入U发生电压变化后,经过8个时钟周期(100us一个周期由10M晶振分频得到,发现计数器非常站宏单元啊)延迟后判断是否还是为高电平,这样我生产的程序,独立在一个工程中实际测试,没有问题,一切安好。但是我把这个独立工程的内容复制到我的实际工程中(原理图工程),测试发现还是有错误脉冲产生,在单独工程一点问题也没有。
所以我怀疑是我总工程有问题,我就将所有其他部分都删除了,只剩下三相判断这一部分,结果还是偶尔有错误脉冲出现。我想还可能是管脚定义导致工程出错,我就将管脚定义和测试用的独立工程设定为完全一样的,程序下载后,问题依旧。
我现在就十分不明白了,同样的东东怎么在2个工程里面得到的结果不同,原因不明啊。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 05:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表