FRDM_wahadlo_torsyjne

Dependencies:   mbed BufferedSerial

Fork of FRDM_wahadlo_torsyjne by Wojciech M

Committer:
Pawel_13
Date:
Wed Oct 11 08:11:43 2017 +0000
Revision:
18:97a08a408bc7
Parent:
14:93a9776b5dee
Child:
19:2012df6b8e56
11_10_2017

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wojtekmir 13:8810ad3ccc04 1 //Program zmodyfikowany. Instrukcja obsługi:
wojtekmir 13:8810ad3ccc04 2 //Po włączeniu zasilania sterownika SMC (26V) i podłączeniu przewodu USB silnik zostaje zablokowany (ciężko go ruszyć)
wojtekmir 13:8810ad3ccc04 3 // w celu ustawienia punktu początkowego trzymamy przycisk RESET na płytce FRDM (silnik obraca się łatwo)
wojtekmir 13:8810ad3ccc04 4 // po ustawieniu punktu początkowego puszczamy przycisk RESET
wojtekmir 13:8810ad3ccc04 5 // sterownik inicjalizuje program, zapisuje położenia zerowe czujników
wojtekmir 13:8810ad3ccc04 6 // po odliczeniu 5 sekund wykonuje procedurę startową (przekręca silnik o połowę ustawionego zakresu i
wojtekmir 13:8810ad3ccc04 7 // zmienia stan wyjścia direction
wojtekmir 13:8810ad3ccc04 8 // następnie wykonywane są przerwania pomiaru i sterowania
wojtekmir 13:8810ad3ccc04 9 //
wojtekmir 13:8810ad3ccc04 10 // na oscyloskopie widać, że wysyłanie danych pomiarowych nie wpływa na sterowanie silnikiem (wyjście direction) i sygnał PWM
wojtekmir 13:8810ad3ccc04 11 //
wojtekmir 13:8810ad3ccc04 12 // dołączenie dodatkowego kanału dla górnego czujnika nic nieda, ponieważ sygnał jest odwrócony w fazie o 180 stopni,
wojtekmir 13:8810ad3ccc04 13 // a nie przesunięty w fazie- nie da się na jego podstawie ustlić kierunku obrotu ani osiągnięcia pełnego obrotu
wojtekmir 13:8810ad3ccc04 14 // ciała swobodnego
wojtekmir 13:8810ad3ccc04 15
wojtekmir 1:a4f9276a0f35 16 #include "mbed.h"
Pawel_13 18:97a08a408bc7 17 #include "BufferedSerial.h"
wojtekmir 1:a4f9276a0f35 18
Pawel_13 18:97a08a408bc7 19 Ticker triger1; //interrupt. No. 1
Pawel_13 18:97a08a408bc7 20 Ticker triger2; //interrupt No. 2
wojtekmir 10:497e9a0da7d6 21
Pawel_13 18:97a08a408bc7 22 int motor_PWM_period_us = 500; //period of PWM signal in mikroseconds
Pawel_13 18:97a08a408bc7 23 // 3200 kroków to pełny kąt
Pawel_13 18:97a08a408bc7 24 int EXC_angle = 1600/2/4; //360 stopni to 3200 krok. przy mkrok. = 1.8/16 dzielic przez 2
Pawel_13 18:97a08a408bc7 25 //float switch_dir_time=(float)((float)EXC_angle/500.0)*((float)motor_PWM_period_us/1000.0);
wojtekmir 11:b3bd4b86f914 26 float switch_dir_time=(float)((float)EXC_angle/500.0)*((float)motor_PWM_period_us/1000.0);
Pawel_13 18:97a08a408bc7 27 //float switch_dir_time = 1;
Pawel_13 18:97a08a408bc7 28 float sampling_time = 0.005;
Pawel_13 18:97a08a408bc7 29 int samples_in_period = int(switch_dir_time/sampling_time);
wojtekmir 12:103f3fbeab78 30 int zero_analog_IN_0 = 0;
wojtekmir 12:103f3fbeab78 31 int zero_analog_IN_1 = 0;
Pawel_13 18:97a08a408bc7 32 float timet = 0;
wojtekmir 12:103f3fbeab78 33
wojtekmir 13:8810ad3ccc04 34 DigitalOut direction(PTC7); // zmiana wartości logicznej na wyjściu PTC7 powoduje zmianę kieruneku obrotów
Pawel_13 18:97a08a408bc7 35 DigitalOut enable_driver(PTE2); // zezwolenie na start
wojtekmir 13:8810ad3ccc04 36 DigitalOut myled(LED_GREEN); // dioda zielona sygnalizuje zmianę kierunku obrotów
wojtekmir 13:8810ad3ccc04 37 AnalogIn analog_IN_0(PTB0); // odczyt napięcia z wejścia analogowego 0 (kąt obrotu kolumny)
Pawel_13 18:97a08a408bc7 38 // PTB1 - sygnał odwrócony
Pawel_13 18:97a08a408bc7 39 AnalogIn analog_IN_1(PTB2); // odczyt napięcia z wejścia analogowego 1 (kąt obrotu ciała swobodnego)
Pawel_13 18:97a08a408bc7 40 // PTB3 - sygnał odwrócony
wojtekmir 13:8810ad3ccc04 41 PwmOut motor(PTA5); // sygnał PWM do sterowania sterownikiem silnika krokowego
Pawel_13 18:97a08a408bc7 42 //Serial pc(USBTX,USBRX); // komunikacja z PC
Pawel_13 18:97a08a408bc7 43 BufferedSerial pc(USBTX,USBRX);
Pawel_13 18:97a08a408bc7 44 char buffer[24];
Pawel_13 9:3540ad710232 45
Pawel_13 8:434d613f0929 46 float get_voltage_in(AnalogIn analog_in, float zero_analog_in) {
wojtekmir 13:8810ad3ccc04 47 return (analog_in.read() - zero_analog_in) * 2.9035; // przesunięcie do zera i skalowanie napiecia do zakresu
Pawel_13 3:2ba53b9a499a 48 }
wojtekmir 10:497e9a0da7d6 49 void task1() {
wojtekmir 10:497e9a0da7d6 50 myled = !myled;
wojtekmir 10:497e9a0da7d6 51 direction = !direction;
Pawel_13 18:97a08a408bc7 52 //pc.printf("%.2f\t%d\n\r", timet, int(direction));
wojtekmir 10:497e9a0da7d6 53 }
Pawel_13 3:2ba53b9a499a 54
wojtekmir 10:497e9a0da7d6 55 void task2() {
Pawel_13 18:97a08a408bc7 56 //get_voltage_in(analog_IN_0, zero_analog_IN_0);
Pawel_13 18:97a08a408bc7 57 //get_voltage_in(analog_IN_1, zero_analog_IN_1);
Pawel_13 18:97a08a408bc7 58 //pc.printf("%.2f\t%.2f\t%.2f\n\r", timet, get_voltage_in(analog_IN_1, zero_analog_IN_1), get_voltage_in(analog_IN_0, zero_analog_IN_0));
Pawel_13 18:97a08a408bc7 59 //pc.printf("%.2f\n%.2f\n%.2f\n", timet, get_voltage_in(analog_IN_1, zero_analog_IN_1), get_voltage_in(analog_IN_0, zero_analog_IN_0));
Pawel_13 18:97a08a408bc7 60
Pawel_13 18:97a08a408bc7 61 sprintf((char*)buffer, "%.2f %.2f\n", get_voltage_in(analog_IN_1, zero_analog_IN_1), get_voltage_in(analog_IN_0, zero_analog_IN_0));
Pawel_13 18:97a08a408bc7 62 pc.printf(buffer);
Pawel_13 18:97a08a408bc7 63
Pawel_13 18:97a08a408bc7 64
Pawel_13 18:97a08a408bc7 65 timet += sampling_time;
Pawel_13 18:97a08a408bc7 66 }
Pawel_13 8:434d613f0929 67
Pawel_13 8:434d613f0929 68 int main() {
wojtekmir 13:8810ad3ccc04 69 pc.baud(115200); // największa szybkość standardowa, jaką można zadać to 19200
wojtekmir 13:8810ad3ccc04 70 // im większa prędkość transmisji tym mniejsze czasy wysyłania- więcej niż 115200 nie osiągalne
wojtekmir 13:8810ad3ccc04 71 // dla 115200 mamy mniejsze czasy wysyłania (możemy wysyłać częściej- co 10ms)
Pawel_13 18:97a08a408bc7 72 enable_driver = 1; // enable signal to allow the driver for work
wojtekmir 12:103f3fbeab78 73 zero_analog_IN_0 = analog_IN_0.read();
Pawel_13 18:97a08a408bc7 74 zero_analog_IN_1 = analog_IN_1.read();
Pawel_13 18:97a08a408bc7 75 //pc.printf("Switch direction time: %.6f\n\r", switch_dir_time);
Pawel_13 18:97a08a408bc7 76 //pc.printf("Samples in period: %d\n\r", samples_in_period);
Pawel_13 18:97a08a408bc7 77 //pc.printf("Sampling time: %.6f\n\r", sampling_time);
Pawel_13 18:97a08a408bc7 78 wait(6); //czas na ustawienia początkowe 10 sek.
wojtekmir 13:8810ad3ccc04 79 motor.period_us(motor_PWM_period_us);
Pawel_13 18:97a08a408bc7 80 motor = 0.5; // duty cycle of the PWM signal
Pawel_13 18:97a08a408bc7 81 timet = 0.0;
Pawel_13 18:97a08a408bc7 82 //wait(switch_dir_time/2); // położenie zerowe silnika do ustalenia zer czujników
Pawel_13 18:97a08a408bc7 83 //wait_ms(1800);
wojtekmir 13:8810ad3ccc04 84 direction = !direction; // i uruchomienie silnika
Pawel_13 18:97a08a408bc7 85 switch_dir_time = 0.9;
Pawel_13 18:97a08a408bc7 86 triger2.attach(&task2, sampling_time);
wojtekmir 11:b3bd4b86f914 87 triger1.attach(&task1, switch_dir_time);
wojtekmir 10:497e9a0da7d6 88
Pawel_13 8:434d613f0929 89 while (true) {
Pawel_13 18:97a08a408bc7 90 wait(10); // zajęcie sterownika, zabezpieczenie przed zawieszeniem pracy sterownika
wojtekmir 1:a4f9276a0f35 91 }
wojtekmir 11:b3bd4b86f914 92 }