16f877a DC motor hız kontrolü ve sensörü

Başlatan dgkn, 27 Aralık 2023, 16:07:00

dgkn

Merhabalar. Bitirme projem olarak yaptığım dc motorda hız kontrolü devresini çizdim. fakat bir yere kadar yapabildim birkaç haftadır ilerlemem sıfır. benim sormak istediğim şey şu, H köprüsü ile sürücüyü tasarladım.
16f877a ile PWM sinyalini sürücüye gönderiyorum sürücüde in1, in2 ve enable uçlarım mikrodenetleyiciye gidiyor.
devre bu şekilde ve devrenin fotoğrafını aşağıya ekleyeceğim.
benim asıl sormak istediğim şeye gelirsem. bu sistemin motoruna optik okumalı bir hız sensörü ekleyeceğim bu sensör ile okunan hız lcd ekrana yansıyacak, aynı zamanda bu sensör sayesinde motora yük bindiğinde sistemde ilk başta istenilen değer(rpm) olan değere gelmesi için binen yükün üzerine istenilen değere gelmesi için voltajı arttıracağım bunun kodunu yazamadım
(kodun ana şablonu aklımda ama yazamıyorum, sensörün okuduğu tur sayısının formül ile yazılıma dökülüp RPM'e dönüştürülmesi vs. vs. gerekiyor.)
bu kodu micro c olarak ccs c de yazmam gerekli fakat yazamıyorum
yardımlarınızı bekliyorum
çalışma 0-5V
frekans 976Hz

ete

Herhangi bir kod vs vermediğine göre hiç bi,r şey yazmadın daha. Yazamıyorum deyip bırakmışsın belliki.
Bu sitede genel bir prensibimiz var. Oda işin sahibinin işin ucundan tutması ve bu işi yapamıyorum yada yapamadım şeklinde genelleme yapmak yerine şu kısımda takıldım demesini bekleriz.

Yapmak istediğin sistem aslında son derece basit. Genel anlamda aşağıdakilerin yapılması gerekiyor.
1. Öncelikle uygun bir frekansa sahip bir PWM sinyali elde etmen gerekiyor. Burada neden 976 Hz gibi garip bir frekans seçilmiş onuda anlamak mümkün değil. Motorlar için uygun frekans 5Khz den başlar. Altındaki frekanslarda çalışırlar ancak inleme sesi çıkartırlar. Bu nedenle 5Khz iyidir.

Ortada bir taslak programda olmadığına göre belirli bir OSC frekansında yoktur sanırım.
Hadi diyelimki 4Mhz ile çalışacaksın. Bu OSC frekansında yaklaşık 1Khz lik PWM sinyali elde etmek için; PR2 registerine 249 değerini vermen T2CON registerinde bölme oranını 1/4 alman yeterli olacaktır. Bu durumda 10 bitlik bir çözünürlük elde etmen mümkün olacak ve Max. Duty değerin 1000 olacaktır.

Bu sinyali elde ettikten sonra herhalde bir set devir değerin olacakki devir ölçerek motorun zorlanıp yavaşlaması durumunda gücü artırarak set devir değerine ulaşman gerekecek.

Motor gücü ve dolayısıyla devri PWM sinyalinin Duty değeri ile ayarlanır.
%100 duty ile maksimum gücü alırsın motordan. Gerekmedikçe max güce çıkmazsın. Diyelimki %30 duty değeri ile motoru kaldıracaksın. Bu 1000x30/100=300 duty değerine eşdeğer olacaktır.
Ölçtüğün devir düştükçe belirli oranda hız artırımı yapacaksın. Şimdilik bunu %10 artış veya eksilme ile kontrol etmeye çalış. Hızın 300 ise bunu %10 artırmak demek duty değerini 100 artırmak ile mümkün olacaktır.

Devir ölçme meselesine gelince. En sağlıklısı harici INT kesmesi kullanarak yapılabilir.
Bunun için timerlardan birisi ile zaman tutarken kaç tane INT kesmesi gelecek onu saymak yeterli olacaktır. Tutacağın zaman 1sn yada 1000 ms olabilir. Ancak ben olsam 100ms zaman tutar kesme sayısını 10 ile çarpardım. Böylece gereken devri kısa sürede hesaplaman mümkün olacaktır.
Devir sayısı için motorun her bir turunda sensörün kaç algılama yapacağı önemlidir. Tur başına tek algılama da bu işi halleder ancak tur başına 4 algılama daha hassas bir ölçüm sonucu verir.
Daha işin çok başındasın ve araştırman gereken bir sürü şey olacak.
Diyelimki devri ölçebiliyorsun ve beklenenden daha az hesapladın o halde devri %10 artırman gerekecek. Daha hassas çözünürlüklerde çalışmak için devir %1 lik dilimler halinde de artırılabilir. Ancak ne kadar fazla yüzde kullanabilirsen işin kolaylaşır algılama hızın artar.

Dediğim gibi adım adım giderek önce belirtilen PWM sinyalini elde etmeye çalış onu başardıktan hız kontrolü yapmayı dene ve sonunda devir kontrol mekanizmasını kurarak hız kontrolü ve ona bağlı devir kontrolü işlemine geç.

Ete

dgkn

OSC frekansı 4MHz, TMR2 bölme oranı 4, PR2 ise 255 değerinde. böylece frekans 976 çıkıyor.
10 bitlik bir çözünürlük alırsam bunu pic16f877a nasıl okuyacak çünkü 16f877a bildiğim kadarıyla 8 bitlik diye biliyorum. değerli yorumlarınız için çok teşekkür ederim. dediğiniz gibi işin henüz başındayım.

şuana kadar ekran görüntüsündeki devrenin kodu bu durumda
#include <16f877.h>
#device adc=8
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPUT,NOLVP,NOCPD,NOPROTECT,NODEBUG,NOBROWNOUT,NOWRT

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)

#define use_portb_lcd TRUE
#include <lcd.c>

unsigned int deger;
float voltaj;

void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_4,255,1);

   
   setup_CCP1(CCP_PWM);
   setup_CCP2(CCP_OFF);
   
   setup_adc(adc_clock_div_32);
   setup_adc_ports(ALL_ANALOG);
  
   set_tris_a(0x20);
   set_tris_b(0x00);
   set_tris_c(0x00);
   
   
   
   set_adc_channel(4);
   delay_us(20);
   
   output_c(0x00);
   lcd_init();
   printf(lcd_putc,"\fDC Motor\nHiz Kontrolu");
   delay_ms(1000);
   
   set_pwm1_duty(0);
   
   while(true){
   
   deger=read_adc();
   delay_us(20);
   voltaj=deger/51.0;
  

   
   output_high(pin_c3);
   output_low(pin_c4);
   
   set_pwm1_duty(deger);
   
   printf(lcd_putc,"\fVoltaj=%f V",voltaj);
   lcd_gotoxy(1,2);
   printf(lcd_putc,"Deger=%u",deger);
   delay_ms(1000);

   
   }
   
   
   
   }
   










dgkn

galiba ilk işim uyarılarınız ile başlamak olmalı yani frekans ayarı yapmalıyım
(kısaca benim derdim sensör. Sensörü kodlar ile tanımlayıp, sensörden gelen bilgileri (tur) yazılım ile rpm'e çevirmek. sonrasında ise yüke bindirildiğinde istenilen rpm ve o anki rpm'leri eşitlemek, bunun içinde voltajı yükseltmek sanırım.)

dgkn


ete

PR2=255 ve 1/4 bölme oranı ile 977 Hz lik PWM frekansı elde edersin. Maksimum duty değerin ise 1024 olur. İşlemci 8 bitlikdir ama bütün işlemciler gibi kullanılacak değişkenlerin bit sayısı ile işlemci komut bit sayısı bir birinden ayrı şeylerdir. İşlemcin 8 bitlik olabilir ama 32 bite kadar işlem yapabilir. Buda programda kullandığın değişken cinsleri ile ayarlanır. Dolaysıyla işlemcin hem o pwm sinyalini üretebilir hemde optik sensörlerin yardımı ile motor arkasına bağlı encoder diskini okuyup sana frekansı yada tur sayısını hesaplayabilir.
Ne yazıkki C dilini sana daha fazla yardımcı olabilecek kadar iyi bilmiyorum. Anlarım ama kod yazmam. BU nedenle kod konusunda yalnız başınasın. Ben sana akıl verebilirim ancak.

Ete

Powered by EzPortal