STM32F407+CubeMX-使用TIM计算编码器的脉冲总数,并计算脉冲方向
文章目錄
- 一、前言
- 二、本次實驗的編碼器
- 三、編碼器與STM32的連接
- 四、CubeMX的配置
- 4.1、RCC
- 4.2、Clock Configuration
- 4.3、TIM2
- 4.4、生成代碼
- 五、Keil
- 5.1、Target
- 5.2、C/C++
- 5.3、Debug
- 六、代碼
- 6.1、main.c
- 七、DEBUG
- 7.1、用手讓步進電機逆時鐘旋轉約1圈
- 7.2、用手讓步進電機順時鐘旋轉約1圈
- 八、示波器
- 九、細節補充
- 9.1、Encoder Mode
一、前言
STM32工程:
鏈接:https://pan.baidu.com/s/1o4lovPLwxNpSxf_jlLvCBA
提取碼:hf2i
STM32F407,STM32F103,STM32H743的TIM都有編碼器的功能。STM32的TIM上的編碼器功能真的非常強大,它是純硬件計算的,意味著MCU不需要參與脈沖數的計算(所以不需要進入中斷做累加了),MCU只需要在合適的時間上讀一下脈沖總數即可。如果你的閉環控制頻率是500Hz的話,那么每2ms就需要讀一下脈沖總數。通過STM32CubeMX可以非常便利地使用STM32的編碼器功能去讀取編碼器反饋的脈沖數,在CubeMX生成的代碼后,添加一點點代碼就能實現該功能了。
有關步進電機與編碼器的知識介紹,可以查看廣州硬石科技《硬石YS-F4Pro開發板開發手冊》從第40章開始。在嵌入式運動控制領域,廣州硬石科技算是資料比較多的。
在機器人開發中,我經常使用步進電機。為了能夠實現運動的閉環控制,步進電機是一定要增加編碼器的。如下圖所示:
**雖然這邊博文不是介紹編碼器的基本知識,但是為了看懂代碼的目的。**編碼器的關鍵參數需要了解一下:
1、分辨率
其實就是電機的轉軸旋轉一周,編碼器的A相或B相(就是一個相)輸出多少個脈沖信號而已。如下圖的編碼器所示,電機的轉軸旋轉一周,編碼器的某一個相反饋3600個脈沖。
2、脈沖的電壓
脈沖其實就是PWM信號,有1與0兩種狀態。一定要弄清楚脈沖的1是多少V(最好用示波器確認好!!!),不小心的話會燒掉芯片。STM32芯片基本都是支持3.3V與5V(容忍值,在芯片手冊能查到是否支持5V)。
如下這個編碼器,當VCC與GND接入5V時,它的脈沖的最高電壓就是5V。
3、編碼器的相數
一般的工業控制,采用兩相(A/B相)的編碼器足夠。如下圖所示,使用A相/B相就好了,細心的同學肯定發現,不是還有一個Z相嗎?答案是,是有Z相,但是它的作用是電機的轉軸旋轉一周后,才反饋一個脈沖。其實就是反饋電機轉了多少圈。這個Z相真的沒什么用,原因是我通過A/B相也能知道電機旋轉的多少圈,而且轉了1/360也能測出來。但是Z相的話,只能測試1,2,3,4圈,無法測量0.5圈,0.3圈。
二、本次實驗的編碼器
分辨率:1000線 (意思是電機的轉軸旋轉一周,A相反饋1000個脈沖,B相也會反饋1000個脈沖)
脈沖電壓:5V (博文最后,有示波器的觀察,可以看到電壓)
編碼器相數:A/B相(Z相是電機轉軸旋轉一周,才反饋一個脈沖)
三、編碼器與STM32的連接
編碼器與單片機需要在同一個GND上(不然單片機與編碼器怎么溝通呀),接著給編碼器輸入5V電源。
四、CubeMX的配置
4.1、RCC
4.2、Clock Configuration
4.3、TIM2
選擇TIM2的原因是,只有TIM2與TIM5是32位的計數器(-2147483648 ~ 2147483647),其他TIM都是16位的計數器(-32768 ~ 32767)。說白了,當步進電機在旋轉時,16位的計數器會頻繁溢出,程序里要做好計數器溢出的處理。當使用TIM2與TIM5的32位計數器時,我覺得就可以省去了處理"計數器溢出"的問題了。
博文的后面,會解釋為什么選用"Encoder Mode TI1 and TI2"即4倍頻模式。
4.4、生成代碼
五、Keil
5.1、Target
5.2、C/C++
5.3、Debug
六、代碼
6.1、main.c
七、DEBUG
7.1、用手讓步進電機逆時鐘旋轉約1圈
用手擰著電機的轉軸逆時鐘旋轉一周(手動很難做到剛剛好的1圈),encoder_Counter = 4040(Encoder Mode TI1 與 TI2的四倍頻模式),編碼器是1000線 * 4倍頻 = 4000個脈沖。脈沖的方向是:0x01(可以說是CW,也可以說是CCW。這取決于我們項目的定義)
7.2、用手讓步進電機順時鐘旋轉約1圈
程序復位后,用手擰著電機的轉軸順時鐘旋轉一周(手動很難做到剛剛好的1圈),encoder_Counter = -4040(Encoder Mode TI1 與 TI2的四倍頻模式),編碼器是1000線 * 4倍頻 = 4000個脈沖。脈沖的方向是:0x00(可以說是CW也可以說是CCW。但是,如果0x01是CW的話,那么CCW肯定就是CCW)
八、示波器
最后,我用示波器觀察一下電機的B相。步進電機旋轉時,B相究竟會輸出怎么樣的電平。從GIF圖看到,脈沖的高電平電壓是5V左右。
九、細節補充
9.1、Encoder Mode
Encoder Mode一共有三種模式:
1、Encoder Mode TI1
2、Encoder Mode TI2
3、Encoder Mode TI1 and TI2
其實,這三種模式是決定定時器計數的方式,如下圖所示:
通過時序圖來理解Encoder Mode TI1 and TI2為什么能將脈沖數4倍頻,也解釋了TIM是如何判斷脈沖的方向。
總結
以上是生活随笔為你收集整理的STM32F407+CubeMX-使用TIM计算编码器的脉冲总数,并计算脉冲方向的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器显卡驱动修复,AMD发布2020年
- 下一篇: RTX5 | 内存池04 - 共享内存用