FRDM_wahadlo_torsyjne

Dependencies:   mbed BufferedSerial

Fork of FRDM_wahadlo_torsyjne by Wojciech M

main.cpp

Committer:
Lukasz_K
Date:
2019-02-27
Revision:
19:2012df6b8e56
Parent:
18:97a08a408bc7

File content as of revision 19:2012df6b8e56:

//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 "BufferedSerial.h"
#include "math.h"

//=========TERMISTOR==================
#define beta 3950      // stała materiałowa termistora [K]
#define T0 298         // temperatura odniesienia (zwykle 298K) [K]
#define R0 10000       // rezystancja termistora w temperaturze odniesienia [Ω]
#define R 16700        // rezystancja opornika w dzielniku [Ω]


Ticker triger1;                                             //interrupt. No. 1
Ticker triger2;                                             //interrupt No. 2

int motor_PWM_period_us = 500;                              //period of PWM signal in mikroseconds
                                                            // 3200 kroków to pełny kąt                
int EXC_angle = 1600/2/4;                                     //360 stopni to 3200 krok. przy mkrok. = 1.8/16 dzielic przez 2
//float switch_dir_time=(float)((float)EXC_angle/500.0)*((float)motor_PWM_period_us/1000.0);  
float switch_dir_time=(float)((float)EXC_angle/500.0)*((float)motor_PWM_period_us/1000.0);  
//float switch_dir_time = 1;
float sampling_time = 0.2;//0.005
int samples_in_period = int(switch_dir_time/sampling_time);
int zero_analog_IN_0 = 0;
int zero_analog_IN_1 = 0;
int zero_analog_IN_2 = 0;
int zero_analog_IN_3 = 0;
int zero_analog_IN_4 = 0;
int zero_analog_IN_5 = 0;
float timet = 0;

//volatile float t;
 
DigitalOut direction(PTC7);                                 // zmiana wartości logicznej na wyjściu PTC7 powoduje zmianę kieruneku obrotów
DigitalOut enable_driver(PTE2);                                // zezwolenie na start
DigitalOut myled(LED_GREEN);                                // dioda zielona sygnalizuje zmianę kierunku obrotów
AnalogIn analog_IN_0(PTB0);  //PTB0                               // odczyt napięcia z wejścia analogowego 0 (kąt obrotu kolumny)
AnalogIn analog_IN_1(PTB1);  //PTB1
AnalogIn analog_IN_2(PTB2);  //PTB2                                                            // PTB1 - sygnał odwrócony
AnalogIn analog_IN_3(PTB3);  //PTB3
AnalogIn analog_IN_4(PTC2);  //PTC2
AnalogIn analog_IN_5(PTC1);  //PTC1                               // odczyt napięcia z wejścia analogowego 1 (kąt obrotu ciała swobodnego)
                                                            // PTB3 - sygnał odwrócony
PwmOut motor(PTA5);                                         // sygnał PWM do sterowania sterownikiem silnika krokowego
//Serial pc(USBTX,USBRX);                                     // komunikacja z PC
BufferedSerial pc(USBTX,USBRX);
char buffer[24];

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
}

float temperatura_K(AnalogIn analog){
    float t=1.65-analog;    //1,65 połowa zakresu VREF
    t= t/analog;
    t= log(t);
    t=t + beta/T0+ 0,23;    //0,23 - log R/R0
    t=beta/t;
    return t;
}
    

void task1() { 
        myled = !myled;
        direction = !direction;
        //pc.printf("%.2f\t%d\n\r", timet, int(direction));
} 

void task2() { 
    //get_voltage_in(analog_IN_0, zero_analog_IN_0);
    //get_voltage_in(analog_IN_1, zero_analog_IN_1);    
    //pc.printf("%.2f\t%.2f\t%.2f\n\r", timet, get_voltage_in(analog_IN_1, zero_analog_IN_1), get_voltage_in(analog_IN_0, zero_analog_IN_0));
    //pc.printf("%.2f %.2f %.2f\n\r", timet, get_voltage_in(analog_IN_1, zero_analog_IN_1), get_voltage_in(analog_IN_0, zero_analog_IN_0));
    
    sprintf((char*)buffer, "%.2f %.2f %.2f %.2f %.2f %.2f\n\r",get_voltage_in(analog_IN_5, zero_analog_IN_5), get_voltage_in(analog_IN_4, zero_analog_IN_4),
    get_voltage_in(analog_IN_3, zero_analog_IN_3), get_voltage_in(analog_IN_2, zero_analog_IN_2),
    get_voltage_in(analog_IN_1, zero_analog_IN_1), get_voltage_in(analog_IN_0, zero_analog_IN_0));    
    pc.printf(buffer);

    //sprintf((char*)buffer, " %.2f %.2f\n\r",temperatura_K(analog_IN_1), get_voltage_in(analog_IN_0, zero_analog_IN_0));    
    //pc.printf(buffer);
    
    //pc.printf("%.2f", t);
    
    timet += sampling_time;
}

int main() {    
    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)
    enable_driver = 1;                                         // enable signal to allow the driver for work
    zero_analog_IN_0 = analog_IN_0.read();
    zero_analog_IN_1 = analog_IN_1.read();    
    //pc.printf("Switch direction time: %.6f\n\r", switch_dir_time);
    //pc.printf("Samples in period: %d\n\r", samples_in_period);
    //pc.printf("Sampling time: %.6f\n\r", sampling_time);
    wait(6);                                                //czas na ustawienia początkowe 10 sek.   
    motor.period_us(motor_PWM_period_us);
    motor = 0.5;                                            // duty cycle of the PWM signal
    timet = 0.0;
    //wait(switch_dir_time/2);                                // położenie zerowe silnika do ustalenia zer czujników
    //wait_ms(1800);
    direction = !direction;                                 // i uruchomienie silnika
    switch_dir_time = 0.9;
    triger2.attach(&task2, sampling_time);
    triger1.attach(&task1, switch_dir_time);  

    while (true) {
        wait(10);                                           // zajęcie sterownika, zabezpieczenie przed zawieszeniem pracy sterownika
    }
}