encslave

Dependencies:   mbed

Committer:
kurobikari
Date:
Sat Dec 07 00:42:48 2019 +0000
Revision:
1:7945cd701d0d
Parent:
0:6322c2c7148c
Child:
2:2ee241819861
encslave(real)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kurobikari 0:6322c2c7148c 1 #include "mbed.h"
kurobikari 0:6322c2c7148c 2
kurobikari 0:6322c2c7148c 3 #define SDA PB_7
kurobikari 0:6322c2c7148c 4 #define SCL PB_6
kurobikari 0:6322c2c7148c 5
kurobikari 0:6322c2c7148c 6
kurobikari 0:6322c2c7148c 7 /*クラス宣言*/
kurobikari 0:6322c2c7148c 8 I2CSlave slave(SDA, SCL);
kurobikari 0:6322c2c7148c 9 Serial pc(USBTX, USBRX);
kurobikari 0:6322c2c7148c 10
kurobikari 0:6322c2c7148c 11
kurobikari 0:6322c2c7148c 12 /*In,Out宣言*/
kurobikari 0:6322c2c7148c 13 DigitalOut CS (PA_1);
kurobikari 0:6322c2c7148c 14 DigitalOut CLK (PA_2);
kurobikari 0:6322c2c7148c 15 DigitalIn Do (PB_5);
kurobikari 0:6322c2c7148c 16 DigitalOut led[4]={PA_4,PA_5,PA_6,PA_7};
kurobikari 0:6322c2c7148c 17 DigitalOut k (PB_3);
kurobikari 0:6322c2c7148c 18 /*変数宣言*/
kurobikari 0:6322c2c7148c 19 unsigned long data = 0;
kurobikari 0:6322c2c7148c 20 char msg[5]={0};
kurobikari 0:6322c2c7148c 21 int enc_deg[2]; //角度を保存する変数
kurobikari 0:6322c2c7148c 22 int cnt = 0; //割り込んだ回数を保存する
kurobikari 0:6322c2c7148c 23 long deg = 0; //DOの値を保存
kurobikari 0:6322c2c7148c 24 int64_t sent_data=0;
kurobikari 0:6322c2c7148c 25
kurobikari 0:6322c2c7148c 26
kurobikari 0:6322c2c7148c 27
kurobikari 0:6322c2c7148c 28 int main()
kurobikari 0:6322c2c7148c 29 {
kurobikari 0:6322c2c7148c 30 msg[0]=0;
kurobikari 0:6322c2c7148c 31 msg[1]=0;
kurobikari 0:6322c2c7148c 32 slave.frequency(100000);
kurobikari 0:6322c2c7148c 33 int receive;
kurobikari 0:6322c2c7148c 34 slave.address(1);
kurobikari 0:6322c2c7148c 35 while(1) {
kurobikari 0:6322c2c7148c 36
kurobikari 0:6322c2c7148c 37 receive = slave.receive();
kurobikari 0:6322c2c7148c 38 //cntが偶数の場合の処理
kurobikari 0:6322c2c7148c 39 if (cnt % 2 == 0) {
kurobikari 0:6322c2c7148c 40 if (cnt == 0) {
kurobikari 0:6322c2c7148c 41 CS=0;
kurobikari 0:6322c2c7148c 42 data = 0;
kurobikari 0:6322c2c7148c 43 }
kurobikari 0:6322c2c7148c 44 CLK=1;
kurobikari 0:6322c2c7148c 45 }
kurobikari 0:6322c2c7148c 46
kurobikari 0:6322c2c7148c 47 //cntが奇数の場合の処理
kurobikari 0:6322c2c7148c 48 else {
kurobikari 0:6322c2c7148c 49 if (cnt != 1) data |= Do; //cntが1ではない時の処理
kurobikari 0:6322c2c7148c 50 //cntが25ではない時の処理
kurobikari 0:6322c2c7148c 51 if (cnt != 25) {
kurobikari 0:6322c2c7148c 52 data <<= 1;
kurobikari 0:6322c2c7148c 53 CLK=0;
kurobikari 0:6322c2c7148c 54 }
kurobikari 0:6322c2c7148c 55 //cntが25の時の処理
kurobikari 0:6322c2c7148c 56 else {
kurobikari 0:6322c2c7148c 57 /* 前回の値更新
kurobikari 0:6322c2c7148c 58 今回の値更新(エンコーダの値(0?4096)を角度(0?360)に) */
kurobikari 0:6322c2c7148c 59 enc_deg[1] = enc_deg[0];
kurobikari 0:6322c2c7148c 60 enc_deg[0] = data * 360 / 4096;
kurobikari 0:6322c2c7148c 61
kurobikari 0:6322c2c7148c 62 /* 前回270度以上,今回90度より小さい… 359→0を跨いだ時
kurobikari 0:6322c2c7148c 63 前回の値を0から逆回転で負の値で表記 */
kurobikari 0:6322c2c7148c 64 if ((270 <= enc_deg[1] ) && (enc_deg[0] < 90)) enc_deg[1] -= 360;
kurobikari 0:6322c2c7148c 65
kurobikari 0:6322c2c7148c 66 /* 0→359を跨いだ時,
kurobikari 0:6322c2c7148c 67 前回の値を360以上の値で表記 */
kurobikari 0:6322c2c7148c 68 else if ((enc_deg[1] < 90) && (270 <= enc_deg[0])) enc_deg[1] += 360;
kurobikari 0:6322c2c7148c 69
kurobikari 0:6322c2c7148c 70 deg += enc_deg[0] - enc_deg[1];
kurobikari 0:6322c2c7148c 71
kurobikari 0:6322c2c7148c 72 sent_data=deg;
kurobikari 0:6322c2c7148c 73 CS=1;
kurobikari 0:6322c2c7148c 74
kurobikari 1:7945cd701d0d 75
kurobikari 0:6322c2c7148c 76 if(receive){
kurobikari 0:6322c2c7148c 77
kurobikari 0:6322c2c7148c 78 msg[0]=sent_data;
kurobikari 0:6322c2c7148c 79 msg[1]=sent_data>>8;
kurobikari 0:6322c2c7148c 80 msg[2]=sent_data>>16;
kurobikari 0:6322c2c7148c 81 msg[3]=sent_data>>24;
kurobikari 0:6322c2c7148c 82 slave.write(msg,4);
kurobikari 0:6322c2c7148c 83 }
kurobikari 0:6322c2c7148c 84
kurobikari 0:6322c2c7148c 85 /* LEDの管理 */
kurobikari 0:6322c2c7148c 86 static int LED_cnt=0;
kurobikari 0:6322c2c7148c 87 static int LED_flag=0;
kurobikari 0:6322c2c7148c 88 static long log[2]={0};
kurobikari 0:6322c2c7148c 89
kurobikari 0:6322c2c7148c 90 /* logデータの更新 */
kurobikari 0:6322c2c7148c 91 log[1]=log[0];
kurobikari 0:6322c2c7148c 92 log[0]=sent_data<<24|sent_data<<16|sent_data<<8|sent_data;
kurobikari 0:6322c2c7148c 93 /* 変化の正負に応じてLED点灯 */
kurobikari 0:6322c2c7148c 94 if((log[0]-log[1])>1)led[0]=1;
kurobikari 0:6322c2c7148c 95 else led[0]=0;
kurobikari 0:6322c2c7148c 96 if(((log[0]-log[1])<0?-1:1)*(log[0]-log[1])<=1) led[1]=1;
kurobikari 0:6322c2c7148c 97 else led[1]=0;
kurobikari 0:6322c2c7148c 98 if((log[1]-log[0])>1) led[2]=1;
kurobikari 0:6322c2c7148c 99 else led[2]=0;
kurobikari 0:6322c2c7148c 100
kurobikari 0:6322c2c7148c 101 LED_cnt++;
kurobikari 0:6322c2c7148c 102 LED_cnt%=10;
kurobikari 0:6322c2c7148c 103 if(LED_cnt==0) LED_flag++;
kurobikari 0:6322c2c7148c 104 LED_flag%=2;
kurobikari 0:6322c2c7148c 105 if(LED_flag) led[3]=1;
kurobikari 0:6322c2c7148c 106 else led[3]=0;
kurobikari 0:6322c2c7148c 107
kurobikari 0:6322c2c7148c 108 }
kurobikari 0:6322c2c7148c 109
kurobikari 0:6322c2c7148c 110 }
kurobikari 0:6322c2c7148c 111 cnt++;
kurobikari 0:6322c2c7148c 112 cnt %= 26;
kurobikari 0:6322c2c7148c 113
kurobikari 0:6322c2c7148c 114
kurobikari 0:6322c2c7148c 115
kurobikari 0:6322c2c7148c 116
kurobikari 0:6322c2c7148c 117
kurobikari 0:6322c2c7148c 118
kurobikari 0:6322c2c7148c 119
kurobikari 0:6322c2c7148c 120 }
kurobikari 0:6322c2c7148c 121
kurobikari 0:6322c2c7148c 122 }