STM32F103 PWM kanalına müdahale

Başlatan mistek, 08 Mayıs 2018, 19:51:01

mistek

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.
 


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.
}
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Mucit23

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.


mistek

@Mucit23 hocam teşekkürler sorunumu çözdünüz :)
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R