FRDM_wahadlo_torsyjne
Dependencies: mbed BufferedSerial
Fork of FRDM_wahadlo_torsyjne by
Diff: main.cpp
- Revision:
- 13:8810ad3ccc04
- Parent:
- 12:103f3fbeab78
- Child:
- 14:93a9776b5dee
--- a/main.cpp Sat Jun 14 11:52:02 2014 +0000 +++ b/main.cpp Sat Jun 14 13:42:17 2014 +0000 @@ -1,10 +1,22 @@ +//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" -#include "TSISensor.h" -//#include "Timer.h" Ticker triger1; //przerwanie sterowania silnikiem Ticker triger2; //przerwanie wysyłania danych -//TSISensor tsi; //sensor dotykowy 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 @@ -12,17 +24,16 @@ int zero_analog_IN_0 = 0; int zero_analog_IN_1 = 0; -DigitalOut direction(PTC7); //zmiana wartości logicznej na wyjściu PTC7 powoduje zmianę kieruneku obrotów -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) -AnalogIn analog_IN_1(PTB1); //odczyt napięcia z wejścia analogowego 1 (kąt obrotu ciała swobodnego) -PwmOut motor(PTA5); //sygnał PWM do sterowania sterownikiem silnika krokowego -Serial pc(USBTX,USBRX); //komunikacja z PC - -//Timer timer; +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) +AnalogIn analog_IN_1(PTB1); // odczyt napięcia z wejścia analogowego 1 (kąt obrotu ciała swobodnego) +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 + return (analog_in.read() - zero_analog_in) * 2.9035; // przesunięcie do zera i skalowanie napiecia do zakresu } void task1() { myled = !myled; @@ -36,20 +47,23 @@ } int main() { - motor.period_us(motor_PWM_period_us); - motor = 0.5; // wypełnienie PWM sygnału CLK - pc.baud(115200); // największa szybkość standardowa, jaką można zadać to 19200 - //dla 115200 mamy mniejsze czasy wysyłania (możemy wysyłać częściej- co 10ms + pc.baud(115200); // największa szybkość standardowa, jaką można zadać to 19200 + // im większa prędkość transmisji tym mniejsze czasy wysyłania- więcej niż 115200 nie osiągalne + // dla 115200 mamy mniejsze czasy wysyłania (możemy wysyłać częściej- co 10ms) + zezwolenie = 1; //zezwolenie na start sterownika silnika krokowego zero_analog_IN_0 = analog_IN_0.read(); zero_analog_IN_1 = analog_IN_1.read(); - wait(5); //czas na ustawienia początkowe 5 sek. + 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, 0.02); triger1.attach(&task1, switch_dir_time); while (true) { -// if (tsi.readPercentage() < 0.5) -// motor = 0.5; -// else motor = 0.0; - wait(10); // "nic nierobienie, żeby się nie zawiesił" + wait(10); // zajęcie sterownika, żeby się nie zawiesił- tak było w manualu } } \ No newline at end of file