encslave

Dependencies:   mbed

Committer:
kurobikari
Date:
Sat Dec 07 00:39:45 2019 +0000
Revision:
0:6322c2c7148c
Child:
1:7945cd701d0d
encsleave;

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 //
kurobikari 0:6322c2c7148c 38 // // pc.printf("%d\n\r",deg);
kurobikari 0:6322c2c7148c 39 receive = slave.receive();
kurobikari 0:6322c2c7148c 40 //cntが偶数の場合の処理
kurobikari 0:6322c2c7148c 41 if (cnt % 2 == 0) {
kurobikari 0:6322c2c7148c 42 if (cnt == 0) {
kurobikari 0:6322c2c7148c 43 CS=0;
kurobikari 0:6322c2c7148c 44 data = 0;
kurobikari 0:6322c2c7148c 45 }
kurobikari 0:6322c2c7148c 46 CLK=1;
kurobikari 0:6322c2c7148c 47 }
kurobikari 0:6322c2c7148c 48
kurobikari 0:6322c2c7148c 49 //cntが奇数の場合の処理
kurobikari 0:6322c2c7148c 50 else {
kurobikari 0:6322c2c7148c 51 if (cnt != 1) data |= Do; //cntが1ではない時の処理
kurobikari 0:6322c2c7148c 52 //cntが25ではない時の処理
kurobikari 0:6322c2c7148c 53 if (cnt != 25) {
kurobikari 0:6322c2c7148c 54 data <<= 1;
kurobikari 0:6322c2c7148c 55 CLK=0;
kurobikari 0:6322c2c7148c 56 }
kurobikari 0:6322c2c7148c 57 //cntが25の時の処理
kurobikari 0:6322c2c7148c 58 else {
kurobikari 0:6322c2c7148c 59 /* 前回の値更新
kurobikari 0:6322c2c7148c 60 今回の値更新(エンコーダの値(0?4096)を角度(0?360)に) */
kurobikari 0:6322c2c7148c 61 enc_deg[1] = enc_deg[0];
kurobikari 0:6322c2c7148c 62 enc_deg[0] = data * 360 / 4096;
kurobikari 0:6322c2c7148c 63
kurobikari 0:6322c2c7148c 64 /* 前回270度以上,今回90度より小さい… 359→0を跨いだ時
kurobikari 0:6322c2c7148c 65 前回の値を0から逆回転で負の値で表記 */
kurobikari 0:6322c2c7148c 66 if ((270 <= enc_deg[1] ) && (enc_deg[0] < 90)) enc_deg[1] -= 360;
kurobikari 0:6322c2c7148c 67
kurobikari 0:6322c2c7148c 68 /* 0→359を跨いだ時,
kurobikari 0:6322c2c7148c 69 前回の値を360以上の値で表記 */
kurobikari 0:6322c2c7148c 70 else if ((enc_deg[1] < 90) && (270 <= enc_deg[0])) enc_deg[1] += 360;
kurobikari 0:6322c2c7148c 71
kurobikari 0:6322c2c7148c 72 deg += enc_deg[0] - enc_deg[1];
kurobikari 0:6322c2c7148c 73
kurobikari 0:6322c2c7148c 74 sent_data=deg;
kurobikari 0:6322c2c7148c 75 CS=1;
kurobikari 0:6322c2c7148c 76
kurobikari 0:6322c2c7148c 77 if(sent_data)
kurobikari 0:6322c2c7148c 78 if(receive){
kurobikari 0:6322c2c7148c 79
kurobikari 0:6322c2c7148c 80 msg[0]=sent_data;
kurobikari 0:6322c2c7148c 81 msg[1]=sent_data>>8;
kurobikari 0:6322c2c7148c 82 msg[2]=sent_data>>16;
kurobikari 0:6322c2c7148c 83 msg[3]=sent_data>>24;
kurobikari 0:6322c2c7148c 84 slave.write(msg,4);
kurobikari 0:6322c2c7148c 85 }
kurobikari 0:6322c2c7148c 86
kurobikari 0:6322c2c7148c 87 /* LEDの管理 */
kurobikari 0:6322c2c7148c 88 static int LED_cnt=0;
kurobikari 0:6322c2c7148c 89 static int LED_flag=0;
kurobikari 0:6322c2c7148c 90 static long log[2]={0};
kurobikari 0:6322c2c7148c 91
kurobikari 0:6322c2c7148c 92 /* logデータの更新 */
kurobikari 0:6322c2c7148c 93 log[1]=log[0];
kurobikari 0:6322c2c7148c 94 log[0]=sent_data<<24|sent_data<<16|sent_data<<8|sent_data;
kurobikari 0:6322c2c7148c 95 /* 変化の正負に応じてLED点灯 */
kurobikari 0:6322c2c7148c 96 if((log[0]-log[1])>1)led[0]=1;
kurobikari 0:6322c2c7148c 97 else led[0]=0;
kurobikari 0:6322c2c7148c 98 if(((log[0]-log[1])<0?-1:1)*(log[0]-log[1])<=1) led[1]=1;
kurobikari 0:6322c2c7148c 99 else led[1]=0;
kurobikari 0:6322c2c7148c 100 if((log[1]-log[0])>1) led[2]=1;
kurobikari 0:6322c2c7148c 101 else led[2]=0;
kurobikari 0:6322c2c7148c 102
kurobikari 0:6322c2c7148c 103 LED_cnt++;
kurobikari 0:6322c2c7148c 104 LED_cnt%=10;
kurobikari 0:6322c2c7148c 105 if(LED_cnt==0) LED_flag++;
kurobikari 0:6322c2c7148c 106 LED_flag%=2;
kurobikari 0:6322c2c7148c 107 if(LED_flag) led[3]=1;
kurobikari 0:6322c2c7148c 108 else led[3]=0;
kurobikari 0:6322c2c7148c 109
kurobikari 0:6322c2c7148c 110 }
kurobikari 0:6322c2c7148c 111
kurobikari 0:6322c2c7148c 112 }
kurobikari 0:6322c2c7148c 113 cnt++;
kurobikari 0:6322c2c7148c 114 cnt %= 26;
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 }
kurobikari 0:6322c2c7148c 123
kurobikari 0:6322c2c7148c 124 }