FRDM_wahadlo_torsyjne
Dependencies: mbed BufferedSerial
Fork of FRDM_wahadlo_torsyjne by
main.cpp
- Committer:
- wojtekmir
- Date:
- 2014-06-19
- Revision:
- 16:b2f8fef7be1c
- Parent:
- 15:fa12498ab984
- Child:
- 17:a929d0ed1dbf
File content as of revision 16:b2f8fef7be1c:
// Program zmodyfikowany. Instrukcja obsługi: // Po włączeniu zasilania sterownika SMC (26V) i podłączeniu przewodu USB silnik zostaje zablokowany (ciężko go ruszyć) // w celu ustawienia punktu początkowego trzymamy przycisk RESET na płytce FRDM (silnik obraca się łatwo) // po ustawieniu punktu początkowego puszczamy przycisk RESET // sterownik inicjalizuje program, zapisuje położenia zerowe czujników // po odliczeniu 5 sekund wykonuje procedurę startową (przekręca silnik o połowę ustawionego zakresu i // zmienia stan wyjścia direction // następnie wykonywane są przerwania pomiaru i sterowania // // na oscyloskopie widać, że wysyłanie danych pomiarowych nie wpływa na sterowanie silnikiem (wyjście direction) i sygnał PWM // // dołączenie dodatkowego kanału dla górnego czujnika nic nieda, ponieważ sygnał jest odwrócony w fazie o 180 stopni, // a nie przesunięty w fazie- nie da się na jego podstawie ustlić kierunku obrotu ani osiągnięcia pełnego obrotu // ciała swobodnego #include "mbed.h" Ticker triger1; // przerwanie sterowania silnikiem Ticker triger2; // przerwanie wysyłania danych int motor_PWM_period_us = 200; // okres sygnału PWM (w mikrosekundach) wyzwalającego kolejny krok silnika int EXC_angle = 3200/4; // 360 stopni to 3200 krok. przy mkrok. = 1.8/16 float switch_dir_time=(float)((float)EXC_angle/500.0)*((float)motor_PWM_period_us/1000.0); int zero_analog_IN_0 = 0; // położenie zerowe górnego czujnika kanał A int zero_analog_IN_1 = 0; // położenie zerowe górnego czujnika kanał B int zero_analog_IN_2 = 0; // położenie zerowe dolnego czujnika kanał A int zero_analog_IN_3 = 0; // położenie zerowe dolnego czujnika kanał B DigitalOut direction(PTC7); // zmiana wartości logicznej na wyjściu PTC7 powoduje zmianę kieruneku obrotów DigitalOut zezwolenie(PTE2); // zezwolenie na start DigitalOut myled(LED_GREEN); // dioda zielona sygnalizuje zmianę kierunku obrotów AnalogIn analog_IN_0(PTB0); // odczyt napięcia z wejścia analogowego 0 (kąt obrotu kolumny kanał A) AnalogIn analog_IN_1(PTB1); // odczyt napięcia z wejścia analogowego 1 (kąt obrotu kolumny kanał B) AnalogIn analog_IN_2(PTB2); // odczyt napięcia z wejścia analogowego 2 (kąt obrotu ciała swobodnego kanał A) AnalogIn analog_IN_3(PTB3); // odczyt napięcia z wejścia analogowego 3 (kąt obrotu ciała swobodnego kanał B) PwmOut motor(PTA5); // sygnał PWM do sterowania sterownikiem silnika krokowego Serial pc(USBTX,USBRX); // komunikacja z PC float get_voltage_in(AnalogIn analog_in, float zero_analog_in) { return (analog_in.read() - zero_analog_in) * 2.9035; // przesunięcie do zera i skalowanie napiecia do zakresu } void task1() { myled = !myled; direction = !direction; } void task2() { get_voltage_in(analog_IN_0, zero_analog_IN_0); get_voltage_in(analog_IN_1, zero_analog_IN_1); get_voltage_in(analog_IN_2, zero_analog_IN_2); get_voltage_in(analog_IN_3, zero_analog_IN_3); pc.printf("%.3f\t%.3f\t%.3f\t%.3f\n", get_voltage_in(analog_IN_0, zero_analog_IN_0), get_voltage_in(analog_IN_1, zero_analog_IN_1), get_voltage_in(analog_IN_2, zero_analog_IN_2), get_voltage_in(analog_IN_3, zero_analog_IN_3)); } int main() { pc.baud(115200); // ustawienie szykości transmisji z PC zezwolenie = 1; // zezwolenie na start sterownika silnika krokowego zero_analog_IN_0 = analog_IN_0.read(); zero_analog_IN_1 = analog_IN_1.read(); zero_analog_IN_2 = analog_IN_2.read(); zero_analog_IN_3 = analog_IN_3.read(); wait(5); // czas na ustawienia początkowe 5 sek. motor.period_us(motor_PWM_period_us); motor = 0.5; // wypełnienie PWM sygnału CLK wait(switch_dir_time/2); // położenie zerowe silnika do ustalenia zer czujników direction = !direction; // i uruchomienie silnika triger2.attach(&task2, 3); triger1.attach(&task1, switch_dir_time); while (true) { wait(10); // zajęcie sterownika, żeby się nie zawiesił- tak było w manualu } }