877a da HPWM etkinleştirmek

Başlatan . Kağan, 21 Mart 2014, 17:09:05

. Kağan

ETE hocanın notlarına bakarak bir HPWM sinyali üretmeyi denedim. Kodlar aşağıda. CCP1 ve CCP2 bacaklarından osiloskopla ölçüm yaptığımda bir sinyal alamıyorum.

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : KAGAN AYANOGLU                                    *
'*  Notice  : Copyright (c) 2014 SERBEST                        *
'*          : All Rights Reserved                               *
'*  Date    : 20.3.2014                                         *
'*  Version : 1.0                                               *
'*  Notes   :  16F877A                                                  *
'*          :  EC METRE                                                 *
'****************************************************************
@ __config _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _CP_OFF
 

DEFINE OSC 4
CMCON=7
ADCON1 = %10000000
TRISB = 0
PORTA = 0
PORTB = 0
PORTC = 0
PORTD = 0
CCP1CON.2=1 'bu  iki komut ile PWM sinyali açılmış olacaktır
CCP1CON.3=1
T2CON = %00000101     'Bölücü 1/1 olarak verildi ve TMR2 aktif hale  getirildi.
PR2=124                'PWM-Peryot= (124+1) x 4 x ¼ x 1 =500 us  ve F=1000/50 = 2 KHz PWM  frekansı dır.

'**************** ADC chanel setting  ************************
DEFINE ADC_BITS 10 ' ADCIN    çözünürlük  (Bits)
DEFINE ADC_CLOCK 1 ' ADC  clock kaynağı  (Fosc/8)
DEFINE ADC_SAMPLEUS 3 ' ADC  örnekleme zamanı (uSec)


'****************HPWM PRESETİNG*********************
DEFINE CCP1_REG   PORTC  'Hpwm 1 pin port
DEFINE CCP1_BIT     2    'Hpwm 1  pin bit
DEFINE CCP2_REG   PORTC  'Hpwm 2 pin port
DEFINE CCP2_BIT     1    'Hpwm 2 pin bit

DEFINE LCD_DREG PORTB      'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4          'LCD data bacakları hangi bitten başlıyor? ***
DEFINE LCD_RSREG PORTB     'LCD RS Bacağı Hangi Porta bağlı ?         
DEFINE LCD_RSBIT 1         'LCD RS bacağı Hangi Bite bağlı ?        4 ***
DEFINE LCD_EREG PORTB      'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 0          'LCD Enable Bacağı Hangi bite bağlı ?    5
DEFINE LCD_BITS 4          'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2

BILGI VAR BYTE
EC_1 VAR BYTE
EC_2 VAR BYTE
SICAKLIK VAR BYTE
I VAR BYTE


pause 100

'HIGH PORTD.2
'PAUSE 10  'Bekleme
   
EC_1 = 0
i = 0
bilgi = 0
   
   
MAIN:   
     
   ADCIN 0, BILGI  '  bilgi+=read_adc();
   FOR I=0 TO 59   '   for(i=0;i<=99;i++)
   EC_1 = bilgi/60
   next
   PAUSE 1000       ' //delay_ms(1000);


  LCDOUT $FE,1
  PAUSE 150
  LCDOUT $FE,$80, "EC_1 : "         
  LCDOUT $FE,$86, DEC EC_1       
  PAUSE 10
 
   
goto main

ete

Yalnızca sinyali aktifleştirmek yetmez. Birde sinyalin Duty değerini ayarlamanız gerekiyor.
Şu anda yaptığınızda sinyal aktif ancak duty muhtemelen sıfır olduğu için sinyal çıkmıyor.
  DUTY=xxx 
  CCP1CON.4=DUTY.0
  CCP1CON.5=DUTY.1
  CCPR1L=DUTY>>2

Frekans 20Khz olarak belirtilmiş. Bu frekansta max (%100) duty değeri için 200 kullanılmalıdır. %50 Duty değeri ise 100 olacaktır. Siz 100 kullanın.

Ete

. Kağan

#2
Hocam kodda bir düzeltme yaptım ama. Bir daha bakarmısınız. PBP da bu iş ne kadar zormuş. Levent Ali kolayca halletmişti. Bu dediklerinizi yaptım ama yine bişey yok.

@ __config _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _CP_OFF
 

DEFINE OSC 4
CMCON=7
ADCON1 = %10000000
TRISB = 0
PORTA = 0
PORTB = 0
PORTC = 0
PORTD = 0
CCP1CON.2=1 'bu  iki komut ile PWM sinyali açılmış olacaktır
CCP1CON.3=1
T2CON = %00000101     'Bölücü 1/1 olarak verildi ve TMR2 aktif hale  getirildi.
PR2=124                'PWM-Peryot= (124+1) x 4 x ¼ x 1 =500 us  ve F=1000/50 = 2 KHz PWM  frekansı dır.

'**************** ADC chanel setting  ************************
DEFINE ADC_BITS 10 ' ADCIN    çözünürlük  (Bits)
DEFINE ADC_CLOCK 1 ' ADC  clock kaynağı  (Fosc/8)
DEFINE ADC_SAMPLEUS 3 ' ADC  örnekleme zamanı (uSec)


'****************HPWM PRESETİNG*********************
DEFINE CCP1_REG   PORTC  'Hpwm 1 pin port
DEFINE CCP1_BIT     2    'Hpwm 1  pin bit
DEFINE CCP2_REG   PORTC  'Hpwm 2 pin port
DEFINE CCP2_BIT     1    'Hpwm 2 pin bit

DEFINE LCD_DREG PORTB      'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4          'LCD data bacakları hangi bitten başlıyor? ***
DEFINE LCD_RSREG PORTB     'LCD RS Bacağı Hangi Porta bağlı ?         
DEFINE LCD_RSBIT 1         'LCD RS bacağı Hangi Bite bağlı ?        4 ***
DEFINE LCD_EREG PORTB      'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 0          'LCD Enable Bacağı Hangi bite bağlı ?    5
DEFINE LCD_BITS 4          'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2

BILGI VAR BYTE
EC_1 VAR BYTE
EC_2 VAR BYTE
SICAKLIK VAR BYTE
I VAR BYTE
DUTY var BYTE

pause 100

'HIGH PORTD.2
'PAUSE 10  'Bekleme
   
EC_1 = 0
i = 0
bilgi = 0
   
   
MAIN:   
   DUTY=100 
   CCP1CON.4=DUTY.0
   CCP1CON.5=DUTY.1
   CCPR1L=DUTY>>2
     
   ADCIN 0, BILGI  '  bilgi+=read_adc();
   FOR I=0 TO 59   '   for(i=0;i<=99;i++)
   EC_1 = bilgi/60
   next
   PAUSE 1000       ' //delay_ms(1000);


  LCDOUT $FE,1
  PAUSE 150
  LCDOUT $FE,$80, "EC_1 : "         
  LCDOUT $FE,$86, DEC EC_1       
  PAUSE 10
 
   
goto main

ete

Main ile birlikte program HPWM sinyali çıkartacak ise elbette Main den evvel, değilse ne zaman sinyal çıkacak ise oraya bir kere koyup vermeniz yeterlidir. Bu duty değerini bir kere verirseniz geri planda çalıştığı için sinyali kapatıncaya kadar PWM sinyali çıkmaya devam eder.

Ete

. Kağan

@ __config _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _CP_OFF
 

DEFINE OSC 4
CMCON=7
ADCON1 = %10000000
TRISB = 0
PORTA = 0
PORTB = 0
PORTC = 0
PORTD = 0
CCP1CON.2=1 'bu  iki komut ile PWM sinyali açılmış olacaktır
CCP1CON.3=1
T2CON = %00000101     'Bölücü 1/1 olarak verildi ve TMR2 aktif hale  getirildi.
PR2=124                'PWM-Peryot= (124+1) x 4 x ¼ x 1 =500 us  ve F=1000/50 = 2 KHz PWM  frekansı dır.

'**************** ADC chanel setting  ************************
DEFINE ADC_BITS 10 ' ADCIN    çözünürlük  (Bits)
DEFINE ADC_CLOCK 1 ' ADC  clock kaynağı  (Fosc/8)
DEFINE ADC_SAMPLEUS 3 ' ADC  örnekleme zamanı (uSec)


'****************HPWM PRESETİNG*********************
DEFINE CCP1_REG   PORTC  'Hpwm 1 pin port
DEFINE CCP1_BIT     2    'Hpwm 1  pin bit
DEFINE CCP2_REG   PORTC  'Hpwm 2 pin port
DEFINE CCP2_BIT     1    'Hpwm 2 pin bit

DEFINE LCD_DREG PORTB      'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4          'LCD data bacakları hangi bitten başlıyor? ***
DEFINE LCD_RSREG PORTB     'LCD RS Bacağı Hangi Porta bağlı ?         
DEFINE LCD_RSBIT 1         'LCD RS bacağı Hangi Bite bağlı ?        4 ***
DEFINE LCD_EREG PORTB      'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 0          'LCD Enable Bacağı Hangi bite bağlı ?    5
DEFINE LCD_BITS 4          'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2

BILGI VAR BYTE
EC_1 VAR BYTE
EC_2 VAR BYTE
SICAKLIK VAR BYTE
I VAR BYTE
DUTY var BYTE

pause 100

'HIGH PORTD.2
'PAUSE 10  'Bekleme
   
EC_1 = 0
i = 0
bilgi = 0
   
   
MAIN:   
   DUTY=100 
   CCP1CON.4=DUTY.0
   CCP1CON.5=DUTY.1
   CCPR1L=DUTY>>2
     
   ADCIN 0, BILGI  '  bilgi+=read_adc();
   FOR I=0 TO 59   '   for(i=0;i<=99;i++)
   EC_1 = bilgi/60
   next
   PAUSE 1000       ' //delay_ms(1000);


  LCDOUT $FE,1
  PAUSE 150
  LCDOUT $FE,$80, "EC_1 : "         
  LCDOUT $FE,$86, DEC EC_1       
  PAUSE 10
 
   
goto main


Burada hata varmı

ete

#5
Hata görmüyorum. Bir programda hata aramak için onu çalıştırmak gerekir.
Hata denilen şeyin çok bariz bir yazım hatası olmadan görülmesi kolay değildir.
Gerçek anlamda hata aramak için programı çalıştırmam gerek. Bunuda yapamayacağıma göre ancak görsel olarak ve yüzeysel bir hata kontrolü yapabilirim. Üstelik bu bir alışkanlık oldu bende. Kendi hatalarımıda programı çalıştırınca görebiliyorum artık.

Bu nedenle burada hata varmı diye lütfen sormadan önce programını  çalıştır programı (simule et) beklenmedik bir şey görürsen hata var demektir. İçinden çıkamaz isen sor.

Bir önceki mesajımda ne demiştim; Duty değerini bir kere verdinmi değiştirmediğin sürece sinyal çıkar.
Sen ne yapmışsın. Hemen Main altına sabit bir duty değeri vermişsin program 1 sn içinde belkide binlerce defa main etiketine gelecek ve sürekli aynı komutu uygulayacak. Buna gerek yok ki. Duty=100 vermek istiyorsan ve bunu program içinde değiştirmeyecek isen Main den evvel 1 kere verdinmi aleti kapatıncaya kadar sinyal Duty=100 olarak sinyal verecektir.
Sürekli aynı duty değerini vermek bile sinyalin çıkmasını etkileyebilir. Duty değeri yalnızca değiştiği zaman verilir. Mantıken de öyle değilmidir? Bir şey değişecek ise değiştirilir değiştikten sonra aynı kalacak ise ona bir daha dokunmazsın.

Ete


. Kağan

#6
ETE usta yada bana ayıracak vakti olan ilgilenebilecek bir arkadaş...

Benim gözümüzden birşey kaçıyor ama bulamadım. PWM sinyali çıkmıyor. Simulasyon dosyası ekte sizde bakabilirmisiniz.


. Kağan

#7
Takip edenlerin bilgisine
DEFINE CCP1_REG PORTC       	 'HPWM PORTC.1
DEFINE CCP2_REG PORTC        'HPWM PORTC.2
DEFINE CCP1_BIT 2                        'CCP1 PİNİ PORTC.2
DEFINE CCP2_BIT 1                        'CCP1 PİNİ PORTC.1

HPWM 1,127,1000  '%50 İŞ SÜRESİ OLAN VE 1000 PWM SİNYALİNİ  PORTC.1'DEN GÖNDER



Şeklinde yazılırsa yani "HPWM 1,127,1000"  Burada "1 - Portc.1 'yi", "127 iş süresini", "1000 ise frekansı" gösteriyor. Bu kod eklenirse PWM sinyali çıkıyor.

Teşekkürler.

Powered by EzPortal