cube基本配置,外設開啓編碼器,串口2ide
可能你們在設置的時候有這個錯誤函數
錯誤:error: #20: identifier "TIM_ICPOLARITY_BOTHEDGE" is undefinedui
意思是,高級、通用定時器不能用BothEdge,只有基本定時器才能用BothEdge編碼
針對具體的芯片舉幾個例子:基本都是大同小異spa
F4系列:.net
1 /* 編碼器初始化及使能編碼器模式 */ 2 ENCODER_TIMx_Init(); 3 HAL_TIM_Encoder_Start(&htimx_Encoder, TIM_CHANNEL_ALL);
1 /* 獲取捕獲值並計算轉速 */ 2 3 CaptureNumber = ( int16_t )__HAL_TIM_GET_COUNTER(&htimx_Encoder)+OverflowCount*65535; 4 printf("輸入捕獲值:%d \n",CaptureNumber); 5 // 4 : 使用定時器編碼器接口捕獲AB相的上升沿和降低沿,一個脈衝*4. 6 // 11:編碼器線數(轉速一圈輸出脈衝數) 7 // 34:電機減數比,內部電機轉動圈數與電機輸出軸轉動圈數比,即減速齒輪比 8 printf("電機實際轉動速度:%0.2f(圈/s)\n",(float)CaptureNumber/4/11/34); 9 __HAL_TIM_SET_COUNTER(&htimx_Encoder,0);
F1系列 輸出方向與速度code
1 /** 2 * 函數功能: 系統滴答定時器中斷回調函數 3 * 輸入參數: 無 4 * 返 回 值: 無 5 * 說 明: 每發生一次滴答定時器中斷進入該回調函數一次 6 */ 7 void HAL_SYSTICK_Callback(void) 8 { 9 static uint32_t count=0; 10 if(start_flag) // 等待脈衝輸出後纔開始計時 11 { 12 time_count++; // 每1ms自動增一 13 if(time_count==1000) // 1s 14 { 15 /* Get the current direction */ 16 uwDirection = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htimx_Encoder); 17 CaptureNumber=__HAL_TIM_GET_COUNTER(&htimx_Encoder); 18 19 printf("當前編碼器定時器計數方向:%d\n",uwDirection); 20 printf("輸入捕獲值:%d\n",CaptureNumber); 21 printf("1s內編碼器計數值:%d\n",CaptureNumber>=count?CaptureNumber-count:CaptureNumber+65535-count); 22 23 // 11:編碼器線數(轉速一圈輸出脈衝數) 24 // 34:電機減數比,內部電機轉動圈數與電機輸出軸轉動圈數比,即減速齒輪比 25 printf("電機實際轉動速度:%0.2f(圈/s)\n",(float)(CaptureNumber>=count?CaptureNumber-count:CaptureNumber+65535-count)/11/34/2); 26 count=CaptureNumber; 27 time_count=0; 28 } 29 } 30 }
函數應用:blog
這個函數很好用,在電機控制時使用不少接口
__HAL_TIM_SET_COUNTER() 能夠設置計數初值爲須要的值,默認是0get
增量式編碼器四倍頻:
肯定編碼器是多少線的,假設定時器分頻爲0; 則定時器計數爲390*4 = 1560
中斷配置:編碼器模式是能夠不須要中斷的,主要是定時器1和8的配置
注意:這個是我實際遇到的問題,遇到的能夠參考
編碼器是不是OC(集電極開路)門,接了上拉沒有,沒有須要接上啦,若是不使用Z信號,須要把外部中斷清零的那部分代碼去掉
標準庫配置能夠參考:https://blog.csdn.net/wang328452854/article/details/50579832