BLDC sürücüleri ve akım ölçümü

Başlatan baran123, 20 Şubat 2017, 18:32:52

baran123

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

apsis

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ı?
"Makineye Beyin" MEKATRONİK

baran123

Hocam sadece motor değil motor sadece bir kısmı :)

apsis

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.
"Makineye Beyin" MEKATRONİK

baran123

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.


#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);