pwm hatası

Başlatan shark27, 03 Şubat 2011, 19:48:22

shark27

selamunelykum sayın üyeler!!:D

ii akşamlar

picbasic le uğraşırken basit olark pwm mantığını kullanarak L298 ile motorun kontrolünü yapıyodum.Eski bi devreyi inceledim.Pic16f877in CCP1 ucunu L298'in IN1 girişine IN2 girişinide şaseye bağlamışım ve

HPWM 1,255,2000 satırı ile motoru tam hız
hpwm 1,125,2000 satırı ile yarım hız döndürebilmişim

şimdi picc ile bu işi yapayım dedim yalnız bu sefer motoru ileri ve geriye döndüreceğim için IN1 ve IN2 girişlerini direkt pic16f877'ye bağlayıp burdan 1-0 veya 0-1 göndermem gerekiyor.onun için pic16f877'nin CCP1 ucunu L298'in SENSA ucuna girdim kurduğum devrenin şeması şu......

[IMG]http://i.imgur.com/8Q1Px.png[/img]


şöe bi program yazdım...

#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
void main()
{
setup_PSP(PSP_disabled);
setup_spi(SPI_SS_Disabled);

setup_timer_1(T1_disabled);

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP2(CCP_OFF);
setup_ccp1(CCP_PWM); // CCP1 PWM moduna ayarlanıyor
setup_timer_2(T2_DIV_BY_16, 127, 1); //


while( TRUE )
{

set_pwm1_duty(10); 
}
}

burada motorun hızını ayarlamam için set_pwm1_duty(10); satırındaki 10 değişkenini değiştirmem gerekmiyormu buraya hangi değeri verirsem vereyim motor proteusta hep aynı hızda dönüyor!!! nereyi yanlış yapıyorum aydınltırsanız sevinirim kolay gelsin ii çalışmalar

VFR

CCP1 bacağını, L298'in Enable bacaklarına bağlamanız gerekiyor çünkü, siz sense'e bağlamışsınız.

shark27

hocam enable bacakları kanalı aktif etme değilmi? "1"  verince o kanal aktif olmyuormu ?

shark27

fikri olan yokmu programsalmı sorun var acaba yoksa donanım olarak mı yanlış düşünüyorum?

shark27

bişeyler yaptım ama pic16f877 in ccp1 çıkışına L298 IN1 ucuna verdim peki aynı kanaldaki motoru nasıl ters döndereceğim o zaman??

FUNKY

in1 ve in2    yön için....  pwm de enableA ya bağlayacaksın   pwm    duty on suresince  motora enerji verilir  bu sure duty ayarıyla değişince enerjide kalma  süresi arttığından   hız artar.. veya  azalır . böyle denermisin ..

shark27

hocam şekli böyle düznledim RA0 butonunua bastıkça motorun hızı artsın istiyorum ama hiç dömüyor ??bi bakarmısınız
[IMG]http://i.imgur.com/qzWSE.png[/img]

devre kodu:

#include <16F877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(d)
int8 i=0;

void main()
{
setup_PSP(PSP_disabled);
setup_spi(SPI_SS_Disabled);

setup_timer_1(T1_disabled);

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP2(CCP_OFF);
setup_ccp1(CCP_PWM); // CCP1 PWM moduna ayarlanıyor
set_tris_a(0x03);
set_tris_d(0x00);
setup_timer_2(T2_DIV_BY_16, 255, 1); //
set_pwm1_duty(i);







while( TRUE )
{
if(input(pin_a0))
{
while(input(pin_a0));
i++;
set_pwm1_duty(i);

}


}

FUNKY

pwm çıkışını   scop a bağlayıp değişimi gözlermisin .. bir de   yanlış değilsem   delaysız arttırma yapmışsın i yi (duty )butona basman la beraber 255 i olur..

shark27

hocam şu anda ccp1 ucunu enable ucuna bağladım programı şöle değiştirdim...

#include <16F877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(d)
int16 i=0;

void main()
{
setup_PSP(PSP_disabled);
setup_spi(SPI_SS_Disabled);

setup_timer_1(T1_disabled);

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP2(CCP_OFF);
setup_ccp1(CCP_PWM); // CCP1 PWM moduna ayarlanıyor
set_tris_a(0x03);
set_tris_d(0x00);
setup_timer_2(T2_DIV_BY_16, i, 1); //
set_pwm1_duty(100);








while( TRUE )
{



setup_timer_2(T2_DIV_BY_16, 150, 1); //


}


}


motor dönüyor ama değerleri değiştirdim

set_pwm1_duty(100); ve

setup_timer_2(T2_DIV_BY_16, 150, 1); // burda


ancak motorun hızı değişmiyor?!!:(

FUNKY

ben proton  biliyorum    senin kodlarını   çözemedim

kendim protonda yazıp simule ettim    aşağıdaki kod  çalışıyor  3 buton .. hız arttır ..  hız eksilt   ve yön değiştir   örnek alarak   kodu sen  kendine göre yazabilirsin  ..
Device 16F877A
Xtal= 4

All_Digital 1
PortB_Pullups= On
CCP1_Pin =PORTC.2

TRISB=%11111111
TRISC=%00000000

Dim duty As Byte
Symbol butart =PORTB.0
Symbol butexi  =PORTB.1
Symbol yon =PORTB.2

PORTC.0=1
PORTC.1=0

duty=10


basla:

If  butart =0 Then
  If duty < 255 Then
  Inc duty
  DelayMS 10
  EndIf
EndIf

If butexi =0 Then
 If duty > 10 Then 
 Dec duty
 DelayMS 10
 EndIf
EndIf

 If yon =0 Then
 Toggle PORTC.0
 Toggle PORTC.1
 EndIf
 HPWM 1,duty,1000
 GoTo basla   
 

shark27

bu protonda picbasice benziyor sanırım picbasicte bende yapmıştımama picc de deniyorum koskoca forumda senden başka cevap yazan yok teşekkürler ...

shark27

anlamıyorum walla eminim sorumun cevabını konuya bakan %90 kişi biliyodur.Ama cevap yazan yok.Neyse böyle olması daha ii belkide ben cevabını çözdüm zaten.....uğraşa uğraşa.Dememkki neymiş foruma takılma yarar yok uğraş uğraş belki bulursun...

LukeSkywalker

Öncelikle isiste osilaskopu kullanarak CCP1 ucundaki sinyalin değişimini izleyin. Bunu yaparken l298 ile PIC bağlantısını kesin ve sonucunu yazın bakalım.
#include <16F877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(d)
int8 i=0;

void main()
{
setup_PSP(PSP_disabled);
setup_spi(SPI_SS_Disabled);

setup_timer_1(T1_disabled);

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP2(CCP_OFF);
setup_ccp1(CCP_PWM); // CCP1 PWM moduna ayarlanıyor
set_tris_a(0x03);
set_tris_d(0x00);
setup_timer_2(T2_DIV_BY_16, 255, 1); //
set_pwm1_duty(i);

 





while( TRUE )
{
if(input(pin_a0))
{
while(input(pin_a0));
i++;
set_pwm1_duty(i);

}


}


Bu kodu kullanın. "i" 'yi char olarak tanımlayın.

shark27

maytere kardeş.Öncelikle şunu belirtmek istiyorum benim bi öğrencim benim nikimle girmiş PID li çizgi izleyen devre için  bana telefon etti ve söyledi bilgin olsun..
diğeri ise sorunumu hallettim .Teşekkür ederim..


/set_pwm1_duty(50);
setup_timer_2(T2_DIV_BY_16, 255, 1); /

LukeSkywalker

Hocam ben mantığını anlattım fakat benden ısrarla kod paylaşmam istendi. Örnek kodda verdim fakat hala benim yazdığım kodu istedi. Şunu söyleyim ki her robot için yazılacak kod farklıdır. En sağlamı verdiğim kod üzerinden giderek kendi tasarımını gerçekleştirmesi bir öğrenci için en iyisi.