日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

学习记录--编码器测速

發布時間:2024/3/24 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习记录--编码器测速 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一,編碼器原理詳解:

參考:[野火]《電機應用開發實戰指南》第13章

1,基本參數

(本次實驗所用的增量式編碼器查參數得為13ppr)

2,增量式編碼器基本原理:

3,編碼器的倍頻

?4,M法測速:

5,STM32的編碼器接口實現原理(輸入捕獲定時器)

2倍頻實現為例,其他的原理類同(一個通道的上升和下降沿都計數)

?二,CUBEMX配置

1,定時器配置

需要注意的是:有些編碼器輸出是不帶上拉電阻的,此時就需要將A,B通道的IO口成設置成上拉,本實驗用的編碼器查參數得知是帶上拉輸出(默認上拉到供電VCC引腳),故可用單片機直接采集。

關于幾個成員的理解:

2,打開一個串口傳數據

3,設置兩個輸出IO驅動電機

三,keil中代碼

1,開啟一系列

/* USER CODE BEGIN 2 *///開啟PWM輸出HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);//清零計數器 __HAL_TIM_SET_COUNTER(&htim3, 0);//清零中斷標志位 __HAL_TIM_CLEAR_IT(&htim3,TIM_IT_UPDATE);// 使能定時器的更新事件中斷 __HAL_TIM_ENABLE_IT(&htim3,TIM_IT_UPDATE);//設置更新事件請求源為:計數器溢出(也就是只有計數溢出時觸發更新中斷)__HAL_TIM_URS_ENABLE(&htim3); //使能編碼器接口(TIM_CHANNEL_ALL: TIM Channel 1 and TIM Channel 2 are selected)HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);/* USER CODE END 2 */

2, 寫更新中斷回調函數(計在T0內有多少次溢出,用來計算T0內的總計數次數)

定義變量(關于__IO, 參考博客:(12條消息) 關于"__IO uint32_t" 中的__IO 表達的意思_znmdwahaha的專欄-CSDN博客)

// 定時器溢出次數?
__IO int16_t Encoder_Overflow_Count = 0;

?// 轉向
__IO int8_t Motor_Direction = 0;
// 當前時刻總計數值?
__IO int32_t Capture_Count = 0;
// 上一時刻總計數值
__IO int32_t Last_Count = 0;
// 轉軸轉速?
__IO float Shaft_Speed = 0.0f;

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {/* 判斷當前計數器計數方向 */if(__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3))/* 下溢 */Encoder_Overflow_Count--;else/* 上溢 */Encoder_Overflow_Count++; }

由上述STM32的編碼器接口實現原理:每次捕獲到輸入沿(即編碼器每產生一個脈沖)計數器就計數一次,因此可以通過T0內計數次數和編碼器線數等算出轉速(這里應該是忽略了在一個裝載值內轉向改變帶來的影響)

3,計算轉速,直接在void HAL_SYSTICK_Callback()里寫了(1ms調用一次)

void HAL_SYSTICK_Callback(void) {static uint16_t i = 0;i++;if(i == 1000) //1s計算一次{//電機旋轉方向 = 當前計數器計數方向 Motor_Direction = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3);// 當前計數值 = 當前裝載內計數器值 + 計數溢出次數 * 定時器裝載值 Capture_Count =__HAL_TIM_GET_COUNTER(&htim3) + (Encoder_Overflow_Count * 65535);// 轉軸轉速 = 單位時間內的計數值(當前計數值-上一次計數值) / 編碼器總分辨率(ppr*倍頻)*時間系數(進行單位轉化的)Shaft_Speed = (float)(Capture_Count - Last_Count) / (13*4) * 1;printf("電機方向:%d\r\n", Motor_Direction);printf("電機轉軸處轉速:%.2f 轉/秒 \r\n", Shaft_Speed);//注意輸出的和轉軸處轉速不一樣,還要除一個電機減速比printf("電機輸出軸轉速:%.2f 轉/秒 \r\n", Shaft_Speed/30);// 記錄當前總計數值,供下一時刻計算使用 Last_Count = Capture_Count;i = 0;} }

由于手頭的硬件無法進行實驗,先挖個坑之后再調看是不是通的

總結

以上是生活随笔為你收集整理的学习记录--编码器测速的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。