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.