Picproje Elektronik Sitesi

DERLEYİCİLER => CCS C => Konuyu başlatan: jackal183 - 03 Temmuz 2011, 21:38:26

Başlık: dspic30f2023-pwm ve CCS
Gönderen: jackal183 - 03 Temmuz 2011, 21:38:26
arkadaşlar dspic30f2023 için CCS'te picwizard kullandım, başlangıç ayarlarını wizardda nasıl yapacağımı tam bilemedim, öyle kafadan salladım yaptım ve oluşturduğu main.h dosyasında şunları getirdi karşıma,

#include <30F2023.h>

#FUSES WSPA8                 
#FUSES WSPB1                 
#FUSES FRC                      //Internal Fast RC Oscillator
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES CKSFSM                   //Clock Switching is enabled, fail Safe clock monitor is enabled

#use delay(clock=20000000)


main.c ise şu şekilde oluştu,
#include <main.h>



void main()


   setup_compare(1,COMPARE_PWM | COMPARE_TIMER2 );
   setup_timer2(TMR_INTERNAL | TMR_DIV_BY_1,0 );
   setup_spi( FALSE );



   setup_timer1(TMR_DISABLED|TMR_DIV_BY_1);



   // TODO: USER CODE!!

}


bu şekliyle programı derlediğimde main.h için şu şekilde hata verdi;
unknown keyword in #FUSES WSPA8
     unknown keyword in #FUSES WSB1


bu satırları kaldırdığımda başka hata vermedi, bu hatalar nedir neden veriyor bilen var mı?
dspic serisi için CCS'te wizardda başlangıçta yaptığımız ayarlar için bir kaynak bilen var mı? ben CCS'in sitesini biraz kurcaladım ama bulamadım
Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: GreeN - 04 Temmuz 2011, 16:12:25
30F2023 datasheat içinde  "18.0 SYSTEM INTEGRATION" diye geçen bir bölüm var..

Burada ;
• Oscillator Selection
• Reset:
- Power-on Reset (POR)
- Power-up Timer (PWRT)
- Oscillator Start-up Timer (OST)
• Watchdog Timer (WDT)
• Power-Saving modes (Sleep and Idle)
• Code Protection
• Unit ID Locations
• In-Circuit Serial Programming (ICSP)
programming capability

gibi başlıklar . Bu bölümü incelersen daha iyi olur. Wizard ile bazen açıklaması olmayan kodlar oluşturuluyor bunlarda genelde hata veriyor. Ne olduğunuda bilmiyorum açıkcası.

Ayrıca ccs c 'de tools sekmesinin altında "Device Editor " var. Sağ üst kısım MCU'nun config değerlerini içeriyor, inceleyebilirsin.
Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: jackal183 - 04 Temmuz 2011, 16:29:22
teşekkür ederim, datasheeti inceledim ancak çok fazla ayar olduğu için kafama karıştı anlamaya çalışıyorum, bahsettiğiniz "device editor" ü de hemen inceliyorum
Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: iyildirim - 04 Temmuz 2011, 18:07:15
CCS bilmem, kullanmam ama görebildiğim kadarı ile PWM için CCP modülü ayarlanıyor.

PWM frekansı çok düşük değilse, 2020-2023 gibi çok güçlü 4x2 SMPS PWM modülü olan işlemcide PWM üretmek için CCP modülü kullanmak çok da anlamlı değil..
İşlemci adeta PWM üretmek için özelleştirilmiş..

SMPS PWM modülü ile 4 ayrı frekansda ve duty de PWM oluşturabilirsiniz.
Tek sıkıntısı frekansın çokda düşük kullanılamaması..  Ki işlemci zaten SMPSlerde kullanılmak üzere tasarlanmış.

CCS kullanmadığımdan CCS'nin bu modülü desteleyip desteklemediğini bilmiyorum ancak registerlere direkt atamaları yaparak kullanabilirsiniz.

Microchip'in sitesinde işlemcinin ana sayfasında smps pwm modülü ile hem datasheet, hemde çeşitli uygulamalar için örnek kodlar da var.

http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en026341 (http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en026341)  işlemci ana sayfası,

http://ww1.microchip.com/downloads/en/DeviceDoc/70270C.pdf (http://ww1.microchip.com/downloads/en/DeviceDoc/70270C.pdf) SMPS PWM ref manual

Örnek kodlar, ve smps pwm modülü ile ilgili registerlere bakabilirsiniz.

Bu işlemci ile bayağı çalıştım.. Kısaca SMPS pwm registerlerinin ne işe yaradığını yazmaya çalışayım..

Eğer sadece PWM oluşturacak, pwm kesmelerini, akım sınırlama, faz kaydırma deadtime vs. kullanmayacaksanız, sadece PTCON, PTPER, MDC, IOCONx, PWMCONx, PDCx, PHASEx registerleri yeterli.

PTCON modülü enable-disable yapma, kesme durumları..

PTPER ana modül period-frekans ayarı, 4 ayrı kanal buna bağlanabilir veya PHASEx registeri ile kanallara ayrı period-frekans atanabilir.
bağımlı- bağımsız period için PWMCONx.ITB  kullanılır.

Yeri gelmişken, işlemci max hızda çalıştırılıdığında pwm için yaklaşık 960mhz gibi bir frekans pwm counterlarını besliyor.. Buna görede period ve duty çözünürlüğü yaklaşık 1.05ns gibi birşeye karşılık geliyor..  Endüstryel olanlarda yanılmıyorsam bunun yarısı gibi bir frekans kullanılıyor.

MDC  ana modülün duty'si , 4 ayrı kanal buna bağlanabilir veya PDCx registeri ile kanallara ayrı, ana modülden bağımsız duty atanabilir. bağımsız-bağımlı duty ayarı için PWMCONx.MDCS kullanılır..

IOCONx,  hangi pinlerin PWM üreteceği, dolayısıyla hangi pwm generatörlerinin aktif olacağı, low-high kanalların enable disable edilmesi, kesme, fault durumları, aktif darbenin low veya high olduğu, PWM pinlerinin ilişkisi-PWM modu,  complementary, push-pull, independent modları..

complemantary modda PWMxL pini, PWMxH pininin low olduğu zamanlarda high oluyor.
push-pull modda pinler sıra ile pwm üretiyor, yani bir pwm darbesi boş geçiliyor.
independent modda pinler birbirlerinden bağımsız çalışıyor..


PWMCONx kanalın ana modül period'u veya duty'sine bağlı veya bağımsız olduğu, kesme üretilme, dead time kontrolü..

PHASEx kanalın bağımsız period'u,
PDCx kanalın bağımsız duty'si ..

x modül numarası 1-4 arasında .. .

Diğer registerler,
TRIGCONx, TRIGx kesme üretilme zamanı,   
LEBCONx kenarı boş bırakma, merkezlenmiş darbe üretme, faz kaydırma ayarları..

Örnek olarak, sadece 1. PWM generatörü  ana period ve duty den bağımsız kullanıldığı durumda şöyle bir kod dizisi yeterli.
Kullanılmayan kanallar için  IOCONx = 0 yeterli..



IOCON1 = 0b1100010000000000;  //PWM1H ve PWM1L pinleri PWM olarak çalışacak. 1 nolu pwm genratörü bağımsız period modunda, Aktif pwm darbesi high,
PWMCON1 = 0b0000001110000000; // tüm kesmeler kapalı,  ana modül peryodundan (PTPER) bağımsız (ITB=1), duty bağımsız (MDCS),  dead time disable..
PTPER = 0xFF00;
MDC = 0;
PHASE = 60000;
PDC = 30000; // %50 duty
PTCON = 0b1000000000000000;  //modül aktif..




Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: jackal183 - 04 Temmuz 2011, 22:18:27
hocam bu anlattıklarınız çok iyi oldu hatta şu an siz benim için cevhersiniz :)  ben de zaten bu işlemciyi smps için kullanacağım, yalnız merak ettiğim birşey var, ben bu işlemcilerin datasheetlerini inceledim, bu datasheetlerde alışık olduğum diğer pic datasheetleri gibi değildi, söylemek istediğim şey aslında tablolar, atıyorum pic16f877 datasheetini açınca, adcon1 register'ı olsun ccpcon register'ı olsun, hepsinin tabloları var ve bu tabloada bu registerlara hangi değerleri verdiğimizde ne şekilde çalışacağı yazıyor, ben dspic30fxxxx serisi için böyle birşey göremedim- siz gördüyseniz hangi sayfada söyler misiniz?- ve bu yüzden bu anlattığınız register'ların ne işe yarayacağını, bunlara ne gibi değerler verebileceğimi bilemedim, ancak örnek uygulamardan yola çıkarak çözmeye çalıştım, örnek uygulamalarda da her uygulama farklı bir iş için verildiği için yine anlayamadım hangi registera ne gibi değerler vereceğimi.


edit: bahsettiğim tablolar 2023 datasheetinde var ama ben 30f4013 mü 30f2023 mü henüz tam karar veremediğim için 4013'ün de datasheetini inceliyorum ve 4013 datasheetinde bu tablolar yok





Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: iyildirim - 04 Temmuz 2011, 23:21:18
smps için kullanacaksanız, 2020- 2023 kullanmak daha iyi. Hem pwm leri çok güçlü hemde adc leri çok hızlı. İyi tarafıda pwm vs ile adc tetiklemek, sample anını belirlemek gibi şeyler  yapılabiliyor.  4013 motor kontrolunde daha iyi olabilir.

Linkini verdiğim işlemcinin ana sayfasında çeşitli kod örnekleri var.
Uygulamanızda nelere, ne tür bir pwm ' e ihtiyacınız  olduğunu belirledikten sonrası çok da karışık değil. 8 bitlikleri pek bilmiyorum. O yüzden datasheetleri karşılaştıamayacağım. Ancak bir bir modülün ayrı datasheet'i var. linkini verdiğim smps pwm modülü ile ilgili dökümanda özellikle module functionality kısmına bir bakın. çeşitli smps uygulamalarında ne,  niye ne zaman tercih edilir konusu daha anlaşılır olacaktır.  Registerleri düzenlemek daha kolay.  Hesap gerektiren tek şey de period, duty vs. gibi şeyler ki bunlarında hesabı çok karışık değil..
Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: jackal183 - 05 Temmuz 2011, 07:34:08
tavsiyenizi dikkate alacağım hocam tekrar teşekkürler
Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: jackal183 - 05 Temmuz 2011, 17:30:55
hocam bugün dspic ile ADC denemesi yapmaya başladım sabahtan beri uğraşıyorum bir türlü yapamadım, datasheeti( section 17. 10 bit A/D Converter) inceledim datasheetin sonundaki examples bölümüne de baktım ama sonuç olumsuz, kodu bir kontrol eder misiniz rica etsem?

AN4'ten giriş alıp, aldığım girişe göre portf' e bağlı ledleri yakmayı ve söndürmeyi amaçlıyorum.


int main (void)
{
int ADCValue;
int i,j;

TRISF=0;
LATF=0;
                ADPCFG = 0xFFEF; // all PORTB = Digital; RB4 = analog
ADCON1 = 0x0002; // SAMP bit = 0 ends sampling ...
// and starts converting
ADCHS = 0x0404; // Connect RB4/AN4 as CH0 input .
ADCSSL = 0;
ADCON3 = 0x0002; // Manual Sample, Tad = internal 2 Tcy
ADCON2 = 0;
ADCON1bits.ADON = 1; // turn ADC ON
while (1) // repeat continuously
{
ADCON1bits.SAMP = 1; // start sampling ...
for(i=0;i<2000;i++); // delay
ADCON1bits.SAMP = 0; // start Converting
while (!ADCON1bits.DONE); // conversion done?
ADCValue = ADCBUF0; // yes then get ADC value
if(ADCValue<200)
LATF=0xFFFF;
else
LATF=0x0000;

}
        return 0;
}
Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: iyildirim - 05 Temmuz 2011, 17:49:55
İşlemci nedir, 2023 değil sanırım..



Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: jackal183 - 05 Temmuz 2011, 17:57:05
işlemci olarak elimde 4013 vardı onunla deneme yaptım, ancak bu yaptığım işlemlerin 30f serisinin hepsi için geçerli olduğu yazıyor datasheette yani burda;
http://ww1.microchip.com/downloads/en/DeviceDoc/70064E.pdf (http://ww1.microchip.com/downloads/en/DeviceDoc/70064E.pdf)
Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: iyildirim - 05 Temmuz 2011, 18:22:14
Genel olarak doğru. Aynı aileden işlemciler için geçerli.. 30F lerdeki smps, motor control ve generic olan ailelerdeki işlemcilerin bazı modülleri farklı.. Aynı şekilde 33FJ lerde de öyle.

2023 ile 4013 de ADC modülleri açısından aynı değil..

Çok detaylı incelemedim, ancak ilk bakışta göze çarpan hata AN4' ü okuyup sonucu ADCBUF0 dan almaya çalışmak.. 

ADCValue = ADCBUF4;

şeklinde bir deneyin,

Sanırım bir örnekten yararlanılmış, diğer resister atamalarını aynen kullandıysanız hata olacağını sanmam,
Sorun devam ederse detaya inilir.
 
Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: jackal183 - 05 Temmuz 2011, 20:42:18
kesinlikle dediğinizi ilk olarak ben de düşündüm ve ADCBUF4 e eşitledim ama sonuç yine aynı, hiç bir değişiklik olmuyor, bu yazdıklarımı da aynen microchipin verdiği örnekten aldım, esasında microC'nin örnek bir ADC kodu var denedim güzel çalışıyor ancak microC hazır kütüphaneler oluştumuş kod da hazır kütüphanelerle işliyor ancak ben dspic öğrenmek istediğim için register atamalarını kendim yapmak istiyorum, bu yüzden bunları soruyorum
Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: iyildirim - 05 Temmuz 2011, 22:15:21
Kodda ciddi bir sorun göremedim. 
Sadece ADCHS registeri hem A hemde B mux ları aktif olacak şekilde set edilmiş, ancak adcon2 de sadece muxA kullan denildiğinden bunun da sorun olmaması gerekli.
Başka da birşey göremedim.

ADCHS = 0x0004; şeklinde bir deneyin. 

Ben sample süresini hiç kontrol etmem. Bu şekilde hiç kullanmadım.. Gerçi bu işlemciyi de hiç kullanmadım. Ancak adc'si 33f lerdeki 10-12 bit adc ile neredeye tıpatıp aynı.

Sorun devam ederse  sample süresini otomatik yapıp  (ADCON1bits.SSRC =b111 ve ADCON3bits.SAMC = 4) 
for ile beklemeyi ve ADCON1bits.SAMP = 0 satırlarını kaldırıp deneyin.

Okumalar ADCBUF0 üzerinden yapılmalı.

0dan 15 'e kadar ADCBUFx var. Ancak 0 ve 1'in dışındakiler sürekli sıralı okumalarda kullanılıyormuş.. Yani ADC kesmesini 16 okumada bir set ederseniz sırayla bütün okumaları  buffer'a atıyor. Yani 1. okuma buf1, 2 okuma buf2 de gibi.  Burada buffer sürekli okunduğundan daima ADCBUF0 okunmalı.

2023 lerde de birden fazla buffer var. Ancak bufferlar ayrı ayrı her bir kanala bağlı. AN0 buf0, an1 buf1 ... gibi.

Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: jackal183 - 05 Temmuz 2011, 22:26:59
bakalım bi deneyeyim yarın
Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: GreeN - 06 Temmuz 2011, 15:24:19
Alıntı yapılan: iyildirim - 04 Temmuz 2011, 18:07:15
CCS bilmem, kullanmam ama görebildiğim kadarı ile PWM için CCP modülü ayarlanıyor.

PWM frekansı çok düşük değilse, 2020-2023 gibi çok güçlü 4x2 SMPS PWM modülü olan işlemcide PWM üretmek için CCP modülü kullanmak çok da anlamlı değil..
İşlemci adeta PWM üretmek için özelleştirilmiş..

SMPS PWM modülü ile 4 ayrı frekansda ve duty de PWM oluşturabilirsiniz.
Tek sıkıntısı frekansın çokda düşük kullanılamaması..  Ki işlemci zaten SMPSlerde kullanılmak üzere tasarlanmış.


@iyildirim

dsPIC30F Switch Mode Power Supply (SMPS) digital signal controllers

dsPIC30F1010
• dsPIC30F2020
• dsPIC30F2023

http://ww1.microchip.com/downloads/en/DeviceDoc/70273A.pdf

yukarıdaki pic'ler sanırım SMPS için özel tasarlanmış , söylemek istediğin bu mu?

dspic30f4012 'de Capture/Compare/PWM Peripherals (4adet/2adet) ve Motor Control PWM Channels   (6adet) PWM modul var. Yukarıda değindiğiniz bir konu dikkatimi çekti. Yanlış anlamadıysam PWM modulü olarak "Compare" değilde  "Motor Control PWM"'i uygun ayarlarda kullanmak daha mantıklı demişsiniz. Tabi frekans konusuna da değinmişsiniz. Mesela ben basit 100 hz. bir PWM sinyal ile çalışmam gerekecek. Bunu Compare (oc1,oc2) ile yapmamın dez avantajı ne olabilir? Osilaskopum yok çıkışın stabilitesine bakamıyorum. Bu modül yeterli değil mi? 

Diyelimki Motor Control PWM kullanacağım PWM çıkışı  PWM1H'  mi olacak PWM1L mi? Aşağıda ;
IOCON1 = 0b1100010000000000;  //PWM1H ve PWM1L pinleri PWM olarak çalışacak. 1 nolu pwm genratörü bağımsız period modunda, Aktif pwm darbesi high,

PWM1H ve PWM1L pinleri PWM olarak çalışacak demişsiniz .  İkisinde de pulse mevcut oluyor mu?

Saygılarımla.
Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: iyildirim - 06 Temmuz 2011, 16:47:57
Evet, bu işlemciler SMPS serisi olarak geçiyor. Zaten üzerindeki modüllerin özellikleri de smps için üretildiklerini gösteriyor.

Benim gördüğüm, diğer serilerden en önemli farkları PWM ve ADC  modülleri. Ayrıca üzerinde 4 adet de komparator var.
PWM modülünün en önemli farkı, period ve duty çözünürlüğünün  çok iyi olması. ADC de 30f lerdeki en hızlı ADC.

Ayrıca diğerlerinden farklı olarak , (diğerleri derken CCP modülleri değil MC pwm'i kastediyorum) PWM darbesi ile ADC sample anını senkronlama, komparatorlarla PWM darbesini sonlandırma gibi özellikleri var. MC serilerinde de PWM fault girişleriyle bu var ancak modülün tamamı için geçerli olacak şekilde. Bunlarda her bir PWM generatörü (4 adet) için ayrı ayrı yapılabiliyor. Birde 4 adet PWM generatörü olduğu için 4 farklı period ve duty destekleniyor.

Tabii bir de çeşitli formlar da PWM üretmek vs. de mümkün..  Complementary, push-pull vs.

Bana göre tek sıkıntısı da düşük frekanslara inilememesi.

Gerçi MC serilerinde de çok düşük frekansa inilemiyor. En düşük neydi hatırlamıyorum ama 33FJ256MC710 da da  50 Hz'lik servo besleyebileceğim bir frekansa inememiştim. 8 kanal PWM üretme işini OC kullanarak yapmıştım.

Bu arada OC kullanmanın herhangi bir mahsuru yok.  Elimdeki dandik scop ile baktığımda OC ile üretilen PWM'in MC veya SMPS ile üretilenden bir farkını göremedim. Zaten datasheet lerde de CCP modülü glicth engellenmiştir gibi ifadeler var.
Örneğin servo için 50-100 hz pwm oluşturmak gibi bir işde CCP modülü kullanmanın herhangi bir dezavantajı yok.
Ancak SMPS veya motor kontrolü gibi konularda akım, gerilim, ters akım vs. bir sürü şeyi çok hızlı bir şekilde kontrol etmek sözkonusu olduğunda CCP modülü bu iş için üretilmiş PWM modüllerinin yanına bile yaklaşamaz..

PWM1H ve PWM1L pinlerine gelirsek,
Her bir PWM generatöründeki pinler Low ve High olarak isimlendirilmiş bir çift. Bunların istediğimiz herhangi birini aktif yapıp PWM ile sürülmesini sağlayabiliyoruz. Kullanmadığımız pin varsa GPIO olarak ne ayarlı ise o oluyor. Yine aktif PWM darbesinin low veya high olduğunu da söyleyebiliyoruz.

Verilen örnekte pinlerin her ikisinde de PWM darbesi olacak.
Bu seçilen PWM moduna ve diğer bazı şeylere bağlı.

Eğer PWM modu olarak independent seçili ise her iki pindede puls olacaktır.
complemantary seçili ise low pinde puls,  (dead time vs ye de bağlı olarak ) high pin de puls olmadığında olacak. Dead time gözönüne alınmazsa daima biri high iken diğeri low olacak..
Push-pull da ise sırayla bir high, bir low pinde puls oluyor. Yani pin olarak bakınca bir pwm darbesi boş geçiliyor.

Yeri gelmişken,
Ayrıca overwrite denilen bir özellik daha var. Bunun için de her bir pwm generatöründe OVRDAT ve OVREN  adında her pin için iki ayrı register var.
OVRDAT, OVREN 1 olduğunda pine sıfırmı birmi basılacağı söylüyor. Aynı şekilde fault girişleri aktif olduğunda pinlere ne basılacağı da ayrıca söylenebiliyor.

Örneğin bir H köprü ile hız kontrollü bir DC motor sürelim.
PWM1 köprünün sol yarımı, pwm2 sağ yarımı olsun. Highlar üst low lar da alt mosları kontrol etsin.
Motor bir yöne dönerken sadece PWM1H ile PWM2L çalışacak. 1L ve 2H duracak.
Bunun için

2020-2023 de
IOCON1bits.OVRDAT = IOCON2bits.OVRDAT = 0b00; tanımlayıp,  sonrasında

bir yön için
IOCON1bits.OVRENH = IOCON2bits.OVRENL = 0;
IOCON2bits.OVRENH = IOCON1bits.OVRENL = 1;

diğer yön için de
IOCON1bits.OVRENH = IOCON2bits.OVRENL = 1;
IOCON2bits.OVRENH = IOCON1bits.OVRENL = 0;
demek yeterli.
Aynı şekilde decay akımlarını kontrol etmek için de overwrite registerleri kullanmak işi kolaylaştırıyor.  Örneğin darbe kesildiğinde oluşan ters akımı hızlı sönümlendirmek için yukarıdaki örnek kullanılabileceği gibi yavaş sönümlendirmek için alt mosu sürekli açık tutup alt moslarda akımı çevirerek sönümlendirmek de mümkün..

MC serilerinde overwrite registerleri tek bir register içerisinde tüm kanalların bitleri olacak şekilde tanımlı olduğu için yön, decay vs. gibi kontrolleri duruma - hıza bağlı indekslenmiş arraylarda kontrol edilebiliyor, ve bana göre motor kontrolu açısından daha mantıklı ve verimli..

Çok uzattım.. Konu-soruda biraz dağıldı..

Sadede gelirsek tüm bu nedenlerden dolayı SMPS veya MC PWM modülleri varken özellikle motor kontrolü vs. gibi konularda CCP modülü kullanmak çok da verimli değil deyip bitireyim..

Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: GreeN - 06 Temmuz 2011, 17:34:07
Gerçekten çok aydınlatıcı oldu. Olaya vakıf olduğunuz belli , zaman ayırdığınız için teşekkür ederim.
Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: jackal183 - 06 Temmuz 2011, 19:23:26
hocam ADC'yi denedim bu kez 2020 elime geçti ve bunun datasheeti daha aydınlatıcı ve verdikleri sample code da güzel çalışıyor, yardımlarınız için teşekkür ederim
Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: jackal183 - 07 Temmuz 2011, 17:16:05
hocam bugün de pwm ile uğraştım pwm üretmeyi başardım ancak bir sorum var, garip geldi biraz, datasheette şöyle bir formül verilmiş;

(http://imageshack.us/photo/my-images/204/adszjk.jpg)

ve yine datasheette formül ile ilgili olan PTPER registerı için "PTPER<15:3>: The Primary Time Base Period (PTPER) register holds the 13-bit value that specifies the counting period for the primary PWM time base." şeklinde bir açıklama var. buradan ne anlamalıyım son 3 bitin 0 ya da 1 olması önemsizse eğer, o zaman PTPER=FFFF yazsam da sonuç aynı olacak PTPER=FFF8 yazsam da aynı olacak? o zaman hesaplama yaparken 0 ile mi 1 ile mi hesap yapacağız?

formüle göre PLL=32, CLOCK=15 MHz diyelim, PTPER registeri 65536( son 3 biti 1 olarak alırsak) olur. o zaman elde edebileceğimiz minimum frekans;

frekans= 32*2*15*1000000/65536= 14648 hz yapar. CLOCK=4 MHz alırsak da frekans=3906 Hz eder. ancak verilen bilgilerde bu dspicin 50 hz'e kadar düşebildiği yazıyor, nasıl düşecek? PLL değerini 1 almayı düşündüm, ancak PLL değerini enable etmek gerekiyormuş datasheette yazdığına göre;
"The Phase-Locked Loop (PLL) must be enabled for the Power Supply PWM module to function. This is achieved by setting the FNOSC<1:0> bits in the FOSCSEL configuration register." e verdiği örnekte de PLL=32 almış, peki bu PLL=1 nasıl yapacam böyle birşey mümkün mü?

yukarıda eklediğim resim görünmüyor, bahsettiğim formül burda sayfa 27 de http://ww1.microchip.com/downloads/en/DeviceDoc/70270C.pdf (http://ww1.microchip.com/downloads/en/DeviceDoc/70270C.pdf)
Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: iyildirim - 08 Temmuz 2011, 14:55:03
Datasheet'de verilen formül doğru.. Oluşturduğun PWM'e scop la bakma şansın olduysa sende görmüşşündür..

PTPER registerine değer yüklerken son üç bite değer atanıp tanmadığına hiç takılmadım. İşlemlerde çıkan değer ne ise onu kullandım.
Zaten son üç bitin karşılığı 8ns.   
Aslında burada söylenen şey de frekans çözünürlüğünün 8ns ve katları şeklinde gittiği.. Duty ise 1 ns çözünürlükte ayarlanabiliyor.
Datasheet'in 24. sayfasındaki şekile bakılırsa daha rahat anlaşılabilir.

Bu şekilde 960khz frekans da bile çalışılsa 10 bitlik duty çözünürlüğü elde edilmiş oluyor. 960khz den bir düşük frekans ise 959khz gibi birşey. Yani ayarlayamadığımız şey frekansın 959500hz olması.

50Hz'e inmek gibi birşeyi denemedim. Ancak 2020 lerde SMPS pwm moülünün bu kadar düşük frekansla çalışılabileceğini sanmıyorum. Sanırım ancak işlemcinin hızı da düşürülerek yapılabilir ki çok da anlamlı olmaz.. pll kullanmayınca olacakmış gibi ama sizinde yaptığınız alıntı da yazdığı gibi pll olmadan pwm modülü de çalışmıyor.

Datasheetlerde çeşitli hatalar ve çelişkilerde var. Örneğin endüstriyel ve extended olanların karşılaştırıldığı tabloda I/P için fpwm 480mhz deniyor. aslında 960mhz. Extended olanlarda ise 480. Her ikisini de kullandığım için eminim..

Ayrıca 2020-2023 ilk smps serileri. Bolca da hataları da var. Herhangi bir saçmalıkla karşılaşınca Errata  dökümanlarına bakmak adetim oldu..




Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: jackal183 - 08 Temmuz 2011, 16:58:30
scop ile baktım verilen formül doğru evet, ancak ben 2020 ile hem 100 khz hem de 1 khz lik iki farklı pwm oluşturmak istiyorum, 100 khzde sorun yok zaten datasheettte verilen örnek direk 100 khz verilmiş temiz çalışıyor, ancak bu formüle göre 1 khz asla üretemem. PLL kullanmadan deneyeceğim, bakalım oluyor mu, hocam bu errata dökümanları nedir peki? bir de bu PLL=32 sabit midir, değiştirelebilir mi?
Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: iyildirim - 08 Temmuz 2011, 17:34:00
İki farklı frekansda PWM üretmek için en az bir pwm generatörünü ITB  = 1 şeklinde, independent time base modunda kullanmak gerekli. Bu durumda da  periodu Phase registeri ile belirlemek gerekli.
Sıkıntı 1 khz olmasında. Açıkçası 30F lerle pek fazla uğraşmadım. En çok kullandığım 2020 oldu. Onda da 20khz ve üzeri frekanslarla uğraştım. 1khz'e inermi bilmiyorum.

2020 nin oscillator ile ilgili datasheetlerinde belki cevabı vardır.
Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: necati - 19 Mart 2022, 10:48:50
bu hatayı nicin veriyor
*** Error 128 "C:\Program Files\PICC\Devices\30F4013.h" Line 11(9,21): A #DEVICE required before this line

#include <30F4013.h>
#DEVICE ADC=10
#FUSES NOWDT                     //No Watch Dog Timer
#FUSES XT_PLL8                   //XT Crystal Oscillator mode with 8X PLL
#FUSES NOCKSFSM                  //Clock Switching is disabled, fail Safe clock monitor is disabled
#FUSES BORV27                    //Brownout reset at 2.7V
#FUSES NOBROWNOUT                //No brownout reset
#FUSES PROTECT                   //Code protected from reads
#FUSES MCLR
#use delay(clock=80000000)

#use standard_IO(B)
//  Main code here
#include <Recon40.h>
//#include <math.h>
//#include <float.h>
/******  LCD Defines ********/
#define LCD_BL pin_f5
#define LCD_ENABLE_PIN  PIN_d1                                  ////
#define LCD_RS_PIN      PIN_b12                                    ////
#define LCD_RW_PIN      PIN_f1                                  ////
#define LCD_DATA4       PIN_b11                                   ////
#define LCD_DATA5       PIN_d0                                  ////
#define LCD_DATA6       PIN_f0                                 ////
#define LCD_DATA7       PIN_f4 
#include <LCD.C>


#use rs232(UART1,baud=115200,parity=N,bits=8)
/******* Global Vars ****************/
unsigned int16 heartbeat;
unsigned int16 ADC0,ADC1; //,Vd1,Vd2;
float Vd1,Vd2;
char adcCH;
char disp[12];

#int_TIMER1
void  TIMER1_isr(void)
{
 heartBeat++;
 //if (heartBeat == 0xFFFF)
// output_toggle(LCD_BL);
// output_toggle(LCD_ENABLE_PIN);
 //output_toggle(LCD_RS_PIN);
 //output_toggle(LCD_RW_PIN);
 //output_toggle(LCD_DATA4);
 //output_toggle(LCD_DATA5);
// output_toggle(LCD_DATA6);
// output_toggle(LCD_DATA7);
  adcCH++;
  if (adcCH>=2) adcCH = 0;
  set_adc_channel(adcCH);
  if (adcCH==0) ADC0 = read_adc();
  else ADC1 = read_adc();
  Delay_us(2);
 
 
}




   


void main()
{
   setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_4);

   setup_timer2(TMR_INTERNAL |TMR_DIV_BY_64 ,0);
   setup_timer4(TMR_DISABLED |TMR_DIV_BY_1 ,0);
   setup_timer3(TMR_DISABLED |TMR_DIV_BY_1 ,0);
   setup_timer5(TMR_DISABLED |TMR_DIV_BY_1 ,0);


   setup_timer1(TMR_INTERNAL|TMR_DIV_BY_8);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INTR_GLOBAL);
  setup_adc_ports(sAN0 | sAN1, VSS_VDD);
  setup_adc(ADC_CLOCK_DIV_8 | ADC_TAD_MUL_4);
   
  // setup_adc_ports(sAN0 | sAN1, VSS_VDD);
 //  setup_adc(ADC_CLOCK_DIV_4 | ADC_TAD_MUL_2);
   lcd_init();

   // TODO: USER CODE!!
   output_high(LCD_BL);
   printf(lcd_putc,"\f dsPIC LCD\n");
   printf(lcd_putc,"Float & Int");
   delay_ms(3000);
    printf(lcd_putc,"\f..Ready\n");
    delay_ms(1000);
   while(1) {
   Vd1=(float)(ADC0*5)/1024;
   Vd2= (float)(ADC1*5)/1024;
 
   lcd_gotoxy(0,2);
   printf(lcd_putc,"%Lu        ",ADC0);
   lcd_gotoxy(8,2);
   printf(lcd_putc,"%Lu        ",ADC1);
   // this block resets the dsPiC
  /* delay_ms(500);
   sprintf(disp,"%f",Vd1);
   
   lcd_gotoxy(0,2);
   printf(lcd_putc,disp);
   delay_ms(100);
   sprintf(disp,"%f",Vd2);
   lcd_gotoxy(8,2);
   printf(lcd_putc,disp); */
    /* delay_ms(500);
   sprintf(disp,"%f",Vd1);
   /*****   This block resets the dsPIC toor****/
   delay_ms(1000);
   printf(lcd_putc,"\f");
   lcd_gotoxy(0,2);
   printf(lcd_putc,"V0:%f",Vd1);
   delay_ms(100);
   lcd_gotoxy(9,2);
   printf(lcd_putc,"V1:%f",Vd2);
   delay_ms(1000);
   
   
   }

}

Başlık: Ynt: dspic30f2023-pwm ve CCS
Gönderen: sadogan - 19 Mart 2022, 15:02:16
Derleyici versiyonundan kaynaklanıyor. 5.106 ile derlediginde aynı hatayı alıyorum 5.103 de sıkıntı yok.
http://www.ccsinfo.com/devices.php?page=versioninfo
5.107 de düzeltilmiş.