DC MOTORUN PWM İLE HIZ VE YÖN KONTROLÜ

Başlatan DemirciMertcan, 17 Aralık 2017, 16:10:23

DemirciMertcan

Merhaba arkadaşlar dc motorun şuan için yön kontrolünü yapabiliyorum ama koduma potansiyometre kullanarak hız kontrolünü de yapmak istiyorum devrede özellikle istenilen şey ise ''Sürülen motorlar en az 1'er amper (nominal) olacaktır. Devreniz daha yüksek pik(ani) akımlara da dayanabilmelidir'' cümlesidir.Ayrıca motorlar sürülürken her hangi bir sürücü kullanılmamalı denildiğinden h köprüsünü kullandım acil olduğundan çok yardıma ihtiyacım var lütfen yardım.
#include <16f877A.h>  

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) 

#define ileri_bir pin_a2
#define stop_bir pin_a1
#define geri_bir  pin_a0
#define ileri_iki pin_a5
#define stop_iki  pin_a4
#define geri_iki  pin_a3



void main ( )
{

     setup_psp(PSP_DISABLED);        
   setup_timer_1(T1_DISABLED);     
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);    
   setup_adc(ADC_OFF);             
   setup_CCP1(CCP_OFF);           
   setup_CCP2(CCP_OFF);   
    
while(TRUE){ 

   if(input(ileri_bir)==1) {
   delay_ms(25);
   output_b(0x9); //00001001
   }
   
      if(input(stop_bir)==1) {
   delay_ms(25);
 output_b(0x0A); //00001010
   }
      if(input(geri_bir)==1) {
   delay_ms(25);
   output_b(0x06);  //00000110
   }
 if(input(ileri_iki)==1) {
   delay_ms(25);
   output_d(0x9); //00001001
   }
   
      if(input(stop_iki)==1) {
   delay_ms(25);
 output_d(0x0A); //00001010
   }
      if(input(geri_iki)==1) {
   delay_ms(25);
   output_d(0x06);  //00000110
   }
  delay_ms(25);

} 
}




vitruvius

Potansiyometreyi okuyup olcekle. Pwm'i de o olcege gore ayarla.

Butonlar icin yazilimsal ya da donanimsal debounce eklemelisin yoksa ilerde buyuk sikintilar yasarsin.

Not: Verdigim link iki sayfadir. Ikinci sayfada yazilimsal ve donanimsal cozumlerde bulunulmus.

DemirciMertcan

Alıntı yapılan: vitruvius - 18 Aralık 2017, 12:16:51
Potansiyometreyi okuyup olcekle. Pwm'i de o olcege gore ayarla.

Butonlar icin yazilimsal ya da donanimsal debounce eklemelisin yoksa ilerde buyuk sikintilar yasarsin.

Not: Verdigim link iki sayfadir. Ikinci sayfada yazilimsal ve donanimsal cozumlerde bulunulmus.
Şimdi şöyle ki ccp1 ve ccp2 den elde edilen çıkışın biri ileri diğeri geri olduğunu düşünürsek 2 motora nasıl paylaştıracağım bunu ve ayrıca 2 adc nasıl tanımlanır acaba yardımcı olabilir misiniz kod hakkında

kimlenbu

16f877 kullanmayalı asır oldu ama özelliklerine baktım, 2 pwm var, bu konuda şanslısın. 8 kanal da ADC var, bu konuda da şanslısın.


Öncelikle ADC'den 2 motor için de hız bilgisini oku


http://saeedsolutions.blogspot.com.tr/2013/02/pic16f877-adc-code-proteus-simulation.html


Ardından bu değere karşılık gelen duty cyle'ı pwm ile oluştur.


http://arduinotik.blogspot.com.tr/2015/04/pic16f877a-pot-ile-pwm-kullanarak-dc.html

mehmet

İki büyük hata görüyorum:
Birincisi mosfet gate pinlerinin en az 7V oması
gerektiğini düşünüyorum, zira mosfet tipi belirtilmemiş.
Eğer lojik seviyede sürülen mosfetlerden ise belirtilmesi
gerekmekte.

İkinci olarak da LOW Side yük sürmek çok verimsizdir.
En basit  olarak üst taraftaki mosfetlerin P-Ch olarak
değiştirilmesi veya mosfet sürücü kullanılması gerekmektedir.

https://www.youtube.com/watch?v=eXvCupv74tQ
https://youtu.be/LUJc_t6Bd9w

Bir kaç video serisi var burada, Bülent Hoca 'nın. Vakit
ayırıp izleyiniz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

DemirciMertcan

Alıntı yapılan: mehmet - 18 Aralık 2017, 18:12:10
İki büyük hata görüyorum:
Birincisi mosfet gate pinlerinin en az 7V oması
gerektiğini düşünüyorum, zira mosfet tipi belirtilmemiş.
Eğer lojik seviyede sürülen mosfetlerden ise belirtilmesi
gerekmekte.

İkinci olarak da LOW Side yük sürmek çok verimsizdir.
En basit  olarak üst taraftaki mosfetlerin P-Ch olarak
değiştirilmesi veya mosfet sürücü kullanılması gerekmektedir.

https://www.youtube.com/watch?v=eXvCupv74tQ
https://youtu.be/LUJc_t6Bd9w

Bir kaç video serisi var burada, Bülent Hoca 'nın. Vakit
ayırıp izleyiniz.



Kusura bakmayın dediğim gibi pic ve proje konularında altyapım çok zayıf şuan h köprüyle yapılan motor devlerelini inceledim ona göre tekrar dizayn ettim



DemirciMertcan

#6
Alıntı yapılan: kimlenbu - 18 Aralık 2017, 17:42:26
16f877 kullanmayalı asır oldu ama özelliklerine baktım, 2 pwm var, bu konuda şanslısın. 8 kanal da ADC var, bu konuda da şanslısın.


Öncelikle ADC'den 2 motor için de hız bilgisini oku


http://saeedsolutions.blogspot.com.tr/2013/02/pic16f877-adc-code-proteus-simulation.html


Ardından bu değere karşılık gelen duty cyle'ı pwm ile oluştur.


http://arduinotik.blogspot.com.tr/2015/04/pic16f877a-pot-ile-pwm-kullanarak-dc.html

Gönderdiğiniz adc kaynağı için çok teşekkür ederim ama daha sade 2li adc kullanımını hala kavrayamadım elimde tek motoru ileri geri kontrol eden(şuan bu bağlantı yüksek ihtimal yanlış ama iki motor aynı anda aynı yönde dönüyor) kod örneği var üzerinde baya adc ve pwm kod eklemeleri yaptıysam olmuyor ya kodda hata veriyor ya da derleme başarılı olsa bile dönme işlemi sağlanmıyor bu şemanın ccs kodu ise şöyle
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device ADC = 10
#use delay(clock = 8000000)
#use fast_io(B)
#use fast_io(C)

unsigned int16 i ;
void main(){
  port_b_pullups(TRUE);                  // Enable PORTB pull-ups
  output_b(0);                           // PORTB initial state
  set_tris_b(7);                         // Configure RB0, RB1 & RB2 as inputs
  output_c(0);                           // PORTC initial state
  set_tris_c(0);                         // Configure PORTC pins as outputs
  setup_adc(ADC_CLOCK_DIV_32);           // Set ADC conversion time to 32Tosc
  setup_adc_ports(AN0);                  // Configure AN0 as analog
  set_adc_channel(0);                    // Select channel AN0
  setup_timer_2(T2_DIV_BY_16, 255, 1);   // Set PWM frequency to 488Hz
  delay_ms(100);                         // Wait 100ms
  while(TRUE){
    i = read_adc();                      // Read from AN0 and store in i
    if(input(PIN_B3) == 1)               // If direction 1 is selected
      set_pwm1_duty(i);                  // Set pwm1 duty cycle
    if(input(PIN_B4) == 1)               // If direction 2 is selected
      set_pwm2_duty(i);                  // Set pwm2 duty cycle
    delay_ms(10);                        // Wait 10ms
    if(input(PIN_B0) == 0){              // If RB0 button pressed
      if(input(PIN_B3) == 0){            // If direction 1 not already selected
        output_b(0);                     // Both LEDs OFF
        setup_ccp1(CCP_OFF);             // CCP1 OFF
        setup_ccp2(CCP_OFF);             // CCP2 OFF
        output_c(0);                     // PORTC pins low
        delay_ms(100);                   // Wait 100ms
        setup_ccp1(CCP_PWM);             // Configure CCP1 as a PWM
        output_high(PIN_B3);             // RB3 LED ON
        }}
    if(input(PIN_B1) == 0){              // If RB1 button pressed
      if(input(PIN_B4) == 0){            // If direction 2 not already selected
        output_b(0);                     // Both LEDs OFF
        setup_ccp1(CCP_OFF);             // CCP1 OFF
        setup_ccp2(CCP_OFF);             // CCP2 OFF
        output_c(0);                     // PORTC pins low
        delay_ms(100);                   // Wait 100ms
        setup_ccp2(CCP_PWM);             // Configure CCP2 as a PWM
        output_high(PIN_B4);             // RB4 LED ON
        }}
    if(input(PIN_B2) == 0){              // If RB2 button pressed
      setup_ccp1(CCP_OFF);               // CCP1 OFF
      setup_ccp2(CCP_OFF);               // CCP2 OFF
      output_c(0);                       // PORTC pins low
      output_b(0);}                      // Both LEDs OFF
   }
}

Şemanın şekili ise bu şekilde(2.motor ve butonları ben eklemiştim.)