FRDM_wahadlo_torsyjne

Dependencies:   mbed BufferedSerial

Fork of FRDM_wahadlo_torsyjne by Wojciech M

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
    }
}