标题:
绝对值多圈编码器,其中齿轮以格雷码的方式编码,但是现在齿轮安装精度跟不上
[打印本页]
作者:
yanglonghai
时间:
2019-7-22 10:18
标题:
绝对值多圈编码器,其中齿轮以格雷码的方式编码,但是现在齿轮安装精度跟不上
这种齿轮很常见,齿轮比4比1,齿轮通过光学漫反射检测位置信号,是现在市面上最常见的方案
参考资料:
资料.7z
(236 Bytes, 下载次数: 30)
2019-7-23 02:45 上传
点击文件名下载附件
希望能得到有效的建议,现在问题是齿轮安装的时候没有对照机械零点(市场上应该都是这样,都是通过软件来弥补),导致其变化不是线性的,计算出来的圈数会跳变,本人的实现代码如下,或许描述的不是太准确,希望懂的大佬能够帮助我一下,已经研究几个月了各种方法都试过了,如果有算法更好,感激不尽
/*******************************************************************************
* 文件名 : light_coding.c
* 作者 : ylh
* 库版本 : V3.5.0
* 文件版本 : V1.0.0
* 日期 : 2019年04月16日
* 摘要 : 齿轮
********************************************************************************/
#include "light_coding.h"
uint8_t light_cod[6] = {0};
uint8_t result_turn[6] = {0};
void LightCoding_GPIO_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
// EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE); //使能端口和复用IO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO,ENABLE);//
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);//
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);//
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);//
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//
}
void NVIC_Configuration_LightCoding(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; //从优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
Light_Coding(0x01);
}
//读光编0x01~0x06;
uint8_t Light_Coding(uint8_t type)
{
uint8_t result = 0;
LED0(type&0x01);
delay_ms(30);
LED1((type&0x02)>>1);
delay_ms(30);
LED2((type&0x04)>>2);
delay_ms(30);
result = (result)|KEY3;
delay_ms(30);
result = (result<<1)|KEY4;
delay_ms(30);
result = (result<<1)|KEY5;
delay_ms(30);
return result;
}
//圈数转换
void computation(void)
{
int i = 0;
for(i=0;i<6;i++){
switch(light_cod[i])
{
// case 0x00:
// result_turn[i] = 0.5;
// break;
case 0x04:
result_turn[i] = 3;
break;
// case 0x06:
// result_turn[i] = 1.5;
// break;
case 0x07:
result_turn[i] = 0;
break;
// case 0x05:
// result_turn[i] = 2.5;
// break;
case 0x01:
result_turn[i] = 1;
break;
// case 0x03:
// result_turn[i] = 3.5;
// break;
case 0x02:
result_turn[i] = 2;
break;
}
delay_ms(10);
}
}
//计算齿轮总圈数
int32_t computation_NUMOFTURN(void)
{
int count = 0;
int32_t NUM_TURN_WG = 0;
while(count<6){
light_cod[count] = Light_Coding(count+0x01);
count++;
}
computation();
NUM_TURN_WG =
result_turn[5]*1024+
result_turn[4]*256+
result_turn[3]*64+
result_turn[2]*16+
result_turn[1]*4+
result_turn[0];
Light_Coding(0x01);
return NUM_TURN_WG;
}
```
复制代码
作者:
panjin88
时间:
2019-7-23 15:01
顶起来
作者:
qq1091310989
时间:
2019-7-23 17:29
很好,谢谢楼主
作者:
鹏博士PBs
时间:
2019-7-24 09:16
rolan是简单的光学测量软件
作者:
tangsj7678
时间:
2019-7-24 13:07
没有人来解答吗,想跟着学习一下
作者:
witheMe
时间:
2019-8-8 10:34
码住学习
作者:
Tadashi
时间:
2019-8-10 13:51
谁来解答一下,我也想知道
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1