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