void Init_PIC(void)
{
AS5311_CLK_H;
AS5311_CSN_DIS;
delay_ms(2);
AS5311_CSN_EN; //CLK为高电平时,CSN来个下降沿可以使能磁栅尺AB脉冲
delay_ms(100);
}
uint32_t read_AS5311chip(void)
{
uint32_t raw_value;// = 0;
uint16_t inputstream;// = 0;
uint16_t c;
inputstream = 0;
raw_value = 0;
AS5311_CLK_H;//digitalWrite(_clock, HIGH);
AS5311_CSN_H;//digitalWrite(_cs, HIGH);
delay_Systick_200ns(DELAYNUM);//delay_us(2);//
// AS5311_CLK_H;//digitalWrite(_clock, HIGH);
// delay_us(DELAYNUM);
AS5311_CSN_L;//digitalWrite(_cs, LOW);下降沿
delay_Systick_200ns(1);//delay_us(1);//
AS5311_CLK_L;//digitalWrite(_clock, LOW);
delay_Systick_200ns(DELAYNUM);//delay_us(2);
for (c = 0; c < 18; c++)
{
AS5311_CLK_H;//digitalWrite(_clock, HIGH);
delay_Systick_200ns(DELAYNUM);//delay_us(2);//
inputstream = GPIO_ReadInputDataBit(GPIO_AS5311_DO,PIN_AS5311_DO);//digitalRead(_data);
raw_value = ((raw_value << 1) + inputstream);
AS5311_CLK_L;//digitalWrite(_clock, LOW);
delay_Systick_200ns(DELAYNUM);//delay_us(2);//
}
AS5311_CLK_H;
// delay_us(10);
return raw_value;
}
void AS5311_AnalyzeSSICode(void) //获取0-4096
{
uint8_t cnt;
uint8_t cnt_1;
AS5311Dt.SSICode = read_AS5311chip();
// AS5311Dt.detail.Errcode = AS5311Dt.SSICode & 0x0000003F;
// AS5311Dt.detail.AbsCode = AS5311Dt.SSICode >> 6;
//检验数据是否有效 OCF COF LIN MagINC MagDEC Parity
// 1 0 0 不能同时为1 奇偶校验
//OCF 0 补偿算法未完成,bit11-0可能无效
//COF 1 溢出,bit11-0无效
//LIN 1 线性度不好,bit11-0无效,若出现需增强磁栅尺的强度
//MagINC MagDEC 磁场强度 ,1 1表示磁场强度若
//Parity 偶校验
if(3 == AS5311Dt.Class.Mag)
{ //磁栅尺信号弱
GbDt.Gb.SysAlm = AS5311WEAKERR;
}
else
{
if(4 != AS5311Dt.Class.Err)
{
GbDt.Gb.SysAlm = AS5311READYERR;
}
else
{
cnt = 18;
cnt_1 = 0;
Seg32data.all = 0x0000A8A1;//AS5311Dt.SSICode;
do
{
if(Seg32data.bits.bit0 == 1)
{
cnt_1++;
}
Seg32data.all = Seg32data.all >> 1;
}while(cnt--);
cnt_1 = cnt_1 % 2;
if(!cnt_1)
{
checkCounter();
switch(GbDt.Gb.SysAlm)
{
case AS5311READYERR: //准备错误
case AS5311WEAKERR: //信号弱
case AS5311EVENERR: //奇偶错误
GbDt.Gb.SysAlm = NORMAL;
break;
}
}
else
{ //偶校验失败
GbDt.Gb.SysAlm = AS5311EVENERR;
}
}
}
}
void checkCounter(void)
{
int32_t temp;
float Buf;
GlPara.Curpole = AS5311Dt.detail.AbsCode/1366; //[0,1366) 0;[1366,2732) 1;[2732,4095] 2
if (GlPara.Lastpole == 2 && GlPara.Curpole == 0)
{
GlPara.SSIcount++;
}
if (GlPara.Lastpole == 0 && GlPara.Curpole == 2)
{
GlPara.SSIcount--;
}
//lastEncoderVal = encoderVal;
GlPara.Lastpole = GlPara.Curpole;
//转换为nm
temp = AS5311Dt.detail.AbsCode;
temp = 200000*(temp - GlPara.ZeroCode)/4096;
temp += GlPara.SSIcount * 200000;
GlPara.SSICurPos = temp; //单位10nm=0.01um
// Buf = GlPara.SSICurPos;
// Buf = Buf * SSIPOS_TO_TPLS;
// GbDt.Gb.CrrntPstn[OPTMTR] = Buf;
}
void Init_Zero(void)
{
AS5311_AnalyzeSSICode();
GlPara.Lastpole = 1;
GlPara.ZeroCode = AS5311Dt.detail.AbsCode;
//checkCounter();
GlPara.SSIcount = 0;
}
注意不用SSI模式时,CSN下降沿时CLK要处于高电平状态,否则AB正交脉冲不对。这样可能出现干扰导致磁栅尺错误,从而可以做个这样的时序,就算出现干扰好也能恢复。