test

EC.h

Committer:
MazeTaka
Date:
2019-07-04
Revision:
2:670bd19af5e1
Parent:
0:eb20667a5a27
Child:
3:c04b12937bae

File content as of revision 2:670bd19af5e1:

#ifndef _INCLUDED_EC_H_
#define _INCLUDED_EC_H_

#ifndef M_PI
#define M_PI 3.14159265359f
#endif
/**
    increment型エンコーダ用class
    1逓倍:Ec1multi
    2逓倍:Ec2multi
    4逓倍:Ec4multi
**/
class Ec
{
protected:
    int count_; //カウント数
    double omega_;  //角速度(rad/s)
    int pre_count_;  //一つ前のカウント
    int resolution_;   //分解能
    int multiplication_;
    double ptw_;

public:
    /**コンストラクタの定義
    1,2,4逓倍の元となるclass

    @param res エンコーダの分解能
    @param multi エンコーダの逓倍

    @remarks このclassは各逓倍のclassに継承されるため、使用者が宣言する必要はない
    */
    Ec(int res,int multi);
    /**
        エンコーダのcountを返す関数
        1周でcount=分解能×逓倍
        @return count
    */
    int getCount();
    /**
        軸の角速度を返す関数
        @return ω(rad/s)
    */
    double getOmega();
    /**
        角速度を計算するための関数
        微分を微小時間の変位として計算しているので、タイマー割込などで回さなければいけない
    */
    void calOmega();
    /**
        分解能を指定するための関数
        @param res エンコーダの分解能
    */
    void setResolution(int res);
    void reset();///エンコーダのcountやωをリセットするための関数
    Timer timer_;
};
class Ec1multi : public Ec
{
private:
    InterruptIn signalA_;
    DigitalIn signalB_;
    void upA();
public:
    /**コンストラクタの定義
    main関数の前に必ず一度宣言する
    使うエンコーダの数だけ設定する必要がある

    @param signalA エンコーダのA相のピン名
    @param signalB エンコーダのB相のピン名
    @param res エンコーダの分解能
    */
    Ec1multi(PinName signalA,PinName signalB,int res);
};
class Ec2multi : public Ec
{
private:
    InterruptIn signalA_;
    DigitalIn signalB_;
    void upA();
    void downA();
public:
    /**コンストラクタの定義
    main関数の前に必ず一度宣言する
    使うエンコーダの数だけ設定する必要がある

    @param signalA エンコーダのA相のピン名
    @param signalB エンコーダのB相のピン名
    @param res エンコーダの分解能
    */
    Ec2multi(PinName signalA,PinName signalB,int res);
};
class Ec4multi : public Ec
{
private:
    InterruptIn signalA_;
    InterruptIn signalB_;
    void upA();
    void downA();
    void upB();
    void downB();
    int pa_,pb_;
public:
    /**コンストラクタの定義
    main関数の前に必ず一度宣言する
    使うエンコーダの数だけ設定する必要がある

    @param signalA エンコーダのA相のピン名
    @param signalB エンコーダのB相のピン名
    @param res エンコーダの分解能
    */
    Ec4multi(PinName signalA,PinName signalB,int res);
};
/**@section SAMPLE
@code
//プログラム例
#include "mbed.h"
#include "EC.h"

#define RESOLUTION 500
Ticker ticker;
Serial pc(USBTX,USBRX);

//(A層,B層,分解能)
Ec1multi EC(p7,p8,RESOLUTION);  //1逓倍用class
//or
//Ec2multi EC(p7,p8,RESOLUTION);  //2逓倍用class
//or
//Ec4multi EC(p7,p8,RESOLUTION);  //4逓倍用class
void calOmega();

int main()
{
    int count=0;
    double omega;
    ticker.attach(&calOmega,0.05);

    while(1) {
        count=EC.getCount();
        omega=EC.getOmega();
        pc.printf("count=%d,",count);
        pc.printf("omega=%f\r\n",omega);
    }
}
void calOmega()
{
    EC.calOmega();
}
@endcode
*/


#endif