熱門: 51單片機(jī) | 24小時必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時間: 2022-10-6 23:32
正文摘要:利用假期時間調(diào)試了新到的EC11編碼器。用了論壇里一個大佬的函數(shù),在此表示感謝!正常手速下(看說明書應(yīng)該是每秒一轉(zhuǎn))測試基本成功,但是暴力手速下(最快速旋轉(zhuǎn))編碼器好像就反應(yīng)不過來了,轉(zhuǎn)很大角度就變化幾個 ... |
沒有最佳的說法,一秒一個脈沖也很好,1秒幾圈也可以。 |
樓主的代碼能分享嗎? |
反正工業(yè)上的編碼器,速度反饋用的,一分鐘800轉(zhuǎn)是基本的。4級電機(jī)60f/p,減去轉(zhuǎn)差1400轉(zhuǎn)每分鐘。 |
感覺基本是成功了。電機(jī)調(diào)速如絲般順滑,比一開始好很多,最快手速也有反應(yīng)了,估計(jì)至少一秒兩圈吧。一點(diǎn)心得體會: 1、要想快,去電容。要想穩(wěn)(防抖),加電容。一開始我有點(diǎn)被百度誤導(dǎo)了,直接放了2個104(0.1uF),事實(shí)證明EC11要想快就直接裸奔,電容兩端電壓不能突變么。但以后我可能會加兩個PF級的電容求個心理安慰。 2、優(yōu)化代碼也很重要。兩個方面:一是主程序各函數(shù)的順序;二是數(shù)碼管顯示函數(shù),一定要用數(shù)組緩存數(shù)據(jù),能極大提升顯示質(zhì)量。我一開始用的74HC245+138驅(qū)動數(shù)碼管,后來換成TM1650,效果一樣的。再就是把顯示函數(shù)放在EC11掃描函數(shù)里面,數(shù)據(jù)變了馬上顯示出來,要減少一切顯示延遲。 3、中斷是個好方法,但不適合我現(xiàn)在的程序。我用定時器0中斷產(chǎn)生脈沖給電機(jī)驅(qū)動器,用定時器1中斷掃描EC11,兩個中斷一疊加,電機(jī)就嘯叫、抖動,時快時慢,根本沒法用。我還是用的一開始發(fā)的那個掃描函數(shù)。 4、至于為什么MCU是89C52,是因?yàn)槲椰F(xiàn)在還不會用別的 ![]() 以上,再次感謝各位大俠的建議和指導(dǎo)! |
使用EC11一直都是用外部中斷來檢測的,不太明白樓主為什么會用到定時器 |
ningsy 發(fā)表于 2022-10-9 10:21 你可以先把你現(xiàn)在的代碼改一下,試一下效果就知道了 把用作PWM的定時器中斷優(yōu)先級設(shè)定為最低,EC11定時器設(shè)定為最高,看一下效果就知道了 因?yàn)镾TC89C52的中斷優(yōu)先級默認(rèn)都是一樣等級的 |
ningsy 發(fā)表于 2022-10-7 15:53 你以為我不懂什么是EC11?我手上的光電編碼器都是400線以上,轉(zhuǎn)速都能超過50圈一秒。 |
對。 我今天把74HC245+138驅(qū)動數(shù)碼管方案換成了TM1650驅(qū)動,已經(jīng)正常顯示了,但感覺又進(jìn)一步拖累了EC11的反應(yīng)。以前有誤區(qū),總想著優(yōu)化某一部分的代碼就行,現(xiàn)在看來要整體考慮了。您說的那個PWM驅(qū)動我去了解一下,后續(xù)這個項(xiàng)目也準(zhǔn)備轉(zhuǎn)移到STC8上來搞。 這個小控制器的事真是越做越多啊。 |
ningsy 發(fā)表于 2022-10-8 15:31 我這代碼用的也是中斷 步進(jìn)電機(jī)也用中斷的話,兩個之間是有沖突的 而且,我的代碼是1KHZ的掃描頻率,而你的是最高9.9KHZ的,占用的資源比EC11的還多,自然就慢下來了 就算你用別的EC11代碼,結(jié)果也是一樣的 問題出現(xiàn)在你的代碼上,跟什么1T/12T的沒有關(guān)系 如果要用PWM驅(qū)動,你應(yīng)該用單片機(jī)自帶的PWM功能,而不是用定時器中斷來產(chǎn)生PWM 如果你用的單片機(jī)沒有PWM功能,那就換一個有PWM功能的單片機(jī),STC89C52早跟這個時代脫節(jié)了 |
//************************************************************************************ 祁緒電子 2021年9月 // //編碼器掃描旋轉(zhuǎn) //************************************************************************************ 祁緒電子 2021年9月 void ROTARY_ROTARY_Scan_Drive() { static bit Turn_Left=0,Turn_Right=0,Rotary_Flag=0; if((ROTARY_A==1)&&(ROTARY_B==1)) //A、然后等待兩個IO口都是高電平 { Rotary_Flag=1; //A、標(biāo)志置一 } if(Rotary_Flag==1) //如果標(biāo)志是1 { if((ROTARY_A==0)&&(ROTARY_B==0)) //C、等待兩個IO口都是低電平 { if(Turn_Right==1) //如果右標(biāo)志是1說明是順時針 { Rotary_Flag=0; //標(biāo)志清0 Rotary_Read_Data_Rotary++; //編碼器增加 } if(Turn_Left==1) //如果左標(biāo)志是1說明是逆時針 { Rotary_Flag=0; //標(biāo)志清0 Rotary_Read_Data_Rotary--; //編碼器減少 } } } Turn_Left=ROTARY_A; //B、首先保存2個IO口的電平狀態(tài) Turn_Right=ROTARY_B; //B、首先保存2個IO口的電平狀態(tài) }//*/ |
Y_G_G 發(fā)表于 2022-10-8 11:03 首先說明:我現(xiàn)在用的MCU是89C52,跟您用的Stc8差遠(yuǎn)了,也沒有1T模式,只能12T(6T 也可能行,我沒用)。我做這個是步進(jìn)電機(jī)控制器,一上電定時器0中斷就不停產(chǎn)生脈沖,頻率100~9900Hz連續(xù)可調(diào)。 我想達(dá)到的效果: 1、電機(jī)運(yùn)轉(zhuǎn)中轉(zhuǎn)速連續(xù)可調(diào),調(diào)速要絲滑無頓挫(操作者感覺好就行,這條基本沒問題了); 2、快速轉(zhuǎn)動EC11調(diào)速旋鈕反應(yīng)要靈敏無跳碼。(現(xiàn)在是每秒1圈沒問題,手速特別快就跟不上,這也是我想解決的問題。 用您的代碼時,89C52沒有的寄存器我全都注釋掉了,用的是定時器1中斷。運(yùn)行時結(jié)果是可以調(diào)速,但調(diào)速時電機(jī)轉(zhuǎn)速不均,時快時慢;手速快時也反應(yīng)不過來。 所以我這種情況是不是不能同時用兩個定時器中斷來控制呢?畢竟控制電機(jī)是主要任務(wù),兩個中斷是不是互相影響?感覺想用好這個EC11編碼器好難,也不知是我用的U太差,還是代碼、電路哪里有問題,我都想給它安排個芯片單獨(dú)控制(如果可以的話),不要再占用MCU了。 |
ningsy 發(fā)表于 2022-10-8 10:52 IO不需要電容 定時器掃描時間改成500uS或者更短時間的話,反應(yīng)可以快一點(diǎn) 因?yàn)橛玫氖侵袛?如果其它中斷打斷的話,可能會慢點(diǎn) 反正,在我這基本是沒有出過問題的 |
Y_G_G 發(fā)表于 2022-10-7 15:20 您發(fā)的代碼我測試了,初步可用,但感覺速度還不夠,不知是不是我沒調(diào)好。 我手里有一個成品步進(jìn)電機(jī)控制器,可連續(xù)調(diào)速,那旋鈕真的靈敏,不管手速多快,就是沒誤碼(也許有,但我感覺不到)。不知是怎么做到的。 我這個也可以連續(xù)調(diào)速,但手速一快就反應(yīng)不過來了。 |
一直用外部中斷做的,硬件部分上拉加電容濾波,沒見到有什么異常 |
從自己的代碼找問題,最快的是中斷處理。查詢處理,如果主程序執(zhí)行的代碼比較長,速度肯定跟不上。 |
coody_sz 發(fā)表于 2022-10-7 15:34 大俠,你說的是“光電編碼器”吧,一個大幾十元,用在醫(yī)療監(jiān)控,高端精密設(shè)備上那種?那種用不起,我這是一個才2塊多包郵的機(jī)械編碼器。 |
EC11質(zhì)量好的1秒至少能5圈,即100脈沖一秒,沒有任何問題。 |
即便,不接電容,1秒兩圈的速度也是沒啥問題的,關(guān)鍵看代碼,還有焊接問題了,虛焊能讓你轉(zhuǎn)了不動,不轉(zhuǎn)亂動。 |
這個是我自己用的,你參考一下,速度不是很快,但正常使用是可以的,定時器掃描速度提高一點(diǎn),可以讀取得快一點(diǎn) /*────────────────────────────────────────────────────────────────────────────────────────────────── EC11_T0.c 編寫:YGG 完成日期:20211118 功能:通過T0定時器來完成EC11編碼開關(guān)的檢測 適用于STC8051單片機(jī)T0定時器編碼開關(guān)函數(shù) 完成狀態(tài):已經(jīng)完成 ──────────────────────────────────────────────────────────────────────────────────────────────────*/ #include "Stc8a.h" #include "EC11_T0.h" sbit sa=P2^2; //編碼開關(guān)的兩個端口 sbit sb=P2^1; //編碼開關(guān)的兩個端口 sbit over=P3^2; //過流檢測IO sbit buzz=P4^0; //用于蜂鳴器控制 bit fa; //用于標(biāo)記編碼開關(guān)兩個端口狀態(tài) bit fb; // 0 為沒有記錄,1 為已經(jīng)記錄 unsigned char turn_f=0x00,turn_r=0x00; //用于存放旋轉(zhuǎn)變量的,一個是正反兩個方向 //────────────────────────────────────────────────────────────────────────────────────────────────── void Timer0Init(void) //T0定時器初始化,1毫秒@11.0592MHz { AUXR |= 0x80; //定時器時鐘1T模式 TMOD &= 0xF0; //設(shè)置定時器模式 TL0 = 0x66; //設(shè)置定時初始值 TH0 = 0xEA; //設(shè)置定時初始值 TF0 = 0; //清除TF0標(biāo)志 ET0 = 1; //T0定時器中斷開啟 TR0 = 1; //定時器0開始計(jì)時 P_SW2=0x80; // P2PU|=0x06; //P2.1,P2.2上拉電阻啟用 P_SW2=0x00; // } //────────────────────────────────────────────────────────────────────────────────────────────────── //────────────────────────────────────────────────────────────────────────────────────────────────── void timer0() interrupt 1 //T0定時器中斷 { static unsigned char bm_data; //用于保存兩個端口讀取到的數(shù)據(jù) TL0 = 0x66; //設(shè)置定時初始值 TH0 = 0xEA; //設(shè)置定時初始值 if(!over)buzz=!buzz; //檢測到低電平,蜂鳴器響 else buzz=0; //────────────────────────────────────────────────────────────────────────────────────────────── if(sa&&sb) //如果兩個端口都是1,就表示編碼開關(guān)位于"靜止" { if(bm_data==0x12) { turn_f++; } else if(bm_data==0x21) { turn_r++; } bm_data=0; //長期靜止?fàn)顟B(tài),端口數(shù)據(jù)要清除 fa=1; fb=1; } //────────────────────────────────────────────────────────────────────────────────────────────────── else if((fa!=sa)||(fb!=sb)) //如果標(biāo)志位的上次的一樣,就不記錄端口數(shù)據(jù) { bm_data=(bm_data<<1)|sa; bm_data=(bm_data<<1)|sb; fa=sa; fb=sb; } } //────────────────────────────────────────────────────────────────────────────────────────────────── |
ningsy 發(fā)表于 2022-10-7 11:55 它其實(shí)就是通過檢測哪個引腳先出現(xiàn)電平的變化來區(qū)分轉(zhuǎn)動方向的 只要你程序合理,不可能只是1秒一圈的 |
51hei截圖20221007145958.png (28.98 KB, 下載次數(shù): 44)
怎么感覺這代碼做復(fù)雜了,EC11沒這么復(fù)雜 |
yanjian 發(fā)表于 2022-10-7 12:10 那您可以試試我發(fā)這個驅(qū)動函數(shù)。 您有外部中斷的例程嗎?我找了一段外部中斷的代碼,可是不能用,可能是有一句代碼有問題,編譯就過不了;注釋掉編譯過了,可旋轉(zhuǎn)編碼器沒反應(yīng) ![]() |
你這還好了,我轉(zhuǎn)太快就抓到錯的數(shù)據(jù). 比如正轉(zhuǎn)時候識別成反轉(zhuǎn). 想快,用外部中斷,一步一脈沖的用下降沿中斷 |
支持---反應(yīng)不過來第一步應(yīng)該看你的代碼。 |
反應(yīng)不過來第一步應(yīng)該看你的代碼。 |
Powered by 單片機(jī)教程網(wǎng)