Bitirme projemde bir BLDC kontrolü yapacağım.
Sürücü kısmının tasarımında kafam karışıyor.
Çok yüksek güçte olmayan bir BLDC motor için 2 yöndede dönebilen ve akım-RPM değerlerini ölçebileceğim bir tasarım yapmak istiyorum.
Bu noktada ki ilk sorum hazır bir BLDC sürücü mü kullanmak yoksa mosfet sürücüler ile sıfırdan oluşturmak mı ?
Örnek olarak ilk karşıma çıkan TI - DRV8302
Ben de bitirme olarak sabit kanatlı drone yapmayı planlıyorum. Motor sürücülerinde DRV10983 drv3205 entegrelerini kullanmayı düşünüyorum.
Yalnız sadece motor kontrol edecekseniz biraz basit kalmaz mı?
Hocam sadece motor değil motor sadece bir kısmı :)
He tamam o zaman. Çünkü size yakışmazdı :). Ben de minimum titreşim istenen küçük bir makine için bu sürücülerden kullanmayı düşünüyorum. Bunlar aşırı akım uyarılarına kadar bir çok bilgiyi veriyor. Profesyonel açıdan kullanılabilir derim. Benim yazdığım koddaki entegrelerin birine dışarıdan mosfet de bağlanabiliyordu sanırım.
STM32F103C8T6 için PWM sinyallerini oluşturmaya başladım. Şuan için test amaçlı bir 20kHz sinyal oluşturdum.
Fakat henüz Complement Çıkışları aktif edemedim.
(http://i.hizliresim.com/ojnvZX.png)
#define PWM_PERIOD (3599)
TIM_TimeBaseInitTypeDef TIM_BaseStruct;
TIM_OCInitTypeDef TIM_OCStruct;
TIM_BDTRInitTypeDef TIM_BDTRInitStruct;
TIM_BaseStruct.TIM_Prescaler = 0;
TIM_BaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_BaseStruct.TIM_Period = PWM_PERIOD; // ((72 MHz / 20kHz) - 1) = 3599
TIM_BaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_BaseStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_BaseStruct);
TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCStruct.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCStruct.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCStruct.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OCStruct.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCStruct.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OCStruct.TIM_Pulse = (((PWM_PERIOD + 1) * 25) / 100) - 1;
TIM_OC1Init(TIM1, &TIM_OCStruct);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OCStruct.TIM_Pulse = (((PWM_PERIOD + 1) * 50) / 100) - 1;
TIM_OC2Init(TIM1, &TIM_OCStruct);
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OCStruct.TIM_Pulse = (((PWM_PERIOD + 1) * 75) / 100) - 1;
TIM_OC3Init(TIM1, &TIM_OCStruct);
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
/*TIM_BDTRInitStruct.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStruct.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStruct.TIM_LOCKLevel = TIM_LOCKLevel_1;
TIM_BDTRInitStruct.TIM_DeadTime = 117;
TIM_BDTRInitStruct.TIM_Break = TIM_Break_Enable;
TIM_BDTRInitStruct.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRInitStruct.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStruct);*/
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);