Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: mistek - 08 Mayıs 2018, 19:51:01

Başlık: STM32F103 PWM kanalına müdahale
Gönderen: mistek - 08 Mayıs 2018, 19:51:01
Merhaba Arkadaşlar,

Stm32f103'te TIM1 üzerinden Eşlenik PWM sinyali üretiyorum.
Sinyalde Dead time da var.

Şimdi sorunum şu. H köprüsünü sürerken PWM duty sıfır olduğunda alt mosfetler iletimde kalıyor.

Resimle açıklayacak olursam.
 
(https://thumb.ibb.co/df96US/pwmdead.jpg) (https://ibb.co/df96US)

Kırmızı OC kanalı siyahta OCN kanalı olsun. PWM duty sıfırdan farklı iken olması gerektiği gibi eşlenik çalışıyorlar. Görsel-1 de olduğu gibi.
Görsel-2 ye geçtiğimizde mesela duty daraldıkça N kanalı high seviyede kalıyor buraya kadar normal.

Burada duty 0 iken OC ve OCN çıkışları Low konumda olmasını istiyorum. Duty değeri sıfırdan farklı olunca normal çalışmasına yani eşlenik çalışmasına geçmesini istiyorum.

Şuanki ayarda örneğin polarite seçimi yapınca OC ve OCN çıkışları birbirilerinin tersi oluyorlar. Duty sıfır olmasında sorun yok ancak sıfır olduğunda ikiside aynı konumda ve low konumda kalmalı.

Derdimi tam anlatamadım belki ama sorunum ayar kısmı ile ilgili.

veya farklı çözüm olarak, bu N kanalını duty sıfır olunca nasıl low seviyede tutarım? Kanal PWM için ayarlı olduğu için müdahaleyi nasıl yapmam lazım?

void Pwm_init(uint16_t on_bolucu, uint16_t arr_deger, uint16_t deadtime)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
   
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //Alternate Function Saat kaynağını aç
   
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

   /* PWM Pin ayarları */
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
   
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_Init(GPIOB, &GPIO_InitStructure);
   
   /* TIM1 Frekans ayarları */
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //Timer Counter yukarı sayacak
TIM_TimeBaseStructure.TIM_ClockDivision = 0; // Saat bölme oranı
TIM_TimeBaseStructure.TIM_Prescaler = on_bolucu; // Ön bölücü
TIM_TimeBaseStructure.TIM_Period = arr_deger; // ARR değeri Kesme süresi= (PR+1)(ARR+1)/SystemCoreClock
   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //Time Base init.
   
   //TIM_SetCounter(TIM1,0);
   
   /* TIM1 Kesme ayarları */
   NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;//TIM1_UP_TIM16_IRQn; //Kesme adresi
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
   
   /* TIM1 PWM ayarları */
   TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //Output Compare Datasheet syf:398 OC1M
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //PWM normal çıkış aktif
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //PWM eşlenik çıkış aktif
TIM_OCInitStructure.TIM_Pulse = 0; // Duty Cycle TIMx->CCRx=Pulse
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // Normal Çıkış polaritesi high
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; // Eşlenik Çıkış polaritesi low
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; // İdle state set datasheet syf:345
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; //İdle state reset
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //TIM Output Compare init

TIM_OCInitStructure.TIM_Pulse = 0; // Duty Cycle TIMx->CCRx=Pulse
TIM_OC4Init(TIM1, &TIM_OCInitStructure); //TIM Output Compare init

   /* TIM1 PWM-N ayarları */   
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; // Datasheet sayfa: 345
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; //Datasheet sayfa:345
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; // lock level 1
TIM_BDTRInitStructure.TIM_DeadTime = deadtime; // Deadtime = 72/SystemCoreClock
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; // Break devredışı Datasheet sayfa: 345
//TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; // Otomatik çıkış aktif
   
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure); // BDTR register init Break,Deadtime Register
   
  // TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE); //Timer güncellendiginde kesme olustur. timer sayici = ARR
 
   TIM_ARRPreloadConfig(TIM1, ENABLE);   
     
TIM_Cmd(TIM1, ENABLE); //Timer aktif.

TIM_CtrlPWMOutputs(TIM1, ENABLE); // PWM çıkışları aktif. MOE biti.
}
Başlık: Ynt: STM32F103 PWM kanalına müdahale
Gönderen: Mucit23 - 08 Mayıs 2018, 20:41:33
Pwm modda bu şekilde çalışması normal. Fakat çıkışlara sen mudahale edebilirsin.

TIM_SelectOCxM(TIM1,TIM_Channel_1, TIM_ForcedAction_Active);
TIM_CCxNCmd(TIM1,TIM_Channel_1, TIM_CCxN_Enable);

TIM Forced Activation Enable olunca Timerin çıkışına müdahale edilebiliyor. Ben bu şekilde Tim CHXN çıkışına müdahele edebiliyordum. Low side mosları bağımsız olarak iletime sokabiliyorum.

Çıkışın tamamen kapanması için  Tim Forced Activation aktif yapmana gerek yok sanırım.
TIM_CCxNCmd Disable yapman yeterli olur sanırım.
Başlık: Ynt: STM32F103 PWM kanalına müdahale
Gönderen: devrecii - 08 Mayıs 2018, 21:45:32
Şunu da bi incele derim.

https://www.picproje.org/index.php?topic=72290.0
Başlık: Ynt: STM32F103 PWM kanalına müdahale
Gönderen: mistek - 08 Mayıs 2018, 22:04:43
@Mucit23 hocam teşekkürler sorunumu çözdünüz :)