FRDM_wahadlo_torsyjne

Dependencies:   mbed BufferedSerial

Fork of FRDM_wahadlo_torsyjne by Wojciech M

Committer:
wojtekmir
Date:
Thu Jun 19 13:56:44 2014 +0000
Revision:
16:b2f8fef7be1c
Parent:
15:fa12498ab984
Child:
17:a929d0ed1dbf
dodane kana?y czujnik?w, wersja do wzorcowania

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wojtekmir 16:b2f8fef7be1c 1 // Program zmodyfikowany. Instrukcja obsługi:
wojtekmir 16:b2f8fef7be1c 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"
wojtekmir 1:a4f9276a0f35 17
wojtekmir 16:b2f8fef7be1c 18 Ticker triger1; // przerwanie sterowania silnikiem
wojtekmir 16:b2f8fef7be1c 19 Ticker triger2; // przerwanie wysyłania danych
wojtekmir 10:497e9a0da7d6 20
wojtekmir 16:b2f8fef7be1c 21 int motor_PWM_period_us = 200; // okres sygnału PWM (w mikrosekundach) wyzwalającego kolejny krok silnika
wojtekmir 16:b2f8fef7be1c 22 int EXC_angle = 3200/4; // 360 stopni to 3200 krok. przy mkrok. = 1.8/16
wojtekmir 11:b3bd4b86f914 23 float switch_dir_time=(float)((float)EXC_angle/500.0)*((float)motor_PWM_period_us/1000.0);
wojtekmir 16:b2f8fef7be1c 24 int zero_analog_IN_0 = 0; // położenie zerowe górnego czujnika kanał A
wojtekmir 16:b2f8fef7be1c 25 int zero_analog_IN_1 = 0; // położenie zerowe górnego czujnika kanał B
wojtekmir 16:b2f8fef7be1c 26 int zero_analog_IN_2 = 0; // położenie zerowe dolnego czujnika kanał A
wojtekmir 16:b2f8fef7be1c 27 int zero_analog_IN_3 = 0; // położenie zerowe dolnego czujnika kanał B
wojtekmir 13:8810ad3ccc04 28 DigitalOut direction(PTC7); // zmiana wartości logicznej na wyjściu PTC7 powoduje zmianę kieruneku obrotów
wojtekmir 13:8810ad3ccc04 29 DigitalOut zezwolenie(PTE2); // zezwolenie na start
wojtekmir 13:8810ad3ccc04 30 DigitalOut myled(LED_GREEN); // dioda zielona sygnalizuje zmianę kierunku obrotów
wojtekmir 16:b2f8fef7be1c 31 AnalogIn analog_IN_0(PTB0); // odczyt napięcia z wejścia analogowego 0 (kąt obrotu kolumny kanał A)
wojtekmir 16:b2f8fef7be1c 32 AnalogIn analog_IN_1(PTB1); // odczyt napięcia z wejścia analogowego 1 (kąt obrotu kolumny kanał B)
wojtekmir 16:b2f8fef7be1c 33 AnalogIn analog_IN_2(PTB2); // odczyt napięcia z wejścia analogowego 2 (kąt obrotu ciała swobodnego kanał A)
wojtekmir 16:b2f8fef7be1c 34 AnalogIn analog_IN_3(PTB3); // odczyt napięcia z wejścia analogowego 3 (kąt obrotu ciała swobodnego kanał B)
wojtekmir 13:8810ad3ccc04 35 PwmOut motor(PTA5); // sygnał PWM do sterowania sterownikiem silnika krokowego
wojtekmir 13:8810ad3ccc04 36 Serial pc(USBTX,USBRX); // komunikacja z PC
Pawel_13 9:3540ad710232 37
Pawel_13 8:434d613f0929 38 float get_voltage_in(AnalogIn analog_in, float zero_analog_in) {
wojtekmir 13:8810ad3ccc04 39 return (analog_in.read() - zero_analog_in) * 2.9035; // przesunięcie do zera i skalowanie napiecia do zakresu
Pawel_13 3:2ba53b9a499a 40 }
wojtekmir 10:497e9a0da7d6 41 void task1() {
wojtekmir 10:497e9a0da7d6 42 myled = !myled;
wojtekmir 10:497e9a0da7d6 43 direction = !direction;
wojtekmir 10:497e9a0da7d6 44 }
Pawel_13 3:2ba53b9a499a 45
wojtekmir 10:497e9a0da7d6 46 void task2() {
wojtekmir 10:497e9a0da7d6 47 get_voltage_in(analog_IN_0, zero_analog_IN_0);
wojtekmir 12:103f3fbeab78 48 get_voltage_in(analog_IN_1, zero_analog_IN_1);
wojtekmir 16:b2f8fef7be1c 49 get_voltage_in(analog_IN_2, zero_analog_IN_2);
wojtekmir 16:b2f8fef7be1c 50 get_voltage_in(analog_IN_3, zero_analog_IN_3);
wojtekmir 16:b2f8fef7be1c 51 pc.printf("%.3f\t%.3f\t%.3f\t%.3f\n", get_voltage_in(analog_IN_0, zero_analog_IN_0),
wojtekmir 16:b2f8fef7be1c 52 get_voltage_in(analog_IN_1, zero_analog_IN_1),
wojtekmir 16:b2f8fef7be1c 53 get_voltage_in(analog_IN_2, zero_analog_IN_2),
wojtekmir 16:b2f8fef7be1c 54 get_voltage_in(analog_IN_3, zero_analog_IN_3));
wojtekmir 10:497e9a0da7d6 55 }
Pawel_13 8:434d613f0929 56
Pawel_13 8:434d613f0929 57 int main() {
wojtekmir 16:b2f8fef7be1c 58 pc.baud(115200); // ustawienie szykości transmisji z PC
wojtekmir 16:b2f8fef7be1c 59 zezwolenie = 1; // zezwolenie na start sterownika silnika krokowego
wojtekmir 12:103f3fbeab78 60 zero_analog_IN_0 = analog_IN_0.read();
wojtekmir 12:103f3fbeab78 61 zero_analog_IN_1 = analog_IN_1.read();
wojtekmir 16:b2f8fef7be1c 62 zero_analog_IN_2 = analog_IN_2.read();
wojtekmir 16:b2f8fef7be1c 63 zero_analog_IN_3 = analog_IN_3.read();
wojtekmir 16:b2f8fef7be1c 64 wait(5); // czas na ustawienia początkowe 5 sek.
wojtekmir 13:8810ad3ccc04 65 motor.period_us(motor_PWM_period_us);
wojtekmir 13:8810ad3ccc04 66 motor = 0.5; // wypełnienie PWM sygnału CLK
wojtekmir 13:8810ad3ccc04 67
wojtekmir 13:8810ad3ccc04 68 wait(switch_dir_time/2); // położenie zerowe silnika do ustalenia zer czujników
wojtekmir 13:8810ad3ccc04 69 direction = !direction; // i uruchomienie silnika
wojtekmir 13:8810ad3ccc04 70
Pawel_13 14:93a9776b5dee 71 triger2.attach(&task2, 3);
wojtekmir 11:b3bd4b86f914 72 triger1.attach(&task1, switch_dir_time);
wojtekmir 10:497e9a0da7d6 73
Pawel_13 8:434d613f0929 74 while (true) {
wojtekmir 13:8810ad3ccc04 75 wait(10); // zajęcie sterownika, żeby się nie zawiesił- tak było w manualu
wojtekmir 1:a4f9276a0f35 76 }
wojtekmir 11:b3bd4b86f914 77 }