]> rtime.felk.cvut.cz Git - fpga/rpi-motor-control.git/blob - pmsm-control/test_sw/cmd_proc.c
66e9be804b321c4540db865cc353f8072d094e57
[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 #include "logs.h"
7
8 #define PRUM_PROUD      2061
9 #define PRUM_SOUC       6183
10
11 static char doPrint = 1;
12
13
14 /*
15  * \brief
16  * Help
17  */
18 static void printHelp(){
19         doPrint=0;
20         puts("start - Pripravi rizeni, zapne enable bity pwm.");
21         puts("stop - Vypne komutaci, pwm a rizeni.");
22         puts("0 - Vypne komutaci, pwm a rizeni.");
23         puts("ga:[hodnota] - Zapne rizeni na zvolenou absolutni pozici.");
24         puts("duty:[hodnota] - Nastavi pevnou sirku plneni.");
25         puts("spd:[hodnota] - Zapne rizeni na danou rychlost.");
26         puts("log - Spusti nebo ulozi logovani.");
27         puts("ao:[hodnota] - Prenastavi alpha offset.");
28
29         puts("print - Zapne nebo vypne pravidelne vypisovani hodnot.");
30         puts("help - Vypne vypisovani hodnot a zobrazi tuto napovedu.");
31         puts("exit - Bezpecne ukonci program.");
32 }
33
34
35 /*
36  * \brief
37  * V prikazech je hodnota od zneni prikazu delena dvojteckou
38  * tato funkce dvojtecku nahradi mezerou
39  */
40 static void delCol(char * txt){
41         unsigned i=0;
42         while(txt[i]!='\0'){
43                 if (txt[i]==':') txt[i]=' ';
44                 i++;
45         }
46 }
47
48 /*
49  * Nastavi enable bity na pwm,
50  * zapne komutaci
51  */
52 static void start(struct rpi_state* state){
53         sem_wait(&state->thd_par_sem);
54         state->test=0x70;       /*konfiguracni byte*/
55         sem_post(&state->thd_par_sem);
56 }
57
58 /*
59  * \brief
60  * Zastavi komutaci, vypne pwm
61  */
62 static void stop(struct rpi_state* state){
63         sem_wait(&state->thd_par_sem);
64         setCommutationOff(state);
65         setRegulationOff(state);
66         state->duty=0;
67         state->pwm1=0;
68         state->pwm2=0;
69         state->pwm3=0;
70         sem_post(&state->thd_par_sem);
71 }
72
73 /*
74  * \brief
75  * Nastavi pevnou sirku plneni
76  */
77 static void dutySet(struct rpi_state* state, int duty){
78         sem_wait(&state->thd_par_sem);
79         if (duty>MAX_DUTY) duty=MAX_DUTY;
80         if (duty<-MAX_DUTY) duty=-MAX_DUTY;/*paranoia*/
81         state->duty=duty;
82         setRegulationOff(state);
83         setCommutationOn(state);
84         sem_post(&state->thd_par_sem);
85 }
86
87 /*
88  * \brief
89  * Zapne rizeni na zvolenou polohu vztazenou k pozici pri startu
90  */
91 static void goAbsolute(struct rpi_state* state, int pos){
92         sem_wait(&state->thd_par_sem);
93         setRegulationPos(state);
94         setCommutationOn(state);
95         state->desired_pos=pos;
96         sem_post(&state->thd_par_sem);
97 }
98
99 /*
100  * \brief
101  * Zapne nebo vypne pravidelne vypisovani hodnot.
102  */
103 static void changePrint(){
104         doPrint=!doPrint;
105 }
106
107 /*
108  * \brief
109  * Bezpecne ukonci program.
110  */
111 static void exitApp(struct rpi_state* state){
112         stop(state);
113         /* Note: atexit() is set before*/
114         exit(0);
115 }
116 /*
117  * \brief
118  * Set speed.
119  */
120 static void setSpeed(struct rpi_state* state, int speed){
121         if (speed>MAX_SPEED) speed=MAX_SPEED;
122         if (speed<-MAX_SPEED) speed=-MAX_SPEED;/*paranoia*/
123         sem_wait(&state->thd_par_sem);
124         setRegulationSpeed(state);
125         setCommutationOn(state);
126         state->desired_spd=speed;
127         sem_post(&state->thd_par_sem);
128 }
129
130 /*
131  * \brief
132  * Set alpha offset.
133  */
134 static void setAlphaOff(struct rpi_state* state, int offset){
135         if (offset<0) offset*=-1;
136         offset%=1000;
137         sem_wait(&state->thd_par_sem);
138         state->alpha_offset=(unsigned short)offset;
139         sem_post(&state->thd_par_sem);
140 }
141
142 /**
143  * \brief
144  * SetLog
145  * if logs are being logged, save them
146  * if they are not, start log them
147  */
148 static void setLogSEM(struct rpi_state* state){
149         sem_wait(&state->thd_par_sem);
150         /* ulozim logy a vypnu zachytavani*/
151         if (state->log_col_count){
152                 state->doLogs=0;
153                 sem_post(&state->thd_par_sem);
154                 saveLogs(state);
155         /* spustim zachytavani logu */
156         }else{
157                 logInit(state);
158                 sem_post(&state->thd_par_sem);
159         }
160 }
161
162 /**
163  * \brief
164  * Commands detection.
165  */
166 void poll_cmd(struct rpi_state* state){
167         unsigned int tmp;
168         char buff[50];
169         char cmd[30];
170         int val;
171
172         while(1){
173                 scanf("%49s",buff);
174                 delCol(buff);
175                 sscanf(buff,"%s %d",cmd,&val);
176
177
178                 if (!strcmp(cmd,"start")){
179                         start(state);
180                 }else if (!strcmp(cmd,"0")){
181                         stop(state);
182                 }else if (!strcmp(cmd,"stop")){
183                         stop(state);
184                 }else if (!strcmp(cmd,"ga")){
185                         goAbsolute(state,val);
186                 }else if (!strcmp(cmd,"duty")){
187                         dutySet(state,val);
188                 }else if (!strcmp(cmd,"help")){
189                         printHelp();
190                 }else if (!strcmp(cmd,"print")){
191                         changePrint();
192                 }else if (!strcmp(cmd,"exit")){
193                         exitApp(state);
194                 }else if (!strcmp(cmd,"spd")){
195                         setSpeed(state, val);
196                 }else if (!strcmp(cmd,"log")){
197                         setLogSEM(state);
198                 }else if (!strcmp(cmd,"ao")){
199                         setAlphaOff(state,val);
200                 }
201         }
202
203 }
204
205 /*
206  * pocita procentualni odchylku od prumerneho proudu
207  */
208 static float diff_p(float value){
209         return ((float)value-PRUM_PROUD)*100/PRUM_PROUD;
210 }
211 /*
212  * pocita procentualni odchylku od prumerneho souctu proudu
213  */
214 static float diff_s(float value){
215         return ((float)value-PRUM_SOUC)*100/PRUM_SOUC;
216 }
217
218 /*
219  * tiskne potrebna data
220  */
221 void printData(struct rpi_state* state){
222         if (!doPrint) return;
223
224         struct rpi_in data_p;
225         struct rpi_state s;     /*state*/
226         float cur0, cur1, cur2;
227         int i;
228         /* copy the data */
229         sem_wait(&state->thd_par_sem);
230         data_p = *state->spi_dat;
231         s=*state;
232         sem_post(&state->thd_par_sem);
233
234         if (data_p.adc_m_count){
235                 cur0=data_p.ch0/data_p.adc_m_count;
236                 cur1=data_p.ch1/data_p.adc_m_count;
237                 cur2=data_p.ch2/data_p.adc_m_count;
238         }
239         for (i = 0; i < 16; i++) {
240                         if (!(i % 6))
241                                 puts("");
242                         printf("%.2X ", data_p.debug_rx[i]);
243         }
244         puts("");
245         printf("\npozice=%ld\n",data_p.pozice);
246         printf("rychlost=%d\n",s.speed);
247         printf("chtena pozice=%d\n",s.desired_pos);
248         printf("chtena rychlost=%d\n",s.desired_spd);
249         printf("alpha offset=%hu\n",s.alpha_offset);
250         printf("transfer count=%u\n",s.tf_count);
251         printf("raw_pozice=%u\n",data_p.pozice_raw);
252         printf("raw_pozice last12=%u\n",(data_p.pozice_raw&0x0FFF));
253         printf("index position=%u\n",data_p.index_position);
254         printf("distance to index=%u\n",s.index_dist);
255         printf("hal1=%d, hal2=%d, hal3=%d\n",data_p.hal1,data_p.hal2,data_p.hal3);
256         printf("en1=%d, en2=%d, en3=%d (Last sent)\n",!!(0x40&s.test),!!(0x20&s.test),!!(0x10&s.test));
257         printf("shdn1=%d, shdn2=%d, shdn3=%d (L.s.)\n",!!(0x08&s.test),!!(0x04&s.test),!!(0x02&s.test));
258         printf("  PWM1=%u   PWM2=%u   PWM3=%u\n",s.pwm1,s.pwm2,s.pwm3);
259         printf("T_PWM1=%u T_PWM2=%u T_PWM3=%u\n",s.t_pwm1,s.t_pwm2, s.t_pwm3);
260         printf("Pocet namerenych proudu=%u\n",data_p.adc_m_count);
261         printf("(pwm1) (ch1)=%d (avg=%4.0f) (%2.2f%%)\n",data_p.ch1,cur1,diff_p(cur1));
262         printf("(pwm2) (ch2)=%d (avg=%4.0f)(%2.2f%%)\n",data_p.ch2,cur2,diff_p(cur2));
263         printf("(pwm3) (ch0)=%d (avg=%4.0f)(%2.2f%%)\n",data_p.ch0,cur0,diff_p(cur0));
264         printf("soucet prumeru=%5.0f (%2.2f%%)\n",cur0+cur1+cur2,diff_s(cur0+cur1+cur2));
265         printf("duty=%d\n",s.duty);
266         if (s.index_ok) printf("index ok\n");
267         if (s.commutate) printf("commutation in progress\n");
268         if (s.doLogs) printf("logujeme\n");
269         if (s.error) printf("error pri maloc logs!! \n");
270
271 }