16f877a ile dc motor hız kontrolü

Başlatan selimiii, 14 Ekim 2011, 21:57:07

selimiii

İyi çalışmalar arkadaşlar. Kısa süre önce ccs öğrenmeye başladım. Ccs ile  şu anda dc motor yön kontrolü yapabiliyorum. Şimdi dc motor hız kontrolüne geçmem gerekiyor, pwm kontrolünden bahsedilmiş internette fakat anlayamadım. Elinde örneği olan ya da bu konuda yol gösterebilecek arkadaşlar var mı acaba?

skara1214

ilk önerim Serdar Çiçeğin ccs c ile pic programlama kitabını alman.Pwm konusuna gelincede Pwm nin mantığınımı anlamadın yoksa pwm ccs de nasıl kullanılıyor onumu bilmiyorsun pek anlayamadım ama ben anladığım şekilde açıklayayım.Dc motorda hoz kontrolü yapacaksan eğer en basit yol motorun voltajını değiştirmek yani aslında en iyi hız kontrolü motorun gücünü karşılayabilecek bir dac sistemi kurman fakat direk pic ile hız kontrolü yapmak istediginde piclerin pwm sinyallerini kullanabilirsin(pwm sinyali kare sinyaldir) yani bu söyle çalışır.pic ya 5 volt verir ya 0.mesela yön verdiğin girişe 1 hz lik bir kare sinyal uyguladığını(pwm) varsayarsak bu sinyalin ortalama değeri 2,5 volt olur.tabi bu sinyalin  %50 süresini logic  1 %50 süresini logic 0 değerinde olur.ama sen FREKANS SABİT KALMAK şartıyla logic 1 de kalma ve logic 0 da kalma süresini değiştirirsen  ortalama değişmiş olur ve motorun hızlanır yada yavaşlar işte bu logic 1 de kalma süresi /logic 0 da kalma süresi ne dutycycle denir.yani sen picin pwm çıkışını  kullanarak 5 hz lik kare sinyal üretip bunun dutycycle ile ortalamayı ayarlayabilirsin.bunu illa pwm ile değilde basitce delay komutlarıylada yapabilirsin fakat pwm nin avantajı sen sadece frekansı ve dutycycle ayarlarsın  ondan sonra o sürekli sabit bir şekilde istedigin bacaktan istedigin sinyali verir ve pic o sıra başka işlerle ilgilenebilir.İnşallah bu bilgiler yardımcı olur.
Herkes ölür ama herkes gerçekten yaşamaz

justice_for_all

#2
http://imageshack.us/photo/my-images/41/unled23k.jpg


#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=20000000)

unsigned char adc_data;

unsigned char sayac=0;
#int_RTCC
void  RTCC_isr(void) 
{  
   set_timer0(100);
   
   if(++sayac==10)
   {
      set_adc_channel(0);
      delay_us(20);
      adc_data=read_adc(ADC_START_AND_READ );
      set_pwm1_duty(adc_data);
      sayac=0;
   }

}

#define motor_on()  {output_high(pin_c1);output_low(pin_c3);}

void main()
{

   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
   setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DIV_BY_4,124,1);

   setup_ccp1(CCP_PWM);
   set_pwm1_duty(100);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   
   set_timer0(0);
   
   set_tris_b(0x00);
   set_tris_c(0xF0);
   output_b(0x00);
   output_c(0x00);
   
   motor_on();
   
   while(1);

}
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

selimiii

@justice_for_all : Hocam verdiğin devreyi ısıste kurdum, pakat potansiyometreyi değiştirince motorun hızında bir değişme, similasyonda görünmüyor ? Birde picin c1 bacağındaki çıkışta 100R lik dirençten önce bağlanmış olan power'a benzeyen şey nedir acaba, ne işe yarar? Onu ekleyemedim.

selimiii

skara1214, hocam pwm örneklerini inceledim, internetten devrelerinide buldum, anladım denile biliri, fakat pwm'yi motor devresine nasıl uygulayacağım, yani motor yön devresinde l298 entegresi kullanmıştım, pwm ile hız kontrolünde o entegreye ihtiyacım yok sanırım değil mi?

justice_for_all

hocam o olcu aleti probu gibi bise yani onemli bise degil eklemesende calisir devre bende calisiyo sendede calismasi gerek..hazir devreyi yuklerim ben siteye...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

skara1214

l298 entegresinde in1 ve in2 vardı heralde eger yön belliyse bu bacaklardan 1 tanesini toprağa bağlarsın digerine pwm uygulayabilirsin.yok eger 2 yönde kullanmak istiyorsan 2 bacağada ayrı ayrı pwm uygulaman gerekli.bir yöne dönerken 1 tanesi pwm digeri toprak diğer yönde tam tersi.
eger çift yönlü  kontrol ve  hız kontrolü yapmak istiyorsan sana önerim l18200 entegresidir pahalıdır biraz ama kullanımı çok kolaydır.sadece direction biti ve pwm biti var birde brake var onu toprağa çekersin.
Herkes ölür ama herkes gerçekten yaşamaz

selimiii

justice_for_all: hocam isisde çizdim ama motor hızında bir değişme olmadı, devreyi paylaşabilirsen çok iyi olur gerçekten.

skara1214: hocam Serdar Çiçeğin kitabını aldım dediğin gibi. l298 de dediğin gibi 2 tane input var anladım yapısı ve işleyişini.  Pwm kontrolünü anlatmış kitapta ama değer kodları çözemedim.

örneğin;
setup_timer_2(T2_DIV_BY_16, 170, 1);

pwm timer2 yi kullanıyor biliyorum fakat içerisindeki değerleri neye göre seçtiğimizi, motor için kaç ayarlayacağımızı anlayamıyorum.

başka bir örnekte de;
int i =5;
set_pwm_duty(i);


bu kod bloğunda pwmnin görev çevrimi yani logic 1 süresini ayarlıyoruz sanırım, ama bir önceki kod bloğuyla bunun alakasını çözemiyorum  :(

GreeN

timer2 PWM frekansı için ayarlanır.

setup_timer_2(T2_DIV_BY_16, 170, 1);


PWM_Freq= Kristal_Freq/[(170+1) *16*4]   16 ve 170 nereden geliyor görebildin sanırım. Gerisi starndart.
                 =20Mhz/171/64=1827 Hz gibi bir değer senin pwm sinyalınin frekansı oluyor. Yani Bir peryotluk pwm süresi 1/1827 sn.

Mesela %50 duty cycle için ;

(170+1)*0,5 =85

set_pwm_duty(1,85);

%30 için ;

(170+1)*30/100=51

set_pwm_duty(1,51);





Terörü Lanetliyoruz.

selimiii

Alıntı yapılan: GreeN - 23 Ekim 2011, 22:22:17
timer2 PWM frekansı için ayarlanır.

setup_timer_2(T2_DIV_BY_16, 170, 1);


PWM_Freq= Kristal_Freq/[(170+1) *16*4]   16 ve 170 nereden geliyor görebildin sanırım. Gerisi starndart.
                 =20Mhz/171/64=1827 Hz gibi bir değer senin pwm sinyalınin frekansı oluyor. Yani Bir peryotluk pwm süresi 1/1827 sn.

Mesela %50 duty cycle için ;

(170+1)*0,5 =85

set_pwm_duty(1,85);

%30 için ;

(170+1)*30/100=51

set_pwm_duty(1,51);

anladım hocam.yani
set_pwm_duty(i);

kodunda i değerini değiştirerek duty cyle'ı dolayısı ile motorun çalışma hızını değiştiriyoruz. Peki bir sorum daha olacak;
örneğin hızı azalt butonunda, basıldıkça duty cycle değerini yarıya indireceğim, yada hızı bir kademe düşüreceğim bil algoritma ile.
bunu nasıl yapabilirim ? yani her butona bastığımda i--; gibi birşey mi yazacağım?
İkinci olarak ta azalt butonunda alt limiti ne olmalı, yani i değerinin alacağı en küçük değer, şöyleki;
//azalt butonu içerisinde
if (i<a)
i=a;

burada ki a değeri ne olmalı, aynı sorum arttır butonu içinde geçerli

GreeN

setup_timer_2(T2_DIV_BY_16, 170, 1);

Duty cycle ,yukarıdaki örnek için konuşursak eğer, Max değeri  171 olabilir. Min değeri 0 yapabilirsin. motor durur.

Buton ile yapacağın uygulama için int_ext donanım kesmesini kullanabilirsin.

Kesme aktif olduğunda global olarak tanımladığın duty değerini azaltabilirsin.

Terörü Lanetliyoruz.

justice_for_all

Alıntı yapılan: selimiii - 23 Ekim 2011, 21:28:18
justice_for_all: hocam isisde çizdim ama motor hızında bir değişme olmadı, devreyi paylaşabilirsen çok iyi olur gerçekten.

https://rapidshare.com/files/825710660/motor_hiz_control.rar

linki burda bende calisiyo bide benim dosyami denermisin...
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

selimiii

#12
Alıntı yapılan: justice_for_all - 24 Ekim 2011, 23:35:03
https://rapidshare.com/files/825710660/motor_hiz_control.rar

linki burda bende calisiyo bide benim dosyami denermisin...

hocam motor dönmüyor :s bir şeyi yanlışmı yapıyorum acaba, devreyi play butonu ile çalıştırdıktan sonra tek yapmamız gereken potansiyometrenin değerini değiştirmek değil mi?
Birde proteusun sürümünden kaynaklanıyor olabilir mi? Bende 7.6 sürümü kurulu şu anda.