這種齒輪很常見,齒輪比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; //從優(yōu)先級為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;
- }
- ```
復制代碼
|