OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5092|回复: 6

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

[复制链接]

1

主题

5

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-1-4
在线时间
6 小时
发表于 2016-1-4 19:35:46 | 显示全部楼层 |阅读模式
1金钱
最近在做防摇控制系统,类似于倒立摆,需要测量摇摆角度,看了许多编码器测速的,但是好像没有测角度的,最大的难点是方向时刻改变,不知道计数值会不会跟着减少,还有就是当减到0时继续减小是变成负的还是从2000线开始减少。希望用编码器测角度的大神们给点建议。谢谢啦。。。。

最佳答案

查看完整内容[请看2#楼]

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; ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
351
金钱
351
注册时间
2013-4-23
在线时间
98 小时
发表于 2016-1-4 19:35:47 | 显示全部楼层
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,\r\n", ire_y);
                        }else
                        if((Y_PrvSSI < 1024)&&(Y_DATA > 3072))
                        {
                                ire_y = Y_DATA - Y_PrvSSI - 4096;        //     第二种情况
                                printf("2 = %d,\r\n", ire_y);
                        }else
                        {
                                ire_y = Y_DATA - Y_PrvSSI;//                       第三种情况          新数据减去老数据
                                printf("3 = %d,\r\n", 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,\r\n",inc_y);
          printf("状态位 = %d,\r\n", State);
          printf("数据 = %d,\r\n", Y_DATA);
                        //printf("数据 = %d,\r\n", X_DATA);
                //        printf("增量数值 = %d,\r\n",inc_data);
                }
           }
        HN3806_Ycs = 1;//使能CSN置高,为下次准备
                   delay_ms(200);
}
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10566
金钱
10566
注册时间
2014-6-12
在线时间
1022 小时
发表于 2016-1-4 20:18:37 | 显示全部楼层
可以用绝对编码器测角度
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10566
金钱
10566
注册时间
2014-6-12
在线时间
1022 小时
发表于 2016-1-4 20:25:39 | 显示全部楼层
增量编码器的两路正交方波只说明朝那个方向转,单位时间转的快慢,具体测角度,数脉冲还要用户自己处理。
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-1-4
在线时间
6 小时
 楼主| 发表于 2016-1-4 21:44:33 | 显示全部楼层
xuyaqi 发表于 2016-1-4 20:25
增量编码器的两路正交方波只说明朝那个方向转,单位时间转的快慢,具体测角度,数脉冲还要用户自己处理。

是不是自动增加或者减少计数?只需要读取脉冲数量直接来计算角度值?
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-1-4
在线时间
6 小时
 楼主| 发表于 2016-1-5 13:59:57 | 显示全部楼层
自己顶一下
回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10566
金钱
10566
注册时间
2014-6-12
在线时间
1022 小时
发表于 2016-1-7 09:30:03 | 显示全部楼层
HQW959089 发表于 2016-1-4 21:44
是不是自动增加或者减少计数?只需要读取脉冲数量直接来计算角度值?

对于f407编码器模式只需要读取脉冲数量直接来计算角度值
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 00:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表