way

Dependencies:   mbed CANMsg

main.cpp

Committer:
kurobikari
Date:
2021-09-08
Revision:
1:85bc939a3d22
Parent:
0:f3625799a474

File content as of revision 1:85bc939a3d22:

#define LAP                     1
#define SMB                     0
#define EncoderMAX              2

#include "mbed.h"
#include "CANMsg.h"

/*************クラス宣言*************/

/* CANのピン設定  (RD,TD,周波数) */
CAN   can(PA_11, PA_12,500000);// CAN Rx pin name, CAN Tx pin name
/* CAN受信クラス宣言 */
CANMsg  rxMsg;
/* CAN送信クラス宣言 */
CANMsg  txMsg;
/* MDCのOnボードled */
DigitalOut   led[2]= {PA_8,PA_9};
/* 割り込み用クラス */
Ticker flipper;
/* 割り込み用クラス */
Ticker interrupt;
/* I2C障害時間カウント */
Timer LostSignal;

/*************関数宣言*************/

/* タイマ呼び出し用 */
void IT_CallBack(void);
/* 送信用割り込み関数 */
void sent(void);
/* MDの状態決める関数 */
void Md_Status(void);
/* CAN受信割り込み */
void onCanReceived(void);

/*************ピン宣言*************/

/* エンコーダピン設定 */
DigitalOut CS(PA_3);
DigitalOut CL(PA_4);
DigitalIn  DO[] = {PA_5,PB_0};
/* MD側出力ピン設定 */
PwmOut PWM[2] = {PA_7,PA_6};
/* いねーぶるピン設定 */
DigitalOut Enable[2] = {PA_0,PB_4};
/* INのようなOUTピン設定 */
DigitalOut IN[4]     = {PA_1,PA_2,PB_3,PA_15};
/* アドレスピン設定 */
DigitalIn  add[3]    = {PB_7,PB_6,PB_5};


/*************変数宣言*************/

/* MDデータ保存用構造体 */
struct m_d {
    bool mode;
    bool enable;
    int pwm;
    int code;
};
/* 受信データ一時保存/保存 */
char ReadData = 0;
/* mdデータ保存 */
char MdData = 0;
/* モータの状態一時保存/保存 */
struct m_d mdc[2]= {0};
/* エンコーダ */
static int data[EncoderMAX] = {0};
int sendData[2]={0};
/*  エンコーダのデータ入力  */
int32_t  enc_data[2]= {0};
/* 直読みエンコーダ角度保存(degree) */
double EncoderDeg[EncoderMAX] = {0};
/* アドレス初期化 */
int  RX_ID = 50;
int  TX_ID = 0;

int main(void)
{
    /* アドレス代入 */
    TX_ID += !add[2]<<2|!add[1]<<1|!add[0];
    RX_ID += !add[2]<<2|!add[1]<<1|!add[0];

    /* can受信割り込み */
    can.attach(onCanReceived);

    /* pwm周期 */
    PWM[0].period_us(50);
    PWM[1].period_us(50);

    /* 通信キレ感知ダイマースタート */
    LostSignal.reset();
    LostSignal.start();

    /* エンコーダタイマ割り込み */
    flipper.attach_us(&IT_CallBack, 100);
    /* 送信用タイマ割り込み */
    interrupt.attach_us(&sent, 2600);

    while(1) {

        for(int i=0; i<2; i++) {
            /* SMBの時 */
            if(mdc[i].mode==0) {
                PWM[i] = mdc[i].pwm /100.0;

                if(mdc[i].code==1) {
                    MdData |= (1<<!i*3+1);
                    MdData &= ~(1<<!i*3+2);
                } else {
                    MdData |= (1<<!i*3+2);
                    MdData &= ~(1<<!i*3+1);
                }
            }
            /* LAPの時 */
            else {
               // if(mdc[i].pwm==0)mdc[i].pwm=5;
                PWM[i] = (mdc[i].pwm*mdc[i].code+100) /200.0;
                if(PWM[i]==0)PWM[i]=5;
                MdData |= 0b111<<!i*3;
            }
        }

        /* MDの状態を決める */
        Md_Status();

        /* 信号ロスト1000msで停止 */
        if (LostSignal.read_ms() > 1000) {
            Enable[0] = 0;
            Enable[1] = 0;
            led[0]=0;
        } else  led[0]=1;
    }
}

/*************受信割り込み関数************/
void onCanReceived(void)
{
    can.read(rxMsg);

    if (rxMsg.id == RX_ID) {

        /* LAP or SMB を決めるデータ */
        ReadData = rxMsg.data[0];
        /* LAP or SMB 保存 */
        mdc[0].mode = ReadData&1;
        mdc[1].mode = (ReadData>>1)&1;
        /* PWM1 */
        mdc[0].code = (rxMsg.data[1]&(1<<7)) != 0 ? -1 : 1;//負のビット検知
        mdc[0].pwm  = rxMsg.data[1]&~(1<<7);
        /* PWM2 */
        mdc[1].code = (rxMsg.data[2]&(1<<7)) != 0 ? -1 : 1;//負のビット検知
        mdc[1].pwm  = rxMsg.data[2]&~(1<<7);
        /* 信号ロストタイマリセット */
        LostSignal.reset();
        LostSignal.start();
    }
}

/*************エンコーダ取得タイマ割り込み************/
void IT_CallBack(void)
{
    static int cnt = 0;

    switch(cnt) {
        /* 最初の処理 */
        case 0:
            data[0] = 0;
            data[1] = 0;
            CS = 0;
            CL = 1;
            break;
        /* 最後の処理 */
        case 25:
            CS=1;
            sendData[0]=data[0];
            sendData[1]=data[1];
        /* 通常の処理 */
        default:
            CL=!CL;
            /* 最初でも最後でもなく奇数回で最初以外の時読み取り処理 */
            if(cnt != 1 && cnt % 2) {
                data[0] |= (DO[0]==1);
                data[1] |= (DO[1]==1);

                data[0] = data[0] << 1;
                data[1] = data[1] << 1;
            }
            break;
    }
    cnt++;
    cnt%=26;
}

/*************MDのステータスを決める君***********/
void  Md_Status(void)
{
    /* PWMが0でないまたはSMBでないとき */
    if(mdc[0].pwm!=0||mdc[0].mode) {
        IN[3] = (MdData&(1<<5)) !=0 ? 1 : 0;//1-2
        IN[2] = (MdData&(1<<4)) !=0 ? 1 : 0;//1-1
    } else  {
        IN[3] =  0;//1-2
        IN[2] =  0;//1-1
    }
    /* PWMが0でないまたはSMBでないとき */
    if(mdc[1].pwm!=0||mdc[1].mode) {
        IN[1] = (MdData&(1<<2)) !=0 ? 1 : 0;//2-2
        IN[0] = (MdData&(1<<1)) !=0 ? 1 : 0;//2-1
    } else  {
        IN[1] =  0;//2-2
        IN[0] =  0;//2-1
    }

    Enable[0] = 1;
    Enable[1] = 1;
}

/*************メインマイコンにデータ送信用関数************/
void sent(void)
{
    txMsg.len=3;
    txMsg.id = TX_ID;
    static int cnt =0;
    cnt++;
    cnt%=1000;
    //uint8_t Enc_Data[2];

    for(int i=0; i<3; i++)
        txMsg.data[i]=((sendData[0]<<12|sendData[1])>>i*8)&0xFF;

    can.write(txMsg);
}