]> rtime.felk.cvut.cz Git - fpga/rpi-motor-control.git/blob - pmsm-control/test_sw/cmd_proc.c
69c17b8f81b21ac9fc1236392914f7275480a380
[fpga/rpi-motor-control.git] / pmsm-control / test_sw / cmd_proc.c
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <string.h>
4
5 #include "cmd_proc.h"
6
7 #define PRUM_PROUD      2061
8 #define PRUM_SOUC       6183
9
10 static char doPrint = 1;
11
12 /*
13  * \brief
14  * Help
15  */
16 static void printHelp(){
17         doPrint=0;
18         puts("start - Pripravi rizeni, zapne enable bity pwm.");
19         puts("stop - Vypne komutaci, pwm a rizeni.");
20         puts("0 - Vypne komutaci, pwm a rizeni.");
21         puts("ga:[hodnota] - Zapne rizeni na zvolenou absolutni pozici.");
22         puts("print - Zapne nebo vypne pravidelne vypisovani hodnot.");
23         puts("duty:[hodnota] - Nastavi pevnou sirku plneni.");
24
25         puts("help - Vypne vypisovani hodnot a zobrazi tuto napovedu.");
26         puts("exit - Bezpecne ukonci program.");
27 }
28
29
30 /*
31  * \brief
32  * V prikazech je hodnota od zneni prikazu delena dvojteckou
33  * tato funkce dvojtecku nahradi mezerou
34  */
35 static void delCol(char * txt){
36         unsigned i=0;
37         while(txt[i]!='\0'){
38                 if (txt[i]==':') txt[i]=' ';
39                 i++;
40         }
41 }
42
43 /*
44  * Nastavi enable bity na pwm,
45  * zapne komutaci
46  */
47 static void start(struct rpi_state* state){
48         sem_wait(&state->thd_par_sem);
49         state->test=0x70;       /*konfiguracni byte*/
50         sem_post(&state->thd_par_sem);
51 }
52
53 /*
54  * \brief
55  * Zastavi komutaci, vypne pwm
56  */
57 static void stop(struct rpi_state* state){
58         sem_wait(&state->thd_par_sem);
59         state->commutate=0;
60         state->pwm1=0;
61         state->pwm2=0;
62         state->pwm3=0;
63         sem_post(&state->thd_par_sem);
64 }
65
66 /*
67  * \brief
68  * Nastavi pevnou sirku plneni
69  */
70 static void dutySet(struct rpi_state* state, int duty){
71         sem_wait(&state->thd_par_sem);
72         if (duty>512) duty=512;
73         if (duty<-512) duty=-512;/*paranoia*/
74         state->duty=duty;
75         state->commutate=1;
76         state->pos_reg_ena=0;
77         sem_post(&state->thd_par_sem);
78 }
79
80 /*
81  * \brief
82  * Zapne rizeni na zvolenou polohu vztazenou k pozici pri startu
83  */
84 static void goAbsolute(struct rpi_state* state, int pos){
85         sem_wait(&state->thd_par_sem);
86         state->pos_reg_ena=1;
87         state->commutate=1;
88         state->desired_pos=pos;
89         sem_post(&state->thd_par_sem);
90 }
91
92 /*
93  * \brief
94  * Zapne nebo vypne pravidelne vypisovani hodnot.
95  */
96 static void changePrint(){
97         doPrint=!doPrint;
98 }
99
100 /*
101  * \brief
102  * Bezpecne ukonci program.
103  */
104 static void exitApp(struct rpi_state* state){
105         stop(state);
106         /* Note: atexit() is set before*/
107         exit(0);
108 }
109
110 /**
111  * \brief
112  * Commands detection.
113  */
114 void poll_cmd(struct rpi_state* state){
115         unsigned int tmp;
116         char buff[50];
117         char cmd[30];
118         int val;
119
120         while(1){
121                 scanf("%49s",buff);
122                 delCol(buff);
123                 sscanf(buff,"%s %d",cmd,&val);
124
125
126                 if (!strcmp(cmd,"start")){
127                         start(state);
128                 }else if (!strcmp(cmd,"0")){
129                         stop(state);
130                 }else if (!strcmp(cmd,"stop")){
131                         stop(state);
132                 }else if (!strcmp(cmd,"ga")){
133                         goAbsolute(state,val);
134                 }else if (!strcmp(cmd,"duty")){
135                         dutySet(state,val);
136                 }else if (!strcmp(cmd,"help")){
137                         printHelp();
138                 }else if (!strcmp(cmd,"print")){
139                         changePrint();
140                 }else if (!strcmp(cmd,"exit")){
141                         exitApp(state);
142                 }
143         }
144
145 }
146
147 /*
148  * pocita procentualni odchylku od prumerneho proudu
149  */
150 float diff_p(float value){
151         return ((float)value-PRUM_PROUD)*100/PRUM_PROUD;
152 }
153 /*
154  * pocita procentualni odchylku od prumerneho souctu proudu
155  */
156 float diff_s(float value){
157         return ((float)value-PRUM_SOUC)*100/PRUM_SOUC;
158 }
159
160 /*
161  * tiskne potrebna data
162  */
163 void printData(struct rpi_state* state){
164         if (!doPrint) return;
165
166         struct rpi_in data_p;
167         struct rpi_state s;     /*state*/
168         float cur0, cur1, cur2;
169         int i;
170         /* copy the data */
171         sem_wait(&state->thd_par_sem);
172         data_p = *state->spi_dat;
173         s=*state;
174         sem_post(&state->thd_par_sem);
175
176         if (data_p.adc_m_count){
177                 cur0=data_p.ch0/data_p.adc_m_count;
178                 cur1=data_p.ch1/data_p.adc_m_count;
179                 cur2=data_p.ch2/data_p.adc_m_count;
180         }
181         for (i = 0; i < 16; i++) {
182                         if (!(i % 6))
183                                 puts("");
184                         printf("%.2X ", data_p.debug_rx[i]);
185         }
186         puts("");
187         printf("\npozice=%ld\n",data_p.pozice);
188         printf("rychlost=%d\n",s.speed);
189         printf("chtena pozice=%d\n",s.desired_pos);
190         printf("transfer count=%u\n",s.tf_count);
191         printf("raw_pozice=%u\n",data_p.pozice_raw);
192         printf("raw_pozice last12=%u\n",(data_p.pozice_raw&0x0FFF));
193         printf("index position=%u\n",data_p.index_position);
194         printf("distance to index=%u\n",s.index_dist);
195         printf("hal1=%d, hal2=%d, hal3=%d\n",data_p.hal1,data_p.hal2,data_p.hal3);
196         printf("en1=%d, en2=%d, en3=%d (Last sent)\n",!!(0x40&s.test),!!(0x20&s.test),!!(0x10&s.test));
197         printf("shdn1=%d, shdn2=%d, shdn3=%d (L.s.)\n",!!(0x08&s.test),!!(0x04&s.test),!!(0x02&s.test));
198         printf("  PWM1=%u   PWM2=%u   PWM3=%u\n",s.pwm1,s.pwm2,s.pwm3);
199         printf("T_PWM1=%u T_PWM2=%u T_PWM3=%u\n",s.t_pwm1,s.t_pwm2, s.t_pwm3);
200         printf("Pocet namerenych proudu=%u\n",data_p.adc_m_count);
201         printf("(pwm1) (ch1)=%d (avg=%4.0f) (%2.2f%%)\n",data_p.ch1,cur1,diff_p(cur1));
202         printf("(pwm2) (ch2)=%d (avg=%4.0f)(%2.2f%%)\n",data_p.ch2,cur2,diff_p(cur2));
203         printf("(pwm3) (ch0)=%d (avg=%4.0f)(%2.2f%%)\n",data_p.ch0,cur0,diff_p(cur0));
204         printf("soucet prumeru=%5.0f (%2.2f%%)\n",cur0+cur1+cur2,diff_s(cur0+cur1+cur2));
205         printf("duty=%d\n",s.duty);
206         if (s.index_ok) printf("index ok\n");
207         if (s.commutate) printf("commutation in progress\n");
208 }