FRDM_wahadlo_torsyjne
Dependencies: mbed BufferedSerial
Fork of FRDM_wahadlo_torsyjne by
main.cpp@16:b2f8fef7be1c, 2014-06-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |