From 5d8290ceb4f6810b3bf47d15bcbb0fc63ff4a837 Mon Sep 17 00:00:00 2001 From: Martin Prudek Date: Wed, 20 May 2015 21:16:00 +0200 Subject: [PATCH] Commutation function now implemented with use of polymorphism. --- pmsm-control/test_sw/Makefile | 4 ++-- pmsm-control/test_sw/cmd_proc.c | 8 +++---- pmsm-control/test_sw/commutators.c | 9 +++++++ pmsm-control/test_sw/commutators.h | 6 +++++ pmsm-control/test_sw/comp.c | 2 +- pmsm-control/test_sw/main_pmsm.c | 25 +++++++------------- pmsm-control/test_sw/pmsm_state.c | 38 ++++++++++++++++++++++++++++++ pmsm-control/test_sw/pmsm_state.h | 23 +++++++++++++++++- 8 files changed, 91 insertions(+), 24 deletions(-) create mode 100644 pmsm-control/test_sw/pmsm_state.c diff --git a/pmsm-control/test_sw/Makefile b/pmsm-control/test_sw/Makefile index 5a8aa24..8684cd7 100644 --- a/pmsm-control/test_sw/Makefile +++ b/pmsm-control/test_sw/Makefile @@ -49,5 +49,5 @@ blikej: howto_gpio.o rpi_hw.o spi: rp_spi.o gcc -o spi rp_spi.c #pro rpi -pmsm: main_pmsm.o rp_spi.o rpi_hw.o misc.o pxmc_sin_fixtab.o cmd_proc.o controllers.o commutators.o comp.o logs.o - gcc -o pmsm_controll main_pmsm.o rp_spi.o rpi_hw.o misc.o pxmc_sin_fixtab.o cmd_proc.o controllers.o commutators.o comp.o logs.o -lpthread -lrt +pmsm: main_pmsm.o rp_spi.o rpi_hw.o misc.o pxmc_sin_fixtab.o cmd_proc.o controllers.o commutators.o comp.o logs.o pmsm_state.o + gcc -o pmsm_controll main_pmsm.o rp_spi.o rpi_hw.o misc.o pxmc_sin_fixtab.o cmd_proc.o controllers.o commutators.o comp.o logs.o pmsm_state.o -lpthread -lrt diff --git a/pmsm-control/test_sw/cmd_proc.c b/pmsm-control/test_sw/cmd_proc.c index 8f49e91..bb3be07 100644 --- a/pmsm-control/test_sw/cmd_proc.c +++ b/pmsm-control/test_sw/cmd_proc.c @@ -61,7 +61,7 @@ static void start(struct rpi_state* state){ */ static void stop(struct rpi_state* state){ sem_wait(&state->thd_par_sem); - state->commutate=0; + setCommutationOff(state); state->pos_reg_ena=0; state->spd_reg_ena=0; state->duty=0; @@ -82,7 +82,7 @@ static void dutySet(struct rpi_state* state, int duty){ state->duty=duty; state->pos_reg_ena=0; state->spd_reg_ena=0; - state->commutate=1; + setCommutationOn(state); sem_post(&state->thd_par_sem); } @@ -94,7 +94,7 @@ static void goAbsolute(struct rpi_state* state, int pos){ sem_wait(&state->thd_par_sem); state->spd_reg_ena=0; state->pos_reg_ena=1; - state->commutate=1; + setCommutationOn(state); state->desired_pos=pos; sem_post(&state->thd_par_sem); } @@ -126,7 +126,7 @@ static void setSpeed(struct rpi_state* state, int speed){ sem_wait(&state->thd_par_sem); state->pos_reg_ena=0; state->spd_reg_ena=1; - state->commutate=1; + setCommutationOn(state); state->desired_spd=speed; sem_post(&state->thd_par_sem); } diff --git a/pmsm-control/test_sw/commutators.c b/pmsm-control/test_sw/commutators.c index 1a63724..f20824e 100644 --- a/pmsm-control/test_sw/commutators.c +++ b/pmsm-control/test_sw/commutators.c @@ -6,6 +6,15 @@ #include "commutators.h" #include "pxmc_sin_fixed.h" /*sinus function*/ + +/* + * \brief + * No commutation. + */ +void zero_commutator(struct rpi_state* this){ + return; +} + /* * \brief * Computes minimum value of three numbers. diff --git a/pmsm-control/test_sw/commutators.h b/pmsm-control/test_sw/commutators.h index 59905d3..ca4c59b 100644 --- a/pmsm-control/test_sw/commutators.h +++ b/pmsm-control/test_sw/commutators.h @@ -43,5 +43,11 @@ void simple_ind_dist_commutator(struct rpi_state*); */ void simple_hall_commutator(struct rpi_state*); +/* + * \brief + * No commutation. + */ +void zero_commutator(struct rpi_state*); + #endif /*COMMUTATORS*/ diff --git a/pmsm-control/test_sw/comp.c b/pmsm-control/test_sw/comp.c index 49d3546..764726a 100644 --- a/pmsm-control/test_sw/comp.c +++ b/pmsm-control/test_sw/comp.c @@ -92,7 +92,7 @@ void comIndDist(struct rpi_state* this){ return; index_lost: - this->index_ok=0; + setIndexLost(this); return; } diff --git a/pmsm-control/test_sw/main_pmsm.c b/pmsm-control/test_sw/main_pmsm.c index 2eb9262..ac3563d 100644 --- a/pmsm-control/test_sw/main_pmsm.c +++ b/pmsm-control/test_sw/main_pmsm.c @@ -60,7 +60,8 @@ struct rpi_state rps={ .log_col_count=0, /* pocet radku zaznamu */ .log_col=0, .doLogs=0, - .alpha_offset=960 + .alpha_offset=960, + .main_commutator=zero_commutator /*komutace vypnuta*/ }; @@ -112,7 +113,7 @@ void * pos_monitor(void* param){ * Feedback loop. * TODO: replace bunch of 'IFs' with Object-like pattern */ -void * read_data(void* param){ +void * control_loop(void* param){ int i; struct rpi_in pocatek; struct rpi_state poc={ @@ -135,10 +136,9 @@ void * read_data(void* param){ /*old positions*/ rps.old_pos[rps.tf_count%OLD_POS_NUM]=rps.spi_dat->pozice; - spi_read(&rps); /*exchange data*/ - /*subtract initiate postion */ + spi_read(&rps); /*exchange data*/ rps.tf_count++; - substractOffset(&data,poc.spi_dat); + substractOffset(&data,poc.spi_dat); /*subtract initiate postion */ compSpeed(&rps); /*spocita rychlost*/ if (!rps.index_ok){ @@ -146,7 +146,7 @@ void * read_data(void* param){ last_index=data.index_position; first=0; }else if (last_index!=data.index_position){ - rps.index_ok=1; + setIndexOK(&rps); comIndDist(&rps); /*vypocet vzdalenosti indexu*/ } }else{ /*index je v poradku*/ @@ -160,15 +160,8 @@ void * read_data(void* param){ spd_pid(&rps); } - /* sirka plneni prepoctena na jednotlive pwm */ - if (rps.index_ok && rps.commutate){ - /*simple_ind_dist_commutator(rps.duty);*/ - /*sin_commutator(rps.duty);*/ - inv_trans_comm(&rps); - inv_trans_comm_2(&rps); - }else if(!rps.index_ok && rps.commutate){ - simple_hall_commutator(&rps); - } + /* sirku plneni prepocteme na jednotlive pwm */ + rps.main_commutator(&rps); /*zalogujeme hodnoty*/ if (rps.doLogs && !(rps.tf_count%LOG_PERIOD)){ @@ -203,7 +196,7 @@ int main(){ base_thread_id=pthread_self(); /*main control loop*/ - create_rt_task(&base_thread_id,PRIOR_HIGH,read_data,NULL); + create_rt_task(&base_thread_id,PRIOR_HIGH,control_loop,NULL); /*monitor of current state*/ create_rt_task(&base_thread_id,PRIOR_LOW,pos_monitor,NULL); diff --git a/pmsm-control/test_sw/pmsm_state.c b/pmsm-control/test_sw/pmsm_state.c new file mode 100644 index 0000000..9721490 --- /dev/null +++ b/pmsm-control/test_sw/pmsm_state.c @@ -0,0 +1,38 @@ +#include "pmsm_state.h" +#include "commutators.h" + +/** + * Index Lost. + */ +void setIndexLost(struct rpi_state* this){ + this->index_ok=0; + this->main_commutator=simple_hall_commutator; +} + +/** + * Index OK. + */ +void setIndexOK(struct rpi_state* this){ + this->index_ok=1; + this->main_commutator=inv_trans_comm_2; +} + +/** + * Turn commutation on. + */ +void setCommutationOn(struct rpi_state* this){ + this->commutate=1; + if (this->index_ok){ + this->main_commutator=inv_trans_comm_2; + }else{ + this->main_commutator=simple_hall_commutator; + } +} + +/** + * Turn commutation off. + */ +void setCommutationOff(struct rpi_state* this){ + this->commutate=0; + this->main_commutator=zero_commutator; +} diff --git a/pmsm-control/test_sw/pmsm_state.h b/pmsm-control/test_sw/pmsm_state.h index 5d02be2..376e2f8 100644 --- a/pmsm-control/test_sw/pmsm_state.h +++ b/pmsm-control/test_sw/pmsm_state.h @@ -46,8 +46,29 @@ struct rpi_state{ int log_col_count; /* number of log columns */ int log_col; /* current colimn */ char doLogs; /* schall we make logs? */ + + void (*main_commutator)(struct rpi_state*); /* primarni komutator */ + void (*main_controller)(struct rpi_state*); /* primarni regulator */ }; -void freeLogs(); +/** + * Index OK. + */ +void setIndexOK(struct rpi_state*); + +/** + * Index Lost. + */ +void setIndexLost(struct rpi_state*); + +/** + * Turn commutation on. + */ +void setCommutationOn(struct rpi_state*); + +/** + * Turn commutation off. + */ +void setCommutationOff(struct rpi_state*); #endif /*PMSM_STATE*/ -- 2.39.2