关于f407编码器模式测量角度

2019-07-21 00:20发布

最近在做防摇控制系统,类似于倒立摆,需要测量摇摆角度,看了许多编码器测速的,但是好像没有测角度的,最大的难点是方向时刻改变,不知道计数值会不会跟着减少,还有就是当减到0时继续减小是变成负的还是从2000线开始减少。希望用编码器测角度的大神们给点建议。谢谢啦。。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
dalianlwd
2019-07-21 01:36
2楼已经给你答案了。必须是绝对值编码器。有一种SPI接口的绝对值编码器比较适合。以下代码是我去年测试用的。
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);
}

一周热门 更多>