Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: NaMcHo - 26 Haziran 2013, 13:17:51

Başlık: Ynt: MDK-ARM Derleyicisinden Kaynaklı Bir Problem
Gönderen: NaMcHo - 26 Haziran 2013, 13:17:51
Merhabalar,
void FindSinValues(struct ArrSinNumber ArrSinNumDef,ThreePhaseSinusValuesTypeDef* _3Sinus,
uint16_t *sinCount, struct Flags *F, double *currentDeg)
{
   //static uint16_t sinCounter=0;
   double temp=0;
   uint16_t arr_2;                                       
   arr_2=ArrSinNumDef.arr>>1;                     //2'ye bölme mevcut arr'yi sinus*ARR/2 + ARR/2 formulu kosturulcak
   temp=360.0/ArrSinNumDef.sinNum;               //Derece olarak adim araligi
   temp*=((double)(*sinCount));                  //Derece olarak deger bulundu radyana donusturmek lazim
   

   //Dereceden radyana donusum
   temp=temp*PI;
   temp=temp/180.0;
   *currentDeg=temp;                                    //Kesme icinde birdaha hesaplamayayim diye...
   
   _3Sinus->usin=arm_sin_f32(temp);
   _3Sinus->usin*=arr_2;
   _3Sinus->usin+=arr_2;
   F->EachSin.usinCalculated=1;
   
   _3Sinus->vsin=arm_sin_f32(temp+_120);
   _3Sinus->vsin*=arr_2;
   _3Sinus->vsin+=arr_2;
   F->EachSin.vsinCalculated=1;
   
   _3Sinus->wsin=arm_sin_f32(temp+_240);
   _3Sinus->wsin*=arr_2;
   _3Sinus->wsin+=arr_2;
   F->EachSin.wsinCalculated=1;
   //3 faz icinde duty degerleri belirlendi.
   
}

Şöyle bir fonksiyonum var, arm_sin_f32() fonksiyonu düzgün bir şekilde çalışıyor, ancak bu fonksiyona gelen değerlerde sıkıntı var şöyleki,
   _3Sinus->usin=arm_sin_f32(temp); bu satıra gelmeden önce temp değeri 0.4363 olarak hesaplanması lazım(hesap makinası ile elde edilen bu, debug da temp değerini göremiyorum...) ve elde edilmesi gereken sinus değerleri ise
usin=512 vsin=566, wsin=1 olması gerekirken hepsi 360 oluyor...

Sorun sizce nerden kaynaklanıyor olabilir?


Notlar:
-temp değeri doğru bir şekilde elde ediliyor.
void Deneme(struct Deneme *de, ThreePhaseSinusValuesTypeDef* _3Sinus, struct ArrSinNumber ArrSinNumDef, double *currentDeg)
{
uint16_t arr=1000;
uint16_t temp;
temp=arr>>1;
*currentDeg=0.567;
GPIOD->BSRRL=(1<<12); //12.biti set et
_3Sinus->usin=arm_sin_f32(de->de1)*temp+temp;
_3Sinus->wsin=arm_sin_f32(de->de1+_120)*temp+temp;
_3Sinus->vsin=arm_sin_f32(de->de1+_240)*temp+temp;
GPIOD->BSRRH=(1<<12); //12.biti set et

arr=600;
temp=arr/2;
temp=arr/2;
_3Sinus->usin=arm_sin_f32(de->de2)*temp+temp;
_3Sinus->wsin=arm_sin_f32(de->de2+_120)*temp+temp;
_3Sinus->vsin=arm_sin_f32(de->de2+_240)*temp+temp;

de->de1=0.6;
de->de2=0.8;
ArrSinNumDef.arr=360;
ArrSinNumDef.sinNum=720;
}

Böyle bir kod yapısıyla deneme yaptım sinus değerleri düzgün bir şekilde hesaplanıyor.


mesaj birleştirme:: 26 Haziran 2013, 14:05:15

Sorun Çözüldü
void FindSinValues(struct ArrSinNumber ArrSinNumDef,ThreePhaseSinusValuesTypeDef* _3Sinus,
uint16_t *sinCount, struct Flags *F, double *currentDeg)
{
//static uint16_t sinCounter=0;
double temp=0;
uint16_t arr_2;
arr_2=ArrSinNumDef.arr>>1; //2'ye bölme mevcut arr'yi sinus*ARR/2 + ARR/2 formulu kosturulcak
temp=360.0/ArrSinNumDef.sinNum; //Derece olarak adim araligi
temp*=((double)(*sinCount)); //Derece olarak deger bulundu radyana donusturmek lazim


//Dereceden radyana donusum
temp=temp*PI;
temp=temp/180.0;
*currentDeg=temp; //Kesme icinde birdaha hesaplamayayim diye...

_3Sinus->usin=arm_sin_f32(temp)*arr_2+arr_2;
F->EachSin.usinCalculated=1;

_3Sinus->vsin=arm_sin_f32(temp+_120)*arr_2+arr_2;
F->EachSin.vsinCalculated=1;

_3Sinus->wsin=arm_sin_f32(temp+_240)*arr_2+arr_2;
F->EachSin.wsinCalculated=1;
//3 faz icinde duty degerleri belirlendi.

}


Şu şekilde yazmak gerekiyormuş sanırım +=, *= gibi işlemler tanımlanmamış derleyicide.