Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

dspic30f2023-pwm ve CCS

Başlatan jackal183, 03 Temmuz 2011, 21:38:26

jackal183

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

GreeN

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.
Terörü Lanetliyoruz.

jackal183

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

iyildirim

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  işlemci ana sayfası,

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..



jackal183

#4
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






iyildirim

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..

jackal183

tavsiyenizi dikkate alacağım hocam tekrar teşekkürler

jackal183

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;
}

iyildirim

İşlemci nedir, 2023 değil sanırım..




jackal183

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

iyildirim

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.
 

jackal183

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

iyildirim

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.


jackal183

bakalım bi deneyeyim yarın

GreeN

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.
Terörü Lanetliyoruz.