X-Git-Url: https://rtime.felk.cvut.cz/gitweb/fpga/rpi-motor-control.git/blobdiff_plain/b4d468f4be4d8e91bbd775b5b37f0ae431ae6648..48407cad35d152771ac1a86652dae3eede6741a2:/pmsm-control/test_sw/main_pmsm.c diff --git a/pmsm-control/test_sw/main_pmsm.c b/pmsm-control/test_sw/main_pmsm.c index f4ce30b..56b6544 100644 --- a/pmsm-control/test_sw/main_pmsm.c +++ b/pmsm-control/test_sw/main_pmsm.c @@ -25,6 +25,7 @@ #include "cmd_proc.h" #include "controllers.h" #include "commutators.h" +#include "comp.h" @@ -163,13 +164,6 @@ void appl_stop(){ printf("\nprogram bezpecne ukoncen\n"); } -void substractOffset(struct rpi_in* data, struct rpi_in* offset){ - data->pozice=data->pozice_raw-offset->pozice_raw; - return; -} - - - /** * Funkce pravidelne vypisuje posledni zjistenou pozici lokalniho motoru */ @@ -180,97 +174,6 @@ void * pos_monitor(void* param){ } return (void*)0; } -/* - * \brief - * Multiplication of 11 bit - * Zaporne vysledky prvede na nulu. - */ -inline uint16_t mult_cap(int32_t s,int d){ - int j; - int res=0; - for(j=0;j!=11;j++){ - /* multiplicate as if maximum sinus value was unity */ - res+=(!(s & 0x10000000))*(((1 << j) & s)>>j)*(d>>(10-j)); - } - return res; -} - - -/** - * \brief - * Computation of distance to index. - * - * K dispozici je 12-bit index, to umoznuje ulozit 4096 ruznych bodu - * Je nutne vyjadrit 1999 bodu proti i posmeru h.r. od indexu - - * to je 3999 bodu - * =>12 bitu je dostacujicich, pokud nikdy nedojde ke ztrate - * signalu indexu - */ -void comIndDist(){ - uint16_t pos = 0x0FFF & data.pozice_raw; - uint16_t dist; - uint16_t index = data.index_position; - - if (index<1999){ /*index e<0,1998> */ - if (pos */ - /*proti smeru h.r. od indexu*/ - dist=pos+2000-index; - }else if (pos<=index+1999){ /*pozice e */ - /*po smeru h.r. od indexu*/ - dist=pos-index; - }else if (pos */ - goto index_lost; - }else{ /*pozice e */ - /*proti smeru h.r. od indexu - podtecena pozice*/ - dist=pos-index-2096; - } - }else if (index<=2096){ /*index e<1999,2096>*/ - if (pos */ - goto index_lost; - }else if (pos */ - /*proti smeru h.r. od indexu*/ - dist=pos+2000-index; - }else if (pos<=index+1999){ /*pozice e */ - /*po smeru h.r. od indexu*/ - dist=pos-index; - }else { /*pozice e */ - goto index_lost; - } - }else{ /*index e<2097,4095> */ - if (pos<=index-2097){ /*pozice e<0,index-2097> */ - /*po smeru h.r. od indexu - pretecena pozice*/ - dist=4096+pos-index; - }else if (pos */ - goto index_lost; - }else if (pos */ - /*proti smeru h.r. od indexu*/ - dist=pos+2000-index; - }else{ /*pozice e */ - /*po smeru h.r. od indexu*/ - dist=pos-index; - } - } - - rps.index_dist = dist; - return; - - index_lost: - rps.index_ok=0; - return; -} - - -/* - * \brief - * Computate speed. - */ -void compSpeed(){ - signed long int spd; - spd=rps.spi_dat->pozice-rps.old_pos[rps.tf_count%OLD_POS_NUM]; - rps.speed=(int32_t)spd; -} - - /* * \brief @@ -304,7 +207,7 @@ void * read_data(void* param){ /*subtract initiate postion */ rps.tf_count++; substractOffset(&data,poc.spi_dat); - compSpeed(); /*spocita rychlost*/ + compSpeed(&rps); /*spocita rychlost*/ if (!rps.index_ok){ if (first){ @@ -312,10 +215,10 @@ void * read_data(void* param){ first=0; }else if (last_index!=data.index_position){ rps.index_ok=1; - comIndDist(); /*vypocet vzdalenosti indexu*/ + comIndDist(&rps); /*vypocet vzdalenosti indexu*/ } }else{ /*index je v poradku*/ - comIndDist(); /*vypocet vzdalenosti indexu*/ + comIndDist(&rps); /*vypocet vzdalenosti indexu*/ } /* pocitame sirku plneni podle potreb rizeni*/