Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: mistek - 15 Aralık 2017, 18:04:27

Başlık: STM32 Deadtime PA7 ve PA8 Farkı
Gönderen: mistek - 15 Aralık 2017, 18:04:27
Merhaba Arkadaşlar,

STM32F030 çipinde PWM çıkış alıyorum.
PA7 pininden TIM1CH - osiloskop görüntüsünde mavi sinyal
PA8 pininden TIM1CHN - yeşil sinyal

PWM'e Deadtime eklediğimde resimdeki sinyal üzerinden anlatacak olursam, PA8 pini yani yeşil sinyal maviden ileride oluyor. Aslında normal çalışıyor. Bense bunun tam tersini yapmak istiyorum. Yani CHN bacağı daha erken kesime gitsin deadtime süresi sonrasında da CH bacağı kesime gitsin. Çalışmasında hiçbir sorun yok. Sadece CHN bacağını ileri değilde geri almak istiyorum. Daha erken kesime gitsin istiyorum.

Yazılımsal olarak yapabilir miyim?

Timer ayarlarını şu şekilde yaptım.

void Pwm_init(uint16_t on_bolucu, uint16_t period)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

  /* GPIOA, GPIOB and GPIOE Clocks enable */
  RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);
 
  /* GPIOA Configuration: Channel 7, 8 and Channel 1N as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
 
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_2);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_2);
 
  /* Time Base configuration */
  TIM_TimeBaseStructure.TIM_Prescaler = on_bolucu;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
  TIM_TimeBaseStructure.TIM_Period = period;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

NVIC_InitStructure.NVIC_IRQChannel = TIM1_BRK_UP_TRG_COM_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);


  /* Channel 1, 2,3 and 4 Configuration in PWM mode */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //Set
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;//Reset

  TIM_OC1Init(TIM1, &TIM_OCInitStructure);

/* Automatic Output enable, Break, dead time and lock configuration*/

  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
  TIM_BDTRInitStructure.TIM_DeadTime = 100;
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

  TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);



TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);

  /* TIM1 counter enable */
  TIM_Cmd(TIM1, ENABLE);

  /* TIM1 Main Output Enable */
  TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
 

(https://postimg.cc/image/gkpz7zawb/%5D%5Bimg%20width=180%20height=108%5Dhttps://s17.postimg.cc/gkpz7zawb/tek00000.png)
(https://s17.postimg.cc/gkpz7zawb/tek00000.png) (https://postimg.cc/image/gkpz7zawb/)


Başlık: Ynt: STM32 Deadtime PA7 ve PA8 Farkı
Gönderen: Cemre. - 15 Aralık 2017, 19:05:48
Pwm mode 2 olarak çalıştırmayı deneyebilir misiniz? Veya pwm polarityleri tersleyip ChX ile ChxN'i ters kullanırsanız da olabilir. Denemek lazım. Ref. Manualin deadtime kısmı ve Timer cookbook bu konuda bilgi veriyor olmalı..

Tekrar bir okudum da sanırım yanlış anlamış olabilirim. :D
Başlık: Ynt: STM32 Deadtime PA7 ve PA8 Farkı
Gönderen: mistek - 15 Aralık 2017, 19:26:33
Hocam göz attım o kısımalara ancak tam olarak istediğimi yapamadım.  PWM modu şuan PWM2 ayarlı.
Bana lazım olan Negatif deadtime.

(https://artibesvolt.files.wordpress.com/2016/12/edged-aligned-dead-time.png?w=768)
(http://https://artibesvolt.files.wordpress.com/2016/12/edged-aligned-dead-time.png?w=768)
Başlık: Ynt: STM32 Deadtime PA7 ve PA8 Farkı
Gönderen: mistek - 15 Aralık 2017, 21:01:29
Yaptım.


Ayarları bu şekilde yapınca istediğim gibi oldu.






  /* Channel 1, 2,3 and 4 Configuration in PWM mode */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 0;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;


  TIM_OC1Init(TIM1, &TIM_OCInitStructure);

/* Automatic Output enable, Break, dead time and lock configuration*/

  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
  TIM_BDTRInitStructure.TIM_DeadTime = 100;
  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
  TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;