16f88 pwm

Başlatan cann, 07 Eylül 2013, 18:41:19

cann

merhabalar
16f88 An0 anolog giriş, B0dan  pwm almak istiyorum. isis de pwm ya 0 yada 5 değerinde çıkıyor ayrıca anolog girişin voltajını artırdıkca frekans düşüyor.

hata nereden kaynaklanıyor


Device = 16F88
Xtal 4
@CONFIG_REQ
@__CONFIG _CONFIG1, INTRC_IO & WDT_OFF & PWRTE_ON & BODEN_ON & MCLR_ON & LVP_OFF & CP_OFF & CPD_OFF & DEBUG_OFF  & CCP1_RB0
@__CONFIG _CONFIG2, IESO_OFF & FCMEN_OFF

Declare Adin_Res 10       
Declare Adin_Tad FRC     
Declare Adin_Stime 50 


Dim bat As Byte

Clear

ADCON1=%10000000
ANSEL = 1
CMCON = 7
TRISB = %00000001
TRISA = %00000101
PORTA=0
PORTB=0

BASLA:

bat=ADIn 0
PWM PORTB.0, bat,1000
GoTo BASLA
End

Maxim

öncelikle neden hpwm kullanmıyorsun?

ikincisi protonun helpine bakmanı öneriyorum
pwm komutundaki duty ve cycles parametrelerinin 8bit olduklarını göreceksin
yani 0-255

senin adc tanımın 8bitmi ? 10bitmi?
10bit = 0-1023 biliyorsun

cycles değerin ise 1000 demişsin o da olmaz

cann

#2
uyarınız üzerine
internal osilatör ayarı nedeniyle

OSCCON=%01101110
Declare Adin_Res 8
PWM PORTB.0, bat,2

yaptım
frekans azaldı; 0-5 volt çıkış devam ediyor, analog değilde dijital çıkış gibi

işin ilginç yanı bat değerini manuel ne versem osiloskopta değişiklik olmuyor

Maxim

#3
16F88 ayarlaması biraz gıcıktır
normal olarak işlemci çalışıyormu?

mesela bir çıkışa led takıp (220ohm direnç ile)
1sn aralıklar ile ledi yakıp söndürebiliyormusun?


mesaj birleştirme:: 07 Eylül 2013, 19:49:47

birde pwm komutu analog voltaj üretmek için kullanılır
o yüzden help dosyasındaki pwm komutu için bir adet seri direnç ve şase ile arasındaki kondansatörüde kullanman lazım
help te şema var
ondan sonra 0-5 volt arasında bir voltaj üretebiliyorsun bu komut ile


klasik pwm çıkışı istiyorsan hpwm komutuna bakmalısın

cann

isis de yapıyorum
devreyi yarin monte edeceğim

aşağıdaki gibi düzelttim
sanırım çalışıyor: çalışmtığını şöyle anladım. osiloskopta voltaj değişmiyor ama analog giriş değerini 1.5 volt aşağısında hpwm yok  2.5 voltu geçitikten sonra iyice artıyor.

teşekkürler

Device = 16F88
Xtal=4
@CONFIG_REQ
@__CONFIG _CONFIG1, INTRC_IO & WDT_OFF & PWRTE_ON & BODEN_ON & MCLR_ON & LVP_OFF & CP_OFF & CPD_OFF & DEBUG_OFF  & CCP1_RB0
@__CONFIG _CONFIG2, IESO_OFF & FCMEN_OFF

Declare Adin_Res 8       
Declare Adin_Tad FRC     
Declare Adin_Stime 50 
Declare CCP1_Pin PORTB.0

Dim bat As Byte

Clear
OSCCON=%01101110

ADCON1=%10000000
ANSEL = 1
CMCON = 7 'COMPARATORS OFF
TRISB = %00000001
TRISA = %00000101
PORTA=0
PORTB=0

BASLA:

bat=ADIn 0
HPWM 1, bat,20000
GoTo BASLA
End

ipek

bu arada PORTB.0 tris'ten giriş olarak ayarlı

TRISB = %00000001

cann

ewt çalışmıyor zaten. led ekledim simülasyona bat 200 ü geçerse yan diye. yanmıyor. osiloskop uyduruyor nasılsa.

ipek

protondan anlamıyorum basicte bunu böyle yapıyoruz .
DEFINE OSC 4

@ DEVICE pic16F88                      'işlemci 16F88                              
@ DEVICE pic16F88, WDT_OFF             'Watch Dog timer Kapatıldı.
@ DEVICE pic16F88, PWRT_ON             'Power on timer açık
@ DEVICE pic16F88, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F88, LVP_OFF             'Low Voltage Programming kapalı
@ DEVICE pic16F88, BOD_ON              'Brow Out Detect açık
@ DEVICE pic16F88, MCLR_off            'MCLR kullanılmıyor
@ DEVICE pic16F88, FCMEN_OFF           'Fail Safe Clok Monitör kapalı
@ DEVICE pic16F88, IESO_OFF            'Internal/External Swıtch Over kapatıldı
@ DEVICE pic16F88, CCPMX_ON         ''''CCPMX kapalı  (default)
@ DEVICE pic16F88, DEBUG_OFF           'Debug kapalı
@ DEVICE pic16F88, WRT_OFF             'Flash Write Protect kapalı
@ DEVICE pic16F88, CPD_OFF             'Data code Protection kapalı
@ DEVICE pic16F88, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
 
OSCCON=%01101110       ' 4 MHz internal Clock 
CMCON = %00000111      ' Turn off comparator bits and set pins to digital I/O

'*****GİRİŞ VE ÇIKIŞLAR*****
TRISA=%00000001
PORTA=0             
TRISB=%00000000
PORTB=0 

'****HPWM AYARLARI**** CCPMX_OFF ise Port0'dan çıkar yoksa port b3'den çıkar
DEFINE CCP1_REG PORTB
DEFINE CCP1_BIT 0


'*****ADC TANIMLAMALARI*****
DEFINE ADC_BITS         10
DEFINE ADC_CLOCK        3
DEFINE ADC_SAMPLEUS     20

ADC1 VAR WORD
DUTY VAR WORD
ADCON1=%10000010        '10 BİT SONUÇ ALMAK İÇİN


BASLA:
ADCIN 0,ADC1
DUTY=ADC1/4
HPWM 1,DUTY,600
gOTO BASLA
END


PortB.0 dan almak için Fuse talimatını yazdım

cann

10 bit yapınca isisde çalıştı???

teşekkürler


Device = 16F88
Xtal=4
@CONFIG_REQ
@__CONFIG _CONFIG1, INTRC_IO & WDT_OFF & PWRTE_ON & BODEN_ON & MCLR_ON & LVP_OFF & CP_OFF & CPD_OFF & DEBUG_OFF  & CCP1_RB0
@__CONFIG _CONFIG2, IESO_OFF & FCMEN_OFF

Declare Adin_Res 10       
Declare Adin_Tad FRC     
Declare Adin_Stime 50 
Declare CCP1_Pin PORTB.0

Dim bat As Byte


OSCCON=%01101110
CMCON=%00000111
TRISA = %00000001
PORTA=0
TRISB = %00000000
PORTB=0
ADCON1.7=1
ADCON0=%01000000

ANSEL =%00011111



PORTB.6=0
PORTB.7=0
DelayMS 100
BASLA:

bat=ADIn 0
HPWM 0, bat,20000
If bat>= 200  Then
PORTB.6=1  'led
End If
If bat<200 Then
PORTB.6=0
End If
GoTo BASLA
End

Maxim

çalışır
ama gene 0-255 arası iş görür
mesela bat 800 olduğu zaman hpwm komutu gene onu 255 olarak alır

cann

teşekkürler İpek ve Maxim

ben bu işden hiç anlamadım, protonda sigortaları iptal etsemde kullansamda her şey aynı,
16f88 in adc si 10 bit, protonda hpwm 8 bit,
en iyisi lcd ile simüle edip rakamları kontrol edeyim bugün