Ynt: MDK-ARM Derleyicisinden Kaynaklı Bir Problem

Başlatan NaMcHo, 26 Haziran 2013, 13:17:51

NaMcHo

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.