0-50hz/0-100% düşük frekans ve duty ayarlayan modül.

Başlatan F.T, 14 Nisan 2018, 18:44:39

F.T

Arkadaşalar 0-50 hz ve 0-100% duty ayarlamam gerekiyor.Aşağıda linkte verilen modül hakkında ve üzerinde kullanılan entegre hakkında bilgisi olan varmı?

https://www.youtube.com/watch?v=hjRVaogl6tw
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

RaMu

STM8 mcu ve holtek lcd sürücü ile yapılmış.

Şu videoda söylüyor, açıklamadada var, şemasınıda çıkarmış:
https://www.youtube.com/watch?v=MkO1HJ91cQs

Üretici veya ana dağıtıcıda şu (icstation) herhalde:
http://www.icstation.com/signal-generator-pulse-frequency-duty-cycle-adjustable-module-display-150khz-p-12477.html
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

F.T

RaMu hocam ben xtal 1mhz 18f46k22 pic işlemci pwm modül çıkışı ile 0-50 hz pwm düşük frekanslara inemiyorum.61 hz gibi min frekans oluşuyor.Stm8 ile bunu nasıl becermiş.Yada nasıl bir mantık ile bizim yapmamız lazım?
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Melih1802


M.Salim GÜLLÜCE

Alıntı yapılan: F.T - 14 Nisan 2018, 21:17:42RaMu hocam ben xtal 1mhz 18f46k22 pic işlemci pwm modül çıkışı ile 0-50 hz pwm düşük frekanslara inemiyorum.61 hz gibi min frekans oluşuyor.Stm8 ile bunu nasıl becermiş.Yada nasıl bir mantık ile bizim yapmamız lazım?
PIC içindeki PWM aygıtı ile yaparsan sana sınır koyar.
Tımer interrupt ve Clock Frekansına bağıl çalıştığındandır.
Kendi PWM ini kendin yap. Soft PWM yaparsan sınırlara takılmazsın.

F.T

Hocam bende bir adet sipariş verdim.Fakat o çözüm değil. ;)
Mehmet Salim Hocam videoya baktınız heralde bende timer kullandığı kanaatindeyim.Yoksa pwm modül 0-50 hz olarak rakamlara inmiyor.Stm8 mcu yu bilmiyorum.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

RaMu

#6
Datasheet te çalışma frekansına bağlı olarak
üretilebilecek frekans tabloları veya hesabı olacak,
bakıp yazayım.

Biraz yukarısında formüllerde var,
donanımsal olarak bayağı bir frekans ve duty ayarlanabiliyor,
resolution kısmı önemli,
toplam kaç basamakta (misal 8 bit 256 basamak %0.4 adımlarla gibi)
%0~100 PWM duty ayarı yapabileceğini söylüyor.


Pardon 50 kHz görüyorum başlığı.
50Hz için timer kullanmak daha mantıklı,
saniyede en fazla 20 defa olacak bir şey,
her halükarda mcu ya yük getirmeden halledilebilir,
timer kesmesiyle yapmak gayet mantıklı.

Eqution 14.4 e bakarsak maksimum
PWM Periyod = 16384 * Tosc
4MHz kristal ile Tosc 0.25 us
(bu mcu yu bu frekansta çalıştırmak ayıp olur tabi)
PWM Periyot yaklaşık 4 milisaniye olur ki bu da
frekansın en düşük 250 Hz olacağı anlamına gelir,
yani bu işi bu mcu ile yapmak için
4/250 MHz civarında bir kristal ve çalışma frekansına ihtiyacın olur,
bunun yerine timer daha mantıklı.
Kısaca Pwm Frekansı Min = (1/16384) * Fosc
= 61 Fosc / (Bir Milyon)
Fosc direk kristal frekansın.

Olmaz dersen bir tane 10F 12F daha eklersin tasarıma ona yaptırırsın bu işi.

Düzeltme: Tosc hatalı hesaplamışım.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

F.T

8 mhz de 1.22khz minimum frekansa iniyor.Pic Calculation programı ilede 488,281 Hz min frekans bulunuyor.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

mehmet

Kristal 4.096MHz;
/*
* Example Source Code For PIC Timers
*   THis blinks LEDs on PORTB to show interrupt rates
*
* Barton Dring
* Dring Engineering Services
* www.eng-serve.com
*
* Example only!  Use any code at your own risk.
*/


// Interrupt Handler
void interrupt()
{
  // Timer0 Interrupt - Freq = 100.00 Hz - Period = 0.010000 seconds
  if (INTCON.TMR0IF ==1) // timer 0 interrupt flag
  {
    PORTB.F0 = ~PORTB.F0;      // Toggle PORTB bit0 LED
    INTCON.TMR0IF = 0;         // clear the flag
    INTCON.TMR0IE = 1;         // reenable the interrupt
    TMR0 = 96;           // reset the timer preset count
  }

}



// code starts here...
void main()
{

  // setup portb to show the interrupts by blibking LEDs
  TRISB = 0x00;    // PORT is all output...to show the interrupts
  PORTB = 0;       // start with all outputs low

//Timer0 Registers Prescaler= 64 - TMR0 Preset = 96 - Freq = 100.00 Hz - Period = 0.010000 seconds
OPTION_REG.T0CS = 0;  // bit 5  TMR0 Clock Source Select bit...0 = Internal Clock (CLKO) 1 = Transition on T0CKI pin
OPTION_REG.T0SE = 0;  // bit 4 TMR0 Source Edge Select bit 0 = low/high 1 = high/low
OPTION_REG.PSA = 0;   // bit 3  Prescaler Assignment bit...0 = Prescaler is assigned to the Timer0
OPTION_REG.PS2 = 1;   // bits 2-0  PS2:PS0: Prescaler Rate Select bits
OPTION_REG.PS1 = 0;
OPTION_REG.PS0 = 1;
TMR0 = 96;             // preset for timer register


// Interrupt Registers
  INTCON = 0;           // clear the interrpt control register
  INTCON.TMR0IE = 1;        // bit5 TMR0 Overflow Interrupt Enable bit...1 = Enables the TMR0 interrupt
  INTCON.TMR0IF = 0;        // bit2 clear timer 0 interrupt flag
  INTCON.GIE = 1;           // bit7 global interrupt enable


  while(1)  //endless loop
  {
  }
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

devrecii

Timeri pwm üretmek için değil de interrrupt için kullanıp gpio ile çıkış verirseniz saniyenin milyonda birinede indireblirsiniz frekansı kafaya takmayın.

F.T

Mehmet Hocam ,İboibo Hocam sadece frekans değil duty oranınıda ayarlıyacam.Belirttiğiniz gibi pwm modülü ile olacak iş değil.Tmr kesmeleri ile çözülecek bir iş olduğu aşikar.Yada ad9850-51 türü bir entegre ile çözülebilir.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

devrecii

int freq=1000000,duty=500000,sayac=0;

void interrupt (void)
 {
   sayac++;
   if(sayac>freq) sayac=0;
   if(sayac<duty) gpio=0; else gpio=1;
  }


Kabaca yazdım stm8 kullanıyorsan yarın bi kod yazarım pic mi kullanıyorsun?;


Duty ve frekans ayarlanabilir.

F.T

İboibo Hocam pic kullanıyorum. :)

xtall 1Mhz tmr1 1/8 prescaller tmr1 preload :1

/*
* Example Source Code For PIC Timers
*   THis blinks LEDs on PORTB to show interrupt rates
*
* Barton Dring
* Dring Engineering Services
* www.eng-serve.com
*
* Example only!  Use any code at your own risk.
*/


// Interrupt Handler
void interrupt()
{

  // Timer1 Interrupt - Freq = 0.48 Hz - Period = 2.097120 seconds
  if (PIR1.TMR1IF == 1) // timer 1 interrupt flag
  {
    PORTB.F1 = ~PORTB.F1;      // Toggle PORTB bit1 LED
    PIR1.TMR1IF = 0;           // interrupt must be cleared by software
    PIE1.TMR1IE  =   1;        // reenable the interrupt
    TMR1H = 0;             // preset for timer1 MSB register
    TMR1L = 1;             // preset for timer1 LSB register
  }

}



// code starts here...
void main()
{

  // setup portb to show the interrupts by blibking LEDs
  TRISB = 0x00;    // PORT is all output...to show the interrupts
  PORTB = 0;       // start with all outputs low

//Timer1 Registers Prescaler= 8 - TMR1 Preset = 1 - Freq = 0.48 Hz - Period = 2.097120 seconds
T1CON.T1CKPS1 = 1;   // bits 5-4  Prescaler Rate Select bits
T1CON.T1CKPS0 = 1;   // bit 4
T1CON.T1OSCEN = 1;   // bit 3 Timer1 Oscillator Enable Control bit 1 = on
T1CON.T1SYNC = 1;    // bit 2 Timer1 External Clock Input Synchronization Control bit...1 = Do not synchronize external clock input
T1CON.TMR1CS = 0;    // bit 1 Timer1 Clock Source Select bit...0 = Internal clock (FOSC/4)
T1CON.TMR1ON = 1;    // bit 0 enables timer
TMR1H = 0;             // preset for timer1 MSB register
TMR1L = 1;             // preset for timer1 LSB register


// Interrupt Registers
  INTCON = 0;           // clear the interrpt control register
  INTCON.TMR0IE = 0;        // bit5 TMR0 Overflow Interrupt Enable bit...0 = Disables the TMR0 interrupt
  PIR1.TMR1IF = 0;            // clear timer1 interupt flag TMR1IF
  PIE1.TMR1IE  =   1;         // enable Timer1 interrupts
  INTCON.TMR0IF = 0;        // bit2 clear timer 0 interrupt flag
  INTCON.GIE = 1;           // bit7 global interrupt enable
  INTCON.PEIE = 1;          // bit6 Peripheral Interrupt Enable bit...1 = Enables all unmasked peripheral interrupts


  while(1)  //endless loop
  {
  }
}
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

RaMu

@F.T Yukarıdaki mesajımı düzenledim.

Aslında PWM için dışarıdan veya başka şekilde kaynak kullanan
bir mcu kullanıyor olsaydın PWM modülü ilede olurdu.
Misal PIC24.
http://ww1.microchip.com/downloads/en/DeviceDoc/33035a.pdf

Tabi başka bir trick yoluda var:
Misal PWM için timer2 kullanacak şekilde ayar-kurulum yapıyorsun,
sonra timer2 yi pasif-off yapıyorsun,
sonra başka bir timer ile istediğin periyotta bir kesme kuruyorsun,
misal 1 ms timer1 kesmesi,
bu timer1 kesmesi her geldiğinde timer2 registerını 1 arttırıyorsun.
Bu sayede PWM için kullanılan timer2 yi kandırmış
istediğin zamanda bir PWM modulüne referans olacak şekle getirmiş oluyorsun.
Kaynak:
http://www.microchip.com/forums/m377999.aspx#378105

Örnek verecek olursak,
normal PWM işlemin içinmiş gibi
timer2 yi 10 us de bir artacak şekilde kurdun,
bu şekilde 10kHz PWM frekansın oluyor diyelim,
sen timer2 yi pasif yapıp,
başka bir kesme kurup,
her 10 * 1000 us = 10ms de bir timer2 yi bir arttırıyorsun,
bu sayede PWM frekansı binde birine düşmüş oluyor yani bu örnekte 1 Hz.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

F.T

RaMu hocam okudum.Dediğiniz gibi bir senaryo olabilir.Uğraşayım bakalım.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.