2019-07-21 00:20发布
xuyaqi 发表于 2016-1-4 20:25 增量编码器的两路正交方波只说明朝那个方向转,单位时间转的快慢,具体测角度,数脉冲还要用户自己处理。
最多设置5个标签!
void GetSSI_Y(void)
{
u8 i = 0; //
u8 State = 0; //状态位数据
u8 Crc = 0; // 奇数或偶数标志位
int Y_DATA=0 ;//当前的角度数据( 0-1023 )
int ire_y=0 ; //增量数据,表示上次正确读的数据,和这次正确读的位置差
HN3806_Ycs = 0;//选中X编码器
__nop();__nop();
HN3806_Yclk = 0;//
delay_us(1);
HN3806_Yclk = 1;//CLK
delay_us(1);
for(i = 0; i < 12;i++)//读12次 前10位数据(12位绝对值编码器;ix < 10改成ix < 12即可)
{
HN3806_Yclk = 0;//CLK
Y_DATA <<= 1;//前10位的数据1024
if(HN3806_Ydata)//DO数据
{
Crc = !Crc;//标置位取反,数位中“1”的个数是奇数或偶数来进行校验 (初值=0)
Y_DATA |= 1;//最后位置1
}
HN3806_Yclk = 1;
delay_us(1);
}
delay_us(1);
for(i = 0; i < 5;i++)//读5次状态位标志!
{
HN3806_Yclk = 0;
State <<= 1; //后五位的数据状态位
if(HN3806_Ydata)
{
Crc = !Crc;//数位中“1”的个数是奇数或偶数来进行校验
State |= 1;//数据等于1置1
}
HN3806_Yclk = 1;
delay_us(1);
}
delay_us(1);
if(HN3806_Ydata == Crc)//最后一位校验一下,要是奇偶通不过,就认为CRC错误 ,就当这次无效
{
HN3806_Ycs = 1;//使能CSN置高,为下次准备
if((State == 16)||(State == 19))//;///&&(uState == uPrvState)) //16=10000;19=10011 表示状态位(5位uState) 都可以理解为数据正常
{
if((Y_DATA < 1024)&&(Y_PrvSSI > 3072)) // iSSI(0-1023)是这次读出的数据 m_iPrvSSI(0-1023)上一次读出的数据
{
ire_y = Y_DATA - Y_PrvSSI + 4096; // 第一种情况
printf("1 = %d, ", ire_y);
}else
if((Y_PrvSSI < 1024)&&(Y_DATA > 3072))
{
ire_y = Y_DATA - Y_PrvSSI - 4096; // 第二种情况
printf("2 = %d, ", ire_y);
}else
{
ire_y = Y_DATA - Y_PrvSSI;// 第三种情况 新数据减去老数据
printf("3 = %d, ", ire_y);
}
//------
// 计米方案:分成三种情况处理!其中256和768是自己假设的,前提条件是刷新速度每圈要5次以上
//当新数据,在0-256 老数据在768-1023时,我们就可以肯定的认为是反转 且变化值是?re = iSSI - m_iPrvSSI + 1024;
//当老数据 在0-256, 新数据在768-1023时,我们就可以肯定的认为是正转,且变化值是 ire = iSSI - m_iPrvSSI - 1024;
//其它的全部认为是 ire = iSSI - m_iPrvSSI
//ire 的正负决定方向!
Y_PrvSSI = Y_DATA;// 刷新数据,新数据替换老数据 ,为下一次做好准备
inc_y=ire_y;//保存增量数值正负决定方向
printf("增量数值 = %d, ",inc_y);
printf("状态位 = %d, ", State);
printf("数据 = %d, ", Y_DATA);
//printf("数据 = %d, ", X_DATA);
// printf("增量数值 = %d, ",inc_data);
}
}
HN3806_Ycs = 1;//使能CSN置高,为下次准备
delay_ms(200);
}
是不是自动增加或者减少计数?只需要读取脉冲数量直接来计算角度值?
一周热门 更多>