]> rtime.felk.cvut.cz Git - fpga/rpi-motor-control.git/blobdiff - pmsm-control/test_sw/main_pmsm.c
Correction of position of subroutines.
[fpga/rpi-motor-control.git] / pmsm-control / test_sw / main_pmsm.c
index a85e65fd62739a86409b17582f0d800468ef78f7..da278cc00301873121087a9b2ec648e36386b7b5 100644 (file)
 #include "rp_spi.h"    /*spi*/
 #include "misc.h"      /*structure for priorities*/
 #include "pxmc_sin_fixed.h"    /*to test sin commutation */
+#include "pmsm_state.h"
+#include "cmd_proc.h"
 
-
-
-#define PRUM_PROUD     2061
-#define PRUM_SOUC      6183
 #define MAX_DUTY       128
 #define PID_P          0.1
 
 #define INIT_VALUE     1       /*init value for semaphor*/
 
 
-#define PXMC_SIN_FIX_TAB_BITS 9
-#define PXMC_SIN_FIX_IDX_SLR  23
-#define PXMC_SIN_FIX_XD_MASK  0x007fffff
-#define PXMC_SIN_FIX_XD_SLR   8
-#define PXMC_SIN_FIX_A_MASK   0xffffc000
-#define PXMC_SIN_FIX_B_SLL    19
-#define PXMC_SIN_FIX_B_SAR    16
-#define PXMC_SIN_FIX_B_XD_SAR 6
-#define PXMC_SIN_FIX_ZIC_MASK 0x00002000
-#define PXMC_SIN_FIX_ZIC_BIT  13
-
-#define PXMC_SIN_FIX_PI2      0x40000000
-#define PXMC_SIN_FIX_2PI3     0x55555555
-
 #define NSEC_PER_SEC    (1000000000) /* The number of nsecs per sec. */
 
 
-
 struct rpi_in data;
-struct rpi_state{
-       uint8_t test;
-       uint16_t pwm1, pwm2, pwm3;
-       uint16_t t_pwm1, t_pwm2, t_pwm3;
-       char commutate;
-       int duty;                       /* duty cycle of pwm */
-       uint16_t index_dist;            /* distance to index position */
-       unsigned char index_ok;
-       uint32_t tf_count;              /*number of transfer*/
-       int desired_pos;                /* desired position */
-}rps;
-
+struct rpi_state rps={
+       .spi_dat=&data,
+       .thd_par_sem=NULL,
+       .test=0,
+       .pwm1=0,.pwm2=0, .pwm3=0,
+       .pwm1=0, .t_pwm2=0, .t_pwm3=0,
+       .commutate=0,
+       .duty=0,                        /* duty cycle of pwm */
+       .index_dist=0,          /* distance to index position */
+       .index_ok=0,
+       .tf_count=0,            /*number of transfer*/
+       .desired_pos=0          /* desired position */
+};
 
 /**
  * \brief Initilizes GPCLK.
@@ -94,7 +78,7 @@ void appl_stop(){
        spi_disable();
        clk_disable();
        /*muzeme zavrit semafor*/
-       sem_destroy(&thd_par_sem);
+       sem_destroy(&rps.thd_par_sem);
         printf("\nprogram bezpecne ukoncen\n");
 }
 
@@ -103,66 +87,8 @@ void substractOffset(struct rpi_in* data, struct rpi_in* offset){
        data->pozice-=offset->pozice;
        return;
 }
-/*
- * pocita procentualni odchylku od prumerneho proudu
- */
-float diff_p(float value){
-       return ((float)value-PRUM_PROUD)*100/PRUM_PROUD;
-}
-/*
- * pocita procentualni odchylku od prumerneho souctu proudu
- */
-float diff_s(float value){
-       return ((float)value-PRUM_SOUC)*100/PRUM_SOUC;
-}
-/*
- * tiskne potrebna data
- */
-void printData(){
-       struct rpi_in data_p;
-       struct rpi_state s;     /*state*/
-       float cur0, cur1, cur2;
-       int i;
-       /* copy the data */
-       sem_wait(&thd_par_sem);
-       data_p = data;
-       s=rps;
-       sem_post(&thd_par_sem);
-
-       if (data_p.adc_m_count){
-               cur0=data_p.ch0/data_p.adc_m_count;
-               cur1=data_p.ch1/data_p.adc_m_count;
-               cur2=data_p.ch2/data_p.adc_m_count;
-       }
-       for (i = 0; i < 16; i++) {
-                       if (!(i % 6))
-                               puts("");
-                       printf("%.2X ", data_p.debug_rx[i]);
-       }
-       puts("");
-       printf("\npozice=%d\n",(int32_t)data_p.pozice);
-       printf("chtena pozice=%d\n",s.desired_pos);
-       printf("transfer count=%u\n",s.tf_count);
-       printf("raw_pozice=%u\n",data_p.pozice_raw);
-       printf("raw_pozice last12=%u\n",(data_p.pozice_raw&0x0FFF));
-       printf("index position=%u\n",data_p.index_position);
-       printf("hal1=%d, hal2=%d, hal3=%d\n",data_p.hal1,data_p.hal2,data_p.hal3);
-       printf("en1=%d, en2=%d, en3=%d (Last sent)\n",!!(0x40&s.test),!!(0x20&s.test),!!(0x10&s.test));
-       printf("shdn1=%d, shdn2=%d, shdn3=%d (L.s.)\n",!!(0x08&s.test),!!(0x04&s.test),!!(0x02&s.test));
-       printf("PWM1=%u(L.s.)\n",s.pwm1);
-       printf("PWM2=%u(L.s.)\n",s.pwm2);
-       printf("PWM3=%u(L.s.)\n",s.pwm3);
-       printf("distance to index=%u\n",s.index_dist);
-       printf("T_PWM1=%u T_PWM2=%u T_PWM3=%u\n",s.t_pwm1,s.t_pwm2, s.t_pwm3);
-       printf("Pocet namerenych proudu=%u\n",data_p.adc_m_count);
-       printf("(pwm1) (ch1)=%d (avg=%4.0f) (%2.2f%%)\n",data_p.ch1,cur1,diff_p(cur1));
-       printf("(pwm2) (ch2)=%d (avg=%4.0f)(%2.2f%%)\n",data_p.ch2,cur2,diff_p(cur2));
-       printf("(pwm3) (ch0)=%d (avg=%4.0f)(%2.2f%%)\n",data_p.ch0,cur0,diff_p(cur0));
-       printf("soucet prumeru=%5.0f (%2.2f%%)\n",cur0+cur1+cur2,diff_s(cur0+cur1+cur2));
-       printf("duty=%d\n",s.duty);
-       if (s.index_ok) printf("index ok\n");
-       if (s.commutate) printf("commutation in progress\n");
-}
+
+
 void prepare_tx(uint8_t * tx){
 
        /*Data format:
@@ -228,7 +154,7 @@ void prepare_tx(uint8_t * tx){
  */
 void * pos_monitor(void* param){
        while(1){
-               printData();
+               printData(&rps);
                usleep(1000000);        /*1 Hz*/
        }
        return (void*)0;
@@ -236,8 +162,9 @@ void * pos_monitor(void* param){
 /*
  * \brief
  * Multiplication of 11 bit
+ * Zaporne vysledky prvede na nulu.
  */
-inline int16_t mult_cap(int32_t s,int d){
+inline uint16_t mult_cap(int32_t s,int d){
        int j;
        int res=0;
        for(j=0;j!=11;j++){
@@ -255,33 +182,50 @@ int sin_commutator(int duty){
        #define DEGREE_300      3579139413
        uint32_t j,pos;
        int32_t sin;
-       pos=rps.index_dist*4294967;
+       pos=rps.index_dist;
+       int32_t pwm;
+       /*aby prictene uhly mohla byt kulata cisla, musime index posunout*/
+       pos+=38;
+       /*use it as cyclic 32-bit logic*/
+       pos*=4294967;
        if (duty>=0){   /*clockwise rotation*/
                /* 1st phase */
                sin = pxmc_sin_fixed_inline(pos+DEGREE_240,10); /*10+1 bity*/ /*-120*/
-                rps.pwm1=mult_cap(sin, duty);
+                pwm=sin*duty/1024;
+                if (pwm<0) pwm=0;
+               rps.pwm1=(uint16_t)pwm;
 
                 /* 2nd phase */
                 sin = pxmc_sin_fixed_inline(pos+DEGREE_120,10); /*10+1 bity*/ /*-240*/
-                rps.pwm2=mult_cap(sin, duty);;
+                pwm=sin*duty/1024;
+                if (pwm<0) pwm=0;
+                rps.pwm2=(uint16_t)pwm;
 
                 /* 3rd phase */
                 sin = pxmc_sin_fixed_inline(pos,10); /*10+1 bity*/
-                rps.pwm3=mult_cap(sin, duty);;
+                pwm=sin*duty/1024;
+                if (pwm<0) pwm=0;
+                rps.pwm3=(uint16_t)pwm;
         }else{
                duty=-duty;
 
                /* 1st phase */
                sin = pxmc_sin_fixed_inline(pos+DEGREE_60,10); /*10+1 bity*/ /*-300*/
-                rps.pwm1=mult_cap(sin, duty);
+               pwm=sin*duty/1024;
+               if (pwm<0) pwm=0;
+               rps.pwm1=(uint16_t)pwm;
 
                 /* 2nd phase */
                 sin = pxmc_sin_fixed_inline(pos+DEGREE_300,10); /*10+1 bity*/ /*-60-*/
-                rps.pwm2=mult_cap(sin, duty);
+                pwm=sin*duty/1024;
+                if (pwm<0) pwm=0;
+                rps.pwm2=(uint16_t)pwm;
 
                 /* 3rd phase */
                 sin = pxmc_sin_fixed_inline(pos+DEGREE_180,10); /*10+1 bity*/ /*-180*/
-                rps.pwm3=mult_cap(sin, duty);
+                pwm=sin*duty/1024;
+                if (pwm<0) pwm=0;
+                rps.pwm3=(uint16_t)pwm;
         }
         return 0;
 }
@@ -477,7 +421,7 @@ void * read_data(void* param){
                while(1){
                        /* wait until next shot */
                        clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t, NULL);
-                       sem_wait(&thd_par_sem);         /*---take semaphore---*/
+                       sem_wait(&rps.thd_par_sem);             /*---take semaphore---*/
                        prepare_tx(tx);                 /*save the data to send*/
                        data = spi_read(tx);            /*exchange data*/
                        /*subtract initiate postion */
@@ -499,7 +443,7 @@ void * read_data(void* param){
                        }else if(!rps.index_ok && rps.commutate){
                                simple_hall_commutator(rps.duty);
                        }
-                       sem_post(&thd_par_sem);         /*--post semaphore---*/
+                       sem_post(&rps.thd_par_sem);             /*--post semaphore---*/
 
                        /* calculate next shot */
                        t.tv_nsec += interval;
@@ -513,74 +457,7 @@ void * read_data(void* param){
 }
 
 
-/**
- * \brief
- * Commands detection.
- */
-void poll_cmd(){
-       unsigned int tmp;
-       /*
-        * Note:
-        * pri pouziti scanf("%u",&simple_hall_duty); dochazelo
-        * k preukladani hodnot na promenne test. Dost divne.
-        */
-       while (1){
-               scanf("%u",&tmp);
-               printf("volba=%u\n",tmp);
-               switch (tmp){
-               case 1:
-                       scanf("%u",&tmp);
-                       sem_wait(&thd_par_sem);
-                       rps.pwm1=tmp&0xFFF;
-                       sem_post(&thd_par_sem);
-                       break;
-               case 2:
-                       scanf("%u",&tmp);
-                       sem_wait(&thd_par_sem);
-                       rps.pwm2=tmp&0xFFF;
-                       sem_post(&thd_par_sem);
-                       break;
-               case 3:
-                       scanf("%u",&tmp);
-                       sem_wait(&thd_par_sem);
-                       rps.pwm3=tmp&0xFFF;
-                       sem_post(&thd_par_sem);
-                       break;
-               case 4:
-                       scanf("%u",&tmp);
-                       sem_wait(&thd_par_sem);
-                       rps.test=tmp&0xFF;
-                       sem_post(&thd_par_sem);
-                       break;
-               case 5:
-                       sem_wait(&thd_par_sem);
-                       rps.commutate=!rps.commutate;
-                       /* switch off pwms at the end of commutation */
-                       rps.pwm1&=rps.commutate*0xFFFF;
-                       rps.pwm2&=rps.commutate*0xFFFF;
-                       rps.pwm3&=rps.commutate*0xFFFF;
-                       sem_post(&thd_par_sem);
-                       break;
-               case 6:
-                       scanf("%d",&tmp);
-                       sem_wait(&thd_par_sem);
-                       rps.duty=tmp;
-                       sem_post(&thd_par_sem);
-                       break;
-               case 7:
-                       scanf("%d",&tmp);
-                       sem_wait(&thd_par_sem);
-                       rps.desired_pos=tmp;
-                       sem_post(&thd_par_sem);
-                       break;
-
-               default:
-                       break;
-               }
 
-       }
-       return ;
-}
 /**
  * \brief Main function.
  */
@@ -591,7 +468,7 @@ int main(){
        spi_init();             /* iniicializace spi*/
 
        /*semafor pro detekci zpracovani parametru vlaken*/
-       sem_init(&thd_par_sem,THREAD_SHARED,INIT_VALUE);
+       sem_init(&rps.thd_par_sem,THREAD_SHARED,INIT_VALUE);
        setup_environment();
 
        base_thread_id=pthread_self();
@@ -603,7 +480,7 @@ int main(){
        create_rt_task(&base_thread_id,PRIOR_LOW,pos_monitor,NULL);
 
        /*wait for commands*/
-       poll_cmd();
+       poll_cmd(&rps);
 
        return 0;
 }