]> rtime.felk.cvut.cz Git - fpga/rpi-motor-control.git/blobdiff - pmsm-control/test_sw/main_pmsm.c
Commutation function now implemented with use of polymorphism.
[fpga/rpi-motor-control.git] / pmsm-control / test_sw / main_pmsm.c
index 25b0acc1163d1eac045a0887a37d555021cdfa84..ac3563d59b578396991ba6f0088415bb28668929 100644 (file)
@@ -60,9 +60,11 @@ 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*/
 };
 
+
 /**
  * \brief Initilizes GPCLK.
  */
@@ -73,13 +75,6 @@ int clk_init()
        gpioSetMode(4, FSEL_ALT0);
        return 0;
 }
-/*
- * \brief Terminates GPCLK.
- */
-
-inline void clk_disable(){
-       termClock(0);
-}
 
 /**
  * \brief Signal handler pro Ctrl+C
@@ -95,7 +90,7 @@ void appl_stop(){
        spi_read(&rps);
 
        spi_disable();
-       clk_disable();
+       termClock(0);
        freeLogs(&rps);
        /*muzeme zavrit semafor*/
        sem_destroy(&rps.thd_par_sem);
@@ -118,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={
@@ -141,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){
@@ -152,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*/
@@ -166,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)){
@@ -194,11 +181,9 @@ void * read_data(void* param){
                }
 }
 
-
 /**
  * \brief Main function.
  */
-
 int main(){
        pthread_t base_thread_id;
        clk_init();             /* inicializace gpio hodin */
@@ -211,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);