这种齿轮很常见,齿轮比4比1,齿轮通过光学漫反射检测位置信号,是现在市面上最常见的方案
参考资料:
资料.7z
(236 Bytes, 下载次数: 30)
希望能得到有效的建议,现在问题是齿轮安装的时候没有对照机械零点(市场上应该都是这样,都是通过软件来弥补),导致其变化不是线性的,计算出来的圈数会跳变,本人的实现代码如下,或许描述的不是太准确,希望懂的大佬能够帮助我一下,已经研究几个月了各种方法都试过了,如果有算法更好,感激不尽
- /*******************************************************************************
- * 文件名 : 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;
- }
- ```
复制代码
|