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

2019-07-21 00:20发布

最近在做防摇控制系统,类似于倒立摆,需要测量摇摆角度,看了许多编码器测速的,但是好像没有测角度的,最大的难点是方向时刻改变,不知道计数值会不会跟着减少,还有就是当减到0时继续减小是变成负的还是从2000线开始减少。希望用编码器测角度的大神们给点建议。谢谢啦。。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
dalianlwd
1楼-- · 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);
}
xuyaqi
2楼-- · 2019-07-21 05:41
可以用绝对编码器测角度
xuyaqi
3楼-- · 2019-07-21 06:05
 精彩回答 2  元偷偷看……
HQW959089
4楼-- · 2019-07-21 09:06
xuyaqi 发表于 2016-1-4 20:25
增量编码器的两路正交方波只说明朝那个方向转,单位时间转的快慢,具体测角度,数脉冲还要用户自己处理。

是不是自动增加或者减少计数?只需要读取脉冲数量直接来计算角度值?
HQW959089
5楼-- · 2019-07-21 13:54
自己顶一下
xuyaqi
6楼-- · 2019-07-21 14:27
 精彩回答 2  元偷偷看……

一周热门 更多>