Selam. 3500 devirde döndürülecek bir motor var. Pic in içindeki 10 bit adc modülünü kullanınca çözünürlük yetmiyor.
12 bitlik bir adc model ve markası verebilirmisiniz?
Örnekleme zamanı 4ms den fazla olmamalı
MCP3204 kullanabilirsiniz,entegre üzerinde 4 adet 12 bit kanal mevcuttur.
motorun hangi değişkenini ölçeceksiniz bu adc verisiyle.
Hız bilgisi. Motor bir tako jeneratöre bağlı. Takojenaratörün ürettiği gerilim 0-5V aralığına çekilip adc ile dijitale çevirilecek bir sorun olmazsa.
size bir özel mesaj gönderdim inceleyebilirsiniz.
Dspic30 ve Dspic33 serilerinde 12 bit adc var
Kontrolcü olarak 16f887 kullanıyorum. MCP3204 'ü deneyeceğim. Teşekkürler.
tek adc lazımsa mcp3301 kullanabilirsiniz.
bir sürü 12bit adc si olan pic var
edit:
18F serisi de var
Alıntı yapılan: Klein - 23 Mart 2011, 12:28:52
tek adc lazımsa mcp3301 kullanabilirsiniz.
Neden? MCP3204' de başka ne özellikler var?
4 adet 12 bit adc girişe sahip MCP3204 tek giriş kullanacaksan diye öneri olarak söylemiş arkadaş.
MCP320x sondaki 4 buradan gelir.
Merhaba Bende Projemde MCP3204 kullanmıştım lakin piyasada bulamadığım için MCP3201 kullandım. Kullanımı için 3 pin gerekli.. mcp3201 için jalv2 dilinde function yazdım eğer istersen ve onu kullanacaksan gönderebilirim.. diğer mcp3204 ve mcp3208 için 4 pin kullanılıyor.. kanal seçme için ekstradan datain adında veri gönderilen bir pini mevcut.. mcp3201 entegresini istanbulda karaköy pasajının orada bulunan turus elektronikte bulabilirsin..
Bana asm kodu lazım. ADC olarak da mcp320x serisinden bulabildiğim bir taneyi kullanırım artık.
Saolun yardımlarınız için.
enkoder bağlasanız daha kararlı olmazmıydı ???? ve böylece adc opamp falan filana gerek kalmazdı
Proje dc motor pid hız kontrolü.
Enkoder nasıl çalışıyor ki?
PID kontrollü olması bir şey değiştirmez. PID giriş değerine tako çıkışı yerine encoder çıkışı verirsiniz.
Encoder devir sayısını frekans çıktısı olarak verir.
Örneğin , 255 pulse encoder kullanırsanız:
1 devirde 255 pulse alırsınız. dakikada 1000 devir dönen bir motor için dakikada 255000 pulse, saniyede 4250 pulse alırsınız. Yani 1000 devir dönen motor için encoder çıkışı 4250Hz olacaktır.
PID girişine bu değeri veya bu değerin bir oranını verirseniz , PID de herhangi bir değişiklik yapmanıza gerek kalmaz.
Bu tip benzer projeyi bende yapmıştım.
projede 12volt dc motor kuıllandım. arkasında kendinden monte edilmiş pulse encoder vardı. motor 1 tur döndüğünde 24 pals veriyordu. motoru PWM ile hızını kontrol edip istenen devirde dönmesi sağlanıyor ve motor miline verilen yüke göre devir düşerse pwm artıyor motor devrini sabit tutmaya çaılışıyor.
Bu işlemi pulse encoderli bir malzeme ile rahat yapabilirsiniz.
Motor sanyodenki marka bir motor ve yanlış bakmadıysak içine bir takojeneratör bağlanmış ve hız bilgisi ordan alınıyor. Sürerken de orayı kullanmam isteniyor.
Hızın anlık değeri kontrol altında tutulacaksa, PID nin leb demeden leblebiyi anlaması yani hatayı çok erken sezip gerekli önlemi alması için tako gerekir.
Eğer motor devrinin sondeğeri kontrol altında tutulacaksa encoder kullanılabilir. Eğer motorun örneğin yol alışındaki devir sayısı da kontrol altında tutulacaksa takodan vazgeçilemez yada çok çok yüksek çözünürlükte encoder gerekir.
Hız sanırım anlık olacak. Yani referans olarak rpm değeri girilecek ve motor o rpm de dönmeye çalışacak.
Bu arada bir adet mcp3201 entegresi aldım karaköyden. Aklıma takılan birşey var.
LCD den girilen 0-3500 arası hız bilgisi ikilik bilgiye çevrilecek. Motor bu bilgiye göre 0-3500 rpm arası dönecek.
Fakat adc 3500 rpm için üretilen voltajı 4098'e bölecek. Yani motor 3500 rpm de döneceği zaman adc' den gelen bilgi FFF olacak. Fakat lcd'den 3500 değeri girildiğinde bunun ikilik karşılığı DAC yapıyor. Bu aradaki uyuşmazlık nasıl giderilebilir?
Digital teknolojinin bu denli güçlü ve ucuz olmadığı dönemlerde tako bir bakıma mecburiyetti.
Şimdilerde duruma göre alternatif çözümler var. Sen en iyisi motorun uygulama alanını söyle tako gereklimi değilmi ordan anlaşılabilir.
Uygulama alanı derken? :o
Hoca proje olarak verdi ;D
Alıntı yapılan: _MOD_ - 31 Mart 2011, 18:32:40
Bu arada bir adet mcp3201 entegresi aldım karaköyden. Aklıma takılan birşey var.
LCD den girilen 0-3500 arası hız bilgisi ikilik bilgiye çevrilecek. Motor bu bilgiye göre 0-3500 rpm arası dönecek.
Fakat adc 3500 rpm için üretilen voltajı 4098'e bölecek. Yani motor 3500 rpm de döneceği zaman adc' den gelen bilgi FFF olacak. Fakat lcd'den 3500 değeri girildiğinde bunun ikilik karşılığı DAC yapıyor. Bu aradaki uyuşmazlık nasıl giderilebilir?
Aradaki uyuşmazlıktan kasıt nedir tam anlamadım. Sanırım kalibrasyondan bahsediyorsun.
Bunun için önce kalibreli bir takometre ve bir hız ayarlayıcı ile ADC de en yüksek değeri okuduğun devri bul.
diyelim ki max 6000 RPM için ADC'den 4095 değerini okuyorsun. ADC de offset olmadığını varsayıyorum.
katsayı= kalibrasyon_hızı/kalibrasyon_hızında_okunan = 6000/4095 = ~1.465
Kalibrasyonu bir kez yaptıktan sonra artık bulduğumuz katsayıyı kullanarak motorun anlık devrini RPM cinsinden hesaplayabiliriz.
anlık hız = katsayı*anlık_okunan
motorumuz 3000 devirde dönüyor olsun. ADC'den okuduğımız değer 2048 olsun
Devir(RPM) = katsayı*ADC = 1.465*2048 = 3000,32 RPM
Alıntı yapılan: _MOD_ - 31 Mart 2011, 18:40:01
Uygulama alanı derken? :o
Hoca proje olarak verdi ;D
O zaman tako kullanmayı gerektiren durumlardan bahsedeyim.
- Çok düşük devir sayılarında bile kontrol gerekiyorsa,
- Geçici rejim davranışıda sıkı sıkıya kontrol altında tutulacaksa,
- Hoca, tako kullanımını şart koştuysa.
Düşük devir sayılarında encoder ile açısal hız ölçümü yapıp devir sayısını sabitlemek hele hele de stabıl olmayan mekanik yüklerde oldukça zordur.
Alıntı yapılan: Klein - 31 Mart 2011, 18:58:58
Alıntı yapılan: _MOD_ - 31 Mart 2011, 18:32:40
Bu arada bir adet mcp3201 entegresi aldım karaköyden. Aklıma takılan birşey var.
LCD den girilen 0-3500 arası hız bilgisi ikilik bilgiye çevrilecek. Motor bu bilgiye göre 0-3500 rpm arası dönecek.
Fakat adc 3500 rpm için üretilen voltajı 4098'e bölecek. Yani motor 3500 rpm de döneceği zaman adc' den gelen bilgi FFF olacak. Fakat lcd'den 3500 değeri girildiğinde bunun ikilik karşılığı DAC yapıyor. Bu aradaki uyuşmazlık nasıl giderilebilir?
Aradaki uyuşmazlıktan kasıt nedir tam anlamadım. Sanırım kalibrasyondan bahsediyorsun.
Bunun için önce kalibreli bir takometre ve bir hız ayarlayıcı ile ADC de en yüksek değeri okuduğun devri bul.
diyelim ki max 6000 RPM için ADC'den 4095 değerini okuyorsun. ADC de offset olmadığını varsayıyorum.
katsayı= kalibrasyon_hızı/kalibrasyon_hızında_okunan = 6000/4095 = ~1.465
Kalibrasyonu bir kez yaptıktan sonra artık bulduğumuz katsayıyı kullanarak motorun anlık devrini RPM cinsinden hesaplayabiliriz.
anlık hız = katsayı*anlık_okunan
motorumuz 3000 devirde dönüyor olsun. ADC'den okuduğımız değer 2048 olsun
Devir(RPM) = katsayı*ADC = 1.465*2048 = 3000,32 RPM
Motor 3500 rpm
Demek istediğim;
lcd'den tuş takımı kullanarak girilen hız bilgisi refh ve refl olmak üzere değişkene atılıyor
adc den okunan değer de addressh ve addressl olmak üzere değişkene atılıyor
lcd' den maksimum hız bilgisini girince refh ve refl ın içerisinde DAC bilgisi olacak
motor maksimum hızda döndüğünde ise addressh ve addressl nin içerisinde FFF bilgisi olacak.
yani lcd'den girilen referans bilgisi ve adc'den gelen hız bilgisi tutmayacak gibi görünüyor
Alıntı yapılan: bunalmis - 31 Mart 2011, 19:01:25
Alıntı yapılan: _MOD_ - 31 Mart 2011, 18:40:01
Uygulama alanı derken? :o
Hoca proje olarak verdi ;D
O zaman tako kullanmayı gerektiren durumlardan bahsedeyim.
- Çok düşük devir sayılarında bile kontrol gerekiyorsa,
- Geçici rejim davranışıda sıkı sıkıya kontrol altında tutulacaksa,
- Hoca, tako kullanımını şart koştuysa.
Evet tako kullanmamı gerektiren durumlar :D
Eğer ADC'den aldığın ham değeri kullanırsan tutmayacak. Ya ADC çıktısını devir bilgisine çevireceksin , ya da tuştakımından girilen bilgiyi PID'de işlemeden önce ADC ye uyduracaksın.
ADC'yi nasıl devir bilgisine çevireceğiniyazdım. Diğeri de ondan farklı değil.
Hee ben referansla felan oynayınca olur gibi bir cevap bekliyordum. O zaman şimdi ondalıklı sayılara felan girmem gerekecek değilmi? Assembly de çalışıyorumda biraz zor oluyor.
Mutlaka asm ile yazman gerekiyorsa floating point yerine fixed point kullanmayı dene. Böylece imkansızı biraz kolaylaştırarak gıcık kıvamına getirebilirsin :)
Fixed point pid de de karşıma çıkmıştı anlamadığım için kullanmadım. Açıkcası pid' de neden fixed pointe ihtiyac var anlamadım. Microchipin örneklerinde 256 almış frekansı. Çarpması gerekince 8 bit sola kaydırıyor, bölmesi gerekince sağa.
peki referansı arttırmak çözüm olmazmı gerçekten? yani 5 V u 4096 ya bölceğine 3500 le 4096 arasındaki orana göre bir artış yapıp onu referans olarak versek?
Alıntı yapılan: _MOD_ - 31 Mart 2011, 20:38:53
Hee ben referansla felan oynayınca olur gibi bir cevap bekliyordum. O zaman şimdi ondalıklı sayılara felan girmem gerekecek değilmi? Assembly de çalışıyorumda biraz zor oluyor.
ondalıklı sayılarda kaç hane kullanmak istiyorsun (gerekli)
16 bit 4 işlem yapan bir asm yazılımı işini görebilirmi.