STM32F10X Incremental Encoder + gürültü

Başlatan z, 28 Mayıs 2015, 20:29:37

z

STM32F103C8 donanımı ile incremental encoder okuyorum.

Encoderin gürültüye açık kablolarını (shield vs yok) motor kablolarının yakınından geçiriyorum. Böylece encoderin A ve B sinyallerinin çipe bağlandığı pinlerde gürültülü bir sinyal elde ediyorum.

Bu şartlar altında motor milini tutarak zorlarsam encoder değeri saçmalamaya başlıyor.

Bu duruma engel olmak için yazılımsal müdahalelerde bulunduysam da işe yaramadı. Çözümü A ve B pinlerinden GND hattına 100pF kapasitörde buldum.

STM32F10x serisi kullanarak encoder ile çalışmış olan varmı?

Timer'ın encoder okuma modu için hazır kütüphane fonksiyonları varsa incelemek istiyorum.

Örnek kod bilen varmı?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan


Mucit23



Bir proje için STM32F103'de aşağıdaki ara devre ile 24V DC motor üzerindeki encoderi okudum.
Gürültü problemi vs yaşamadım hiç.

z

STM32F103'ün  A ve B encoder girişlerine aynı gürültü binerse gürültü donanım tarafından filitrelenme özelliğine sahip.

Bu özelliği kullanamadım. Register yapılandırmasında frekans seçini haricinde bir şey göremedim.

Yoksa mevcut uygulamamda 100pF eklentisi ile hiç bir ekranlama yapılmamış çıplak kablolarla 3000 devirde dönen dolayısı ile 3000/60*512=25600 HZ pulsleri kaçırmadan okuyorum.

100pF ları kullanmadan da bu sorunu çözmem lazım. Çözeyim gene 100pF ları kullanacağım.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

magnetron

#4
http://postimg.cc/image/dov3hxg4p/

yukardaki brushless servo sürücü projesini aynı sebepten durdurdum ( 2010 )

STM32F103RC kullanmıştım

servo motor dönerken 30 - 40 saniyede bir enkoder değeri 5 - 10 puls kaçırıyordu

void TIM_ICInit(TIM_TypeDef* TIMx, TIM_ICInitTypeDef* TIM_ICInitStruct)
{
  /* Check the parameters */
  assert_param(IS_TIM_CHANNEL(TIM_ICInitStruct->TIM_Channel));
  assert_param(IS_TIM_IC_POLARITY(TIM_ICInitStruct->TIM_ICPolarity));
  assert_param(IS_TIM_IC_SELECTION(TIM_ICInitStruct->TIM_ICSelection));
  assert_param(IS_TIM_IC_PRESCALER(TIM_ICInitStruct->TIM_ICPrescaler));
  assert_param(IS_TIM_IC_FILTER(TIM_ICInitStruct->TIM_ICFilter));


standart Peripheral library'de böyle bir fonksiyon var ama bende işe yaramadı yukarda söylediğim gibi

z

#5
Encoder çıkışlarına dediğim gibi 100p eklemeyi denedinmi?

Bu kartı biraz tanıtırmısın?

Standart Peripheral library fallan anlamam ki. Sadece yukarıdaki kısmı debug edebileceğim makineme kopyalar kopyalamaz derleyebileceğim örnek varmı?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CLR

@magnetron

Projenin pcb çizimini kim yaptıysa çok kötü görünüyor.  Bunun projeye bir etkisi olabilir.
Knowledge and Experience are Power

Erol YILMAZ

Encoder sinyali biraz akim basabilirse
220 ohm ile pull down yapabilir misiniz?

magnetron

@Z hocam

100 pF denedim herhalde şimdi çok hatırlamıyorum mutlaka denemişimdir çünkü baya uğraştım

standart peripheral library ST 'nin kendi kütüphanesidir ST 'den indirebilirsiniz register seviyesinde kod yazmaktan kurtarıyor

ama onu kullanamam derseniz

14.4.7 TIMx capture/compare mode register 1 (TIMx_CCMR1)

Bits 7:4 IC1F: Input capture 1 filter
This bit-field defines the frequency used to sample TI1 input and the length of the digital filter
applied to TI1. The digital filter is made of an event counter in which N events are needed to
validate a transition on the output:
0000: No filter, sampling is done at fDTS
0001: fSAMPLING=fCK_INT, N=2
0010: fSAMPLING=fCK_INT, N=4
0011: fSAMPLING=fCK_INT, N=8
0100: fSAMPLING=fDTS/2, N=6
0101: fSAMPLING=fDTS/2, N=8
0110: fSAMPLING=fDTS/4, N=6
0111: fSAMPLING=fDTS/4, N=8
1000: fSAMPLING=fDTS/8, N=6
1001: fSAMPLING=fDTS/8, N=8
1010: fSAMPLING=fDTS/16, N=5
1011: fSAMPLING=fDTS/16, N=6
1100: fSAMPLING=fDTS/16, N=8
1101: fSAMPLING=fDTS/32, N=5
1110: fSAMPLING=fDTS/32, N=6
1111: fSAMPLING=fDTS/32, N=8

bu registerde filtre ayarı var

z

#9
İşte ben de bundan bahsediyorum. Bu registerdeki bu 4 bitdeki değişimin zerre faydasını göremiyorum.

Yaptığım deney şu şekilde;

Encoder A ve B kanallarına bağladığım blendajsız kabloları motor güç kablosuna paralel şekilde doğrudan çipe getiriyorum.

Motoru servo kontrol olarak herhangi bir pozisyonda tutuyorum. Sonra mili parmak gücümle zorlayarak direnmesini haliyle akım çekmesini sağlıyorum. Bir yandan da encoder sayacını ekrandan takip ediyorum. Akım 2A seviyelerine geldiğinde encoder hattındaki gürültüyü scopla izleyebiliyorum. Bu esnada motor direnmeye devam ediyor ama ben daha güçlü olduğum için ve ve counter  değer değiştirmediği için bana dayanamayıp sürükleniyor. Halbuki bu esnada encoder A B çıkışları konum değiştiriyor. Mili yavaş yavaş sürüklüyebiliyorum.  Bu esnada encoder sayacı değişmediği için servo artık sürüklendiği en son konumda kitli kalmaya devam ediyor.

Bu deneyi CCMR1 registerindeki IC1F ve IC2F filitre alanına değişik değerler koyarak tekrarlıyorum. Sonuç değişmiyor.

Ne zaman A ve B kanallarına 100p atarsam sorun ortadan kalkıyor.

Açıkçası bu çip içindeki filitre donanımından şüphelenmeye başladım. Ya da bu registerden filitre değerini seçiyoruz bir başka yerden de aktif ediyoruz. Varsa böyle bir şey ben göremedim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CLR

Mesela Tmr2'de çalışıyorsunuz diyelim ve frekansı 72mhz olsun, dışarıdan okunacak sinyal frekansı 1mhz olsun dolayısıyla 1,5mhz üzerini filtrelemek isteyelim

TIM2_CR1->CKD=2; // 72/4=18mhz (tmr2 freaknsı)

// external input trigger

TIM2_SMCR->ETF = 4; // sample frekansı = 18Mhz/2=9mhz ve N=6 yani 9mhz'de 6 sample alınır

filter frekansı = 9mhz/6=1,5Mhz üzerini filtreler.

Siz uygulamanıza göre düzenleyin. 
Knowledge and Experience are Power

Erol YILMAZ

Donanimsal filtrenin faydasi olup olmadigini anlamak icin,
CLR nin verdigi 1.5 mhz filtre ayarina ilaveten,
2 mhz lik sinyal uygulayip hicbir sayma Olmamasi beklenebilir.

tekosis

hocam çalışmanızda hangi motoru kullanıyorsunuz?
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

z

#13
Aptallığıma doymayayım.

Motor miline bağlı triger kasnağım vida ile mile sıkıştırılıyor. Vidası gayet iyi sıkılı durumda. Daha fazla sıkarsam aluminyum kasnaktaki dişler yalama olacak durumda.
Servo düzeneği elimle zorladığımda motor direniyor motor gürültüsü artıyor bu esnada encoder donanımı bu gürültüden etkileniyor yorumu yapıyordum.
Zira encoder sayacı değişmiyordu. Motor basit bir mekanizmada bir arabayı ileri geri hareket ettiriyor. Arabayı motor direnirken hareket ettirmeye çalışıyorum.

Olan olay şuymuş.

Motorla bilek güreşi yapıyorum. Motor milini zorladıkça motor da bana direniyor. Fakat bu esnada sıkılı olduğunu söylediğim kasnak vidası yeterince sıkılı olmadığından mil dönmediği halde kasnak dönüyor haliyle encoder değeri değişmiyor. Fakat araba konumunu değiştirmiş oluyor.

Dolayısı ile encoderin saymama gibi sorunu yokmuş.

100p eklentisi ile evet gürültüler temizleniyor. Şimdi 100p ları kaldırdım gene sorun yok. En son yaptığım değişiklikleri adım adım eski haline getireceğim ve nerede 100p ihtiyacı var onu tespit edeceğim.

@CLR

ETR pinine ait ayarlamalar Encoder modunda işe yaramaz çünkü encoder modunda TIFP1 ve TIFP2 girişleri kullanılıyor. Dolayısı ile filitreler bu girişlere ait olmak zorunda.

@Tekosis

Manyak güzel bir motor kullanıyorum. Ben bu motora para vermem ödünç kullanıyorum. Fiyatı 500TL civarındaymış.

Birazdan küçük bir video ekleyeceğim.

Elimdeki kasnak bu işe uygun değil. Çift vida ile sıktırılabilen yada bilezik sıktırmalı bir kasnak kullanmam gerekecek.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CLR

#14
o zaman o kanallarda ise yarayan hale getireyim, senin işine yaramazsa da başkasının işine yarayabilir.

TIM2_CR1->CKD=2; // 72/4=18mhz (tmr2 freaknsı)

// hangi kanalları kullanıyorsanız ona göre registeri(CCMR1 veya CCMR2) seçin, ben 1. kanalı yazıyorum

TIM2_CCMR1--->IC1IF= 4; // sample frekansı = 18Mhz/2=9mhz ve N=6 yani 9mhz'de 6 sample alınır

filter frekansı = 9mhz/6=1,5Mhz üzerini filtreler.

Diğer kanalda aynı şekilde.
Knowledge and Experience are Power