pic 12f675 pwm oluşturmak

Başlatan taytis, 18 Nisan 2011, 01:14:36

taytis

Arkadaşlar selam , 12f675 ile bir motor sürmem gerekiyor ; minumum seviyede başlayacak motor en hızlı seviyeye kadar çıkacak sonra tekrar başlıyacak(diğer çıkışıda led koyacağım ledin parlaklığına göre motorun hız indikatörü olucak.). Forumda aradım bir çok başlık açılmış onlarca ama hiç birinde sonuçlanmamış. Bulduğum bir örnek var ama proteus osilaskop saçmalıyo gibi ufacık bir örnek gönderecek olan varsa sevinirim. Aşağıda bulduğum örnek var.

   #include "main.h"#define kirmizi pin_a1#use fast_io(a)float i=0;float pwmon=5;float pwmoff=0;void main(){   setup_adc_ports(NO_ANALOGS|VSS_VDD);   setup_adc(ADC_OFF);   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);   setup_timer_1(T1_DISABLED);   setup_comparator(NC_NC);   setup_vref(FALSE);   set_tris_a(0x38);   output_a(0x00);   while(true)   {   for(i=0;i<1500;i=i+1)//duty cycle on süresi artıyor      {      output_high(kirmizi);      delay_us(pwmon);      pwmoff=1500-pwmon;      output_low(kirmizi);      delay_us(pwmoff);      pwmon=pwmon+1;      }      pwmon=1500;      for(i=0;i<1500;i=i+1)//duty cycle on süresi azalıyor      {      output_low(kirmizi);      delay_us(pwmon);      pwmoff=1500-pwmon;      output_high(kirmizi);      delay_us(pwmoff);      pwmon=pwmon-1;      }   }}



link:https://www.picproje.org/index.php/topic,25200.msg169193.html#msg169193

jackal183

kardeş ilk olarak söyleyeceğim şey kodları ve linkleri eklerken mesaj yazma kısmında kod ekle link ekle gibi şeyleri kullanırsan daha iyi anlaşılır.

ikinci olarak eğer böyle bir uygulama yapmak istiyorsan pwm modulünü kullanabilirsin. kodun hem daha temiz olur hem de hatasız çalışır,

üçüncü olarak CCS'te delay() fonksiyonlarının içine float değişkenleri yazarsan iyi çalışmaz, integer ya da char yazmalısın. integer yazarken de eğer sabit yazacaksan 65536'dan büyük yazarsan hatalı çalışır, yok eğer burada yaptığın gibi değişken yazacaksan da değişkenin değerinin 255'ten büyük olmaması lazım istediğin gibi çalışması için. kodunu ayrıntılı olarak inceleyemedim, dediğim gibi kod ekle bölümünden eklersen daha net inceleme fırsatı oluşur, inceleyebildiğim kadarıyla gördüklerim bunlar.

son olarak da yok ben pwm modulü ile değil böyle yapmak istiyorum diyorsan, o zaman delay fonksiyonları için for döngülerinin içinde şu şekilde birşey yapabilirsin,

en üstte unsigned long int difference diye birşey tanımlarsın. tabi degiskenin de unsigned long int olmalı.

sonra for döngüsünün içinde;
difference=degisken%250;

if(degisken<250){
      delay_us(degisken);
}
else if((degisken>=250) && (degisken<500){
       delay_us(250);
       delay_us(difference);
}

else if((degisken>=500) && (degisken<750){
       delay_us(500);
       delay_us(difference);
}

else if((degisken>=750) && (degisken<1000){
       delay_us(1000);
       delay_us(difference);
}

else if((degisken>=1000) && (degisken<1250){
       delay_us(1250);
       delay_us(difference);
}

else if((degisken>=1250) && (degisken<1500){
       delay_us(1500);
       delay_us(difference);
}


şu an için aklıma gelen bu, hatta bu kod bile böyle bir uygulama için işini görmeyebilir.

Ruzgarbey

merhaba. bana göre bu işi delay_ms komutu yerine tmr0 kesmesini kullanarak ayarlayın.örnek olarak ben dahili osilatörü kullanarak vericem.
bir pwm periyodunu 4 ms olarak ele alırsak 4000/255=15 us e bir kesmeye girmemiz gerekiyor. timer0 ı böyle ayarlarsak her kesme olduğunda ilgli pini 1 veya 0 yaparak pwm elde edebiliriz. kolay gelsin.
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK