STM32 akım ölçümü yardım

Başlatan magnetron, 05 Ekim 2024, 21:04:42

magnetron

merhaba forum,

STM32 ile 50 amper bipolar ACS sensör kullanarak
24 V DC fırçalı motorun akımını ölçmeye çalışıyorum
sürücü beslemesi trafo köprü 1000 uF bypass kapasitör

ACS sensör biliyorsunuz sıfır akımda yaklaşık 3.3/2 = 1.65 V çıkış veriyor

ama motor sabit hızda dönerken ACS çıkışındaki ham değer bir osilasyon yapıyor
yani mesela 2100 değerde 2 saniye duruyor sonra 2130 a kadar yükseliyor
tekrar 2100 değere gelip aynı olay tekrar ediyor

şimdi sample time 28.5 saykıl olarak ayarladım bu durumda bir ölçüm 28.5 + 1.5 = 30 saykıl sürüyor (referans manuale göre )
böylece saniyede 12 000 000 / 30 =400 000 ölçüm alıyor benim PWM frekansım 10 KHz
yani 1/10 000 * 400 000 = her bir PWM saykılda 40 ölçüm alıyor

akım probuyla baktığımda akımın sürekli akım üçgen dalga olduğunu görüyorum
toplam 200 ölçüm alıp ortalamasını alıyorum

işte osilasyon yapıyor dediğim bu ortalama değer

kodları da paylaşayım
sormak istediğim bu dalgalanmayı nasıl giderebilirim

teşekkür

not : DMA kullanmadım çünkü DMA ADC1 e bağlı orda birkaç başka ölçüm yapıyorum

void GetADCRes(void){
uint16_t *RAMptr = &RAM[DATAWORDS+329*2];
uint16_t ikl;
int32_t avertotal=0;
    avertotal=0;
    for (ikl=0;ikl<200;ikl++) avertotal+=ADCresult[ikl];
    *RAMptr=avertotal/200;           
}
 

volatile uint16_t ADCresult[200],resultno;

void ADC1_2_IRQHandler(void)
{
/* Clear ADC1 EOC pending interrupt bit */
    ADC_ClearITPendingBit(ADC2, ADC_IT_EOC);
    ADC_ClearFlag(ADC2, ADC_FLAG_EOC);

    ADCresult[resultno]= ADC_GetConversionValue(ADC2);
    resultno++;if(resultno>200) resultno=0;
}

  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 1;
  ADC_Init(ADC2, &ADC_InitStructure);
  

/* ADC2 regular channels configuration */ 
  ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_28Cycles5);

magnetron

#1
mesajı yazdıktan sonra bir hatamı farkettim ki şöyle;

28,5 saykıl sample time ile 1,5 değil 12,5 saykıl toplamak gerekiyor
bu durumda 28,5 + 12,5 = 41 saykıl bir ölçüm sürüyor

ADC clock 12 MHz iken bu da saniyede 12 000 000 / 41 = 292 682 ölçüm yapıyor

bu durumda 10 KHz PWM frekansın 1 periyodunda 29,268 ölçüm yapıyor

böylece benim koddaki 200 örnekleme ile 6,83 PWM periodu boyunca örnekleme sürüyor demektir

işte benim kuşkulandığım nokta burası

tamsayı bir PWM periodu boyunca örnekleme yapılmadığı için akımın bazen alt değerleri bazen üst değerleri fazla
örnekleniyor böylece ortalama ölçümdeki osilasyon ortaya çıkıyor

siz ne düşünüyorsunuz ?

ben de şöyle yaptım

55,5 sample time ile 55,5 + 12,5 = 68 ölçüm saykıl time seçtim
böylece 12 000 000 / 68 = 176 470 saniyede ölçüm sayısı

176 470 * 0,0001 = 17,647 PWM period başına ölçüm yapmış oldum

bunu 25 period da tekrarladığım zaman 441 örnek alırsam teorime göre tamsayı bir PWM periodu süresince örnekleme yapmış olacaktım

ne yazık ki beklediğim olmadı ortalama değerdeki oynama devam etti

acaba nerde hata yapıyorum ?

biraz karışık biliyorum derdimi anlatabildiysem bravo bana benim kafam da karıştı çünkü

sedronjames

en çok kullanılan yöntem pwm ile senkron şekilde adc okumaktır.

pwm'i oluşturduğun timer ile adcyi tetikleyebilirsin. pwm'i center aligned olarak seçersen, akımın tam orta noktasında adc ölçümü yaparsın. bu da dc motorda akım ölçmek için zorunlu bir durum zaten.

ortalama değer osilasyon yapıyor diyorsun. akımı tepede mi ölçtün, sıfırdayken mi ölçtün bilmiyorsun ki, bir periyottaki 100 tane örneği kimbilir dalga şeklinin nerelerinde aldın.

forumda center aligned pwm ile ilgili pekçok tartışma mevcut. bakmanı öneririm.

RaMu

@sedronjames in bahsettiği konuya örnek anlatım aşağıdaki linkte Section 5.1.2. kısmında:

Section 5.1.2.
https://wiki.stmicroelectronics.cn/stm32mcu/wiki/STM32MotorControl:6-step_Firmware_Algorithm

Alıntı yapılan: wiki.stmicroelectronics.cn/ link=https://wiki.stmicroelectronics.cn/stm32mcu/wiki/STM32MotorControl:6-step_Firmware_AlgorithmA timer peripheral is used to generate the PWM signals and to trigger the measurement of the ADC at the right time. This mechanism is detailed in Section 5.1.2.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html