C8051F120接正交编码器的方法

// C8051F120 正交编码器接口
// 用于永磁同步电机 PMSM 矢量电驱动
// 原创代码拥有者  高级工程师  周永良


sbit Cor_A  = P2^0;   // 正交编码器入口
sbit Cor_B  = P2^1;
sbit Cor_Z  = P2^2;

 unsigned int xdata Coder_Value;

 char bdata Bit1_Value _at_ 0x2F;

 sbit Temp_Bit   = Bit1_Value^0;

void CP00_Serve(void); // A
void CP01_Serve(void);
void CP10_Serve(void); // B
void CP11_Serve(void);

 

void Comparator_Init()
{
    int i = 0;
    SFRPAGE   = CPT0_PAGE;
 CPT0MD    = 0x30;
    CPT0CN    = 0x8F;
    for (i = 0; i < 600; i++);
    CPT0CN    &= ~0x30;

    SFRPAGE   = CPT1_PAGE;
 CPT1MD    = 0x30;
    CPT1CN    = 0x8F;
    for (i = 0; i < 600; i++);
    CPT1CN    &= ~0x30;
}

void Interrupts_Init()
{
//    IE    |= 0x17;
//    IP    |= 0x17;
    EIE1  |= 0xF0;
    EIP1  |= 0xF0;
}


void main (void)
{
 Comparator_Init();
 Interrupts_Init();
while(1)
{
Temp_Value =  Coder_Value;
}
return;
}

 


/************ 正交编码器入口 *** A ****/
void CP00_Serve(void) interrupt 10
{CPT0CN &= ~0x10;// 下降沿中断
 if(Cor_B == 1){Coder_Value ++; Temp_Bit = 1;}
 if(Cor_B == 0){Coder_Value --; Temp_Bit = 0;}
 pid_A.ActualSpeed = Coder_Value;
 pid_B.ActualSpeed = Coder_Value;
return;
}
/******************************* A ****/
void CP01_Serve(void) interrupt 11
{CPT0CN &= ~0x20;// 上升沿中断
 if(Cor_B == 0){Coder_Value ++; Temp_Bit = 1;}
 if(Cor_B == 1){Coder_Value --; Temp_Bit = 0;}
 pid_A.ActualSpeed = Coder_Value;
 pid_B.ActualSpeed = Coder_Value;
if(0x07 && (P2 & 0x07)){Pow_ON = 0;
 if(Coder_Value > 4000)Coder_Value = 1;
 if(Coder_Value < 1)Coder_Value = 4000;
 if(Cor_Z == 1){Pow_ON = 1 ; Coder_Value = 2000;}
 }
return;
}
/******************************* B ****/
void CP10_Serve(void) interrupt 12
{CPT1CN &= ~0x10;// 下降沿中断
 if(Cor_A == 0){Coder_Value ++; Temp_Bit = 1;}
 if(Cor_A == 1){Coder_Value --; Temp_Bit = 0;}
 pid_A.ActualSpeed = Coder_Value;
 pid_B.ActualSpeed = Coder_Value;
return;
}
/******************************* B ****/
void CP11_Serve(void) interrupt 13
{CPT1CN &= ~0x20;// 上升沿中断
 if(Cor_A == 1){Coder_Value ++; Temp_Bit = 1;}
 if(Cor_A == 0){Coder_Value --; Temp_Bit = 0;}
 pid_A.ActualSpeed = Coder_Value;
 pid_B.ActualSpeed = Coder_Value;
 if(0x07 && (P2 & 0x07)){Pow_ON = 0;
 if(Coder_Value > 4000)Coder_Value = 1;
 if(Coder_Value < 1)Coder_Value = 4000;
 if(Cor_Z == 1){Pow_ON = 1 ; Coder_Value = 2000;}
 }
return;
}
/*************** END ********************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值