a

Dependencies:   mbed

Committer:
Tom0108
Date:
Fri Oct 11 07:29:15 2019 +0000
Revision:
20:3f68738c4019
Parent:
0:761a63c6d020
Gyro reset measures

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Tom0108 0:761a63c6d020 1 #include "YKNCT_I2C.h"
Tom0108 0:761a63c6d020 2
Tom0108 0:761a63c6d020 3 Y_I2C::Y_I2C(PinName sda, PinName scl) : i2c(sda, scl)
Tom0108 0:761a63c6d020 4 {
Tom0108 0:761a63c6d020 5 i2c.frequency(100000);
Tom0108 0:761a63c6d020 6 }
Tom0108 0:761a63c6d020 7
Tom0108 0:761a63c6d020 8 void Y_I2C::Out_Set(OUT_I2C_Data_TypeDef *OUT_I2C_Data, uint8_t num, uint8_t value)
Tom0108 0:761a63c6d020 9 {
Tom0108 0:761a63c6d020 10 (OUT_I2C_Data+num) -> out_data =value;
Tom0108 0:761a63c6d020 11 }
Tom0108 0:761a63c6d020 12
Tom0108 0:761a63c6d020 13 void Y_I2C::Out(OUT_I2C_Data_TypeDef *OUT_I2C_Data, uint8_t MAX)
Tom0108 0:761a63c6d020 14 {
Tom0108 0:761a63c6d020 15 int cnt=0; //何個出力したかを保存する
Tom0108 0:761a63c6d020 16 int ad_cnt=0; //同じアドレスの数を保存する
Tom0108 0:761a63c6d020 17 while(cnt<MAX) {
Tom0108 0:761a63c6d020 18 char data=0;
Tom0108 0:761a63c6d020 19 int tmp_address=(OUT_I2C_Data+cnt)->DevAddress+59;
Tom0108 0:761a63c6d020 20
Tom0108 0:761a63c6d020 21 //同じアドレスの数を数える
Tom0108 0:761a63c6d020 22 for(ad_cnt=0;; ad_cnt++) {
Tom0108 0:761a63c6d020 23 if(tmp_address!=(OUT_I2C_Data+cnt+ad_cnt)->DevAddress+59)
Tom0108 0:761a63c6d020 24 break;
Tom0108 0:761a63c6d020 25 }
Tom0108 0:761a63c6d020 26 //一枚の基板に出力するデータを格納する
Tom0108 0:761a63c6d020 27 for(int j=0; j<ad_cnt; j++) data|=(OUT_I2C_Data+cnt+j)->out_data<<j;
Tom0108 0:761a63c6d020 28
Tom0108 0:761a63c6d020 29 i2c.write(((OUT_I2C_Data+cnt)->DevAddress+59)<<1, &data, 1);
Tom0108 0:761a63c6d020 30 cnt+=ad_cnt;
Tom0108 0:761a63c6d020 31 }
Tom0108 0:761a63c6d020 32 }
Tom0108 0:761a63c6d020 33
Tom0108 0:761a63c6d020 34 void Y_I2C::Servo_Set(SERVO_I2C_Data_TypeDef *SERVO_I2C_Data, uint8_t num, uint16_t pulse)
Tom0108 0:761a63c6d020 35 {
Tom0108 0:761a63c6d020 36 (SERVO_I2C_Data+num)->pulse=pulse;
Tom0108 0:761a63c6d020 37 }
Tom0108 0:761a63c6d020 38
Tom0108 0:761a63c6d020 39 //4biteづつ送信する
Tom0108 0:761a63c6d020 40 void Y_I2C::Servo(SERVO_I2C_Data_TypeDef *SERVO_I2C_Data, uint8_t MAX)
Tom0108 0:761a63c6d020 41 {
Tom0108 0:761a63c6d020 42 for(int i=0; i<(MAX+1)/2; i++) {
Tom0108 0:761a63c6d020 43 char data[4]= {0};
Tom0108 0:761a63c6d020 44
Tom0108 0:761a63c6d020 45 //MAXが奇数で最後の時
Tom0108 0:761a63c6d020 46 if(i==MAX/2 && MAX%2==1) {
Tom0108 0:761a63c6d020 47 for(int j=0; j<2; j++)
Tom0108 0:761a63c6d020 48 //16bitのpulse1つを8bitづつに分けてdataに保存する
Tom0108 0:761a63c6d020 49 data[j]=(SERVO_I2C_Data+i*2+j/2)->pulse>>(1-j%2)*8;
Tom0108 0:761a63c6d020 50 } else {
Tom0108 0:761a63c6d020 51 for(int j=0; j<4; j++)
Tom0108 0:761a63c6d020 52 //16bitのpulse2つを8bitづつに分けてdataに保存する
Tom0108 0:761a63c6d020 53 data[j]=(SERVO_I2C_Data+i*2+j/2)->pulse>>(1-j%2)*8;
Tom0108 0:761a63c6d020 54 }
Tom0108 0:761a63c6d020 55 i2c.write(((SERVO_I2C_Data+i)->DevAddress+93)<<1, data, 4);
Tom0108 0:761a63c6d020 56 }
Tom0108 0:761a63c6d020 57 }
Tom0108 0:761a63c6d020 58
Tom0108 0:761a63c6d020 59 void Y_I2C::In(IN_I2C_Data_TypeDef *IN_I2C_Data, uint8_t num)
Tom0108 0:761a63c6d020 60 {
Tom0108 0:761a63c6d020 61 char data;
Tom0108 0:761a63c6d020 62 uint8_t array=(IN_I2C_Data+num)->Number;
Tom0108 0:761a63c6d020 63
Tom0108 0:761a63c6d020 64 i2c.read(((IN_I2C_Data+num)->DevAddress+25)<<1, &data, 1);
Tom0108 0:761a63c6d020 65
Tom0108 0:761a63c6d020 66 (IN_I2C_Data+num)->in_data=data&1<<array;
Tom0108 0:761a63c6d020 67 }
Tom0108 0:761a63c6d020 68
Tom0108 0:761a63c6d020 69 void Y_I2C::Adc(ADC_I2C_Data_TypeDef *ADC_I2C_Data, uint8_t num)
Tom0108 0:761a63c6d020 70 {
Tom0108 0:761a63c6d020 71 char data[8]= {0};
Tom0108 0:761a63c6d020 72 uint8_t array=(ADC_I2C_Data+num)->Number;
Tom0108 0:761a63c6d020 73 // adc 42 line 110
Tom0108 0:761a63c6d020 74 i2c.read((((ADC_I2C_Data+num) -> DevAddress)+42)<<1, data, 8);
Tom0108 0:761a63c6d020 75
Tom0108 0:761a63c6d020 76 (ADC_I2C_Data+num)->adc_data=data[array*2+1]<<8|data[array*2];
Tom0108 0:761a63c6d020 77 }
Tom0108 0:761a63c6d020 78
Tom0108 0:761a63c6d020 79 void Y_I2C::Enc(ENC_I2C_Data_TypeDef *ENC_I2C_Data, uint8_t num)
Tom0108 0:761a63c6d020 80 {
Tom0108 0:761a63c6d020 81 char data[4]= {0};
Tom0108 0:761a63c6d020 82
Tom0108 0:761a63c6d020 83 i2c.read(((ENC_I2C_Data+num) -> DevAddress+76)<<1, data, 4);
Tom0108 0:761a63c6d020 84
Tom0108 0:761a63c6d020 85 (ENC_I2C_Data+num)->enc_data=data[3]<<24|data[2]<<16|data[1]<<8|data[0];
Tom0108 0:761a63c6d020 86 }
Tom0108 0:761a63c6d020 87
Tom0108 0:761a63c6d020 88 void Y_I2C::MD_I2C(MD_I2C_Data_TypeDef *MD_I2C_Data, uint8_t num)
Tom0108 0:761a63c6d020 89 {
Tom0108 0:761a63c6d020 90 /* 送信データ
Tom0108 0:761a63c6d020 91 [0] [ MD出力更新 | 0 | 0 | 0 | 0 | ブレーキ | 回転方向 | MD指定 ]
Tom0108 0:761a63c6d020 92 [1] PWM値(7bit)
Tom0108 0:761a63c6d020 93 */
Tom0108 0:761a63c6d020 94
Tom0108 0:761a63c6d020 95 /* 送信データをMD更新フラグを立てて初期化 */
Tom0108 0:761a63c6d020 96 (MD_I2C_Data + num)->pData[0] = 0x80;
Tom0108 0:761a63c6d020 97 /* モーターの駆動状態によってデータセット */
Tom0108 0:761a63c6d020 98 switch (MD_GET_DRIVE(MD_I2C_Data, num)) {
Tom0108 0:761a63c6d020 99 /* ブレーキ,ブレーキビット 1,回転方向ビット 0 */
Tom0108 0:761a63c6d020 100 /* 0b00000100 */
Tom0108 0:761a63c6d020 101 case MD_BRAKE:
Tom0108 0:761a63c6d020 102 (MD_I2C_Data + num)->pData[0] |= 0x02 << 1;
Tom0108 0:761a63c6d020 103 break;
Tom0108 0:761a63c6d020 104 /* 正転,ブレーキビット 0,回転方向ビット 1 */
Tom0108 0:761a63c6d020 105 /* 0b00000001 */
Tom0108 0:761a63c6d020 106 case MD_FORWARD:
Tom0108 0:761a63c6d020 107 (MD_I2C_Data + num)->pData[0] |= 0x01 << 1;
Tom0108 0:761a63c6d020 108 break;
Tom0108 0:761a63c6d020 109 /* 逆転,ブレーキビット 0,回転方向ビット 0 */
Tom0108 0:761a63c6d020 110 /* 0b00000000 */
Tom0108 0:761a63c6d020 111 case MD_REVERSE:
Tom0108 0:761a63c6d020 112 (MD_I2C_Data + num)->pData[0] |= 0x00 << 1;
Tom0108 0:761a63c6d020 113 break;
Tom0108 0:761a63c6d020 114 }
Tom0108 0:761a63c6d020 115
Tom0108 0:761a63c6d020 116 /* PIC上の出力番号を指定 */
Tom0108 0:761a63c6d020 117 /* 0b00000000 or 0b00000001 */
Tom0108 0:761a63c6d020 118 (MD_I2C_Data + num)->pData[0] |= (MD_I2C_Data + num)->Number;
Tom0108 0:761a63c6d020 119 /* PWM値が100より大きかったら範囲内に補正 */
Tom0108 0:761a63c6d020 120 if (MD_GET_PWM(MD_I2C_Data, num) > 99)
Tom0108 0:761a63c6d020 121 MD_SET_PWM(MD_I2C_Data, num, 99);
Tom0108 0:761a63c6d020 122
Tom0108 0:761a63c6d020 123 /* PWM(0~100)を0~127に変換して代入(オーバーフロー防止で16bitに一時変換) */
Tom0108 0:761a63c6d020 124 (MD_I2C_Data + num)->pData[1] = (uint8_t)((uint16_t)MD_GET_PWM(MD_I2C_Data, num) * 127 / 100);
Tom0108 0:761a63c6d020 125
Tom0108 0:761a63c6d020 126 /*8bitから7bitに変換*/
Tom0108 0:761a63c6d020 127 i2c.write((MD_I2C_Data + num)->DevAddress << 1,(MD_I2C_Data + num)->pData,2);
Tom0108 0:761a63c6d020 128 }
Tom0108 0:761a63c6d020 129
Tom0108 0:761a63c6d020 130 /**
Tom0108 0:761a63c6d020 131 * @brief MDに通信確認用送信
Tom0108 0:761a63c6d020 132 * @param MD_I2C_Data: I2C式MDデータ構造
Tom0108 0:761a63c6d020 133 * @param num: 使用MD番号
Tom0108 0:761a63c6d020 134 * @retval なし
Tom0108 0:761a63c6d020 135 * @detail I2C式MD側が通信が切れていないことを確認するために空データを送信する
Tom0108 0:761a63c6d020 136 */
Tom0108 0:761a63c6d020 137 void Y_I2C::MD_I2C_Empty(MD_I2C_Data_TypeDef *MD_I2C_Data, uint8_t num)
Tom0108 0:761a63c6d020 138 {
Tom0108 0:761a63c6d020 139 /* 送信データをMD更新フラグを立てず初期化 */
Tom0108 0:761a63c6d020 140 (MD_I2C_Data+num)->pData[0] = 0;
Tom0108 0:761a63c6d020 141
Tom0108 0:761a63c6d020 142 /* PIC上の出力番号を指定 */
Tom0108 0:761a63c6d020 143 /* 0b00000000 or 0b00000001 */
Tom0108 0:761a63c6d020 144 (MD_I2C_Data+num)->pData[0] |= (MD_I2C_Data+num)->Number;
Tom0108 0:761a63c6d020 145
Tom0108 0:761a63c6d020 146 /*8bitから7bitに変換*/
Tom0108 0:761a63c6d020 147 i2c.write((MD_I2C_Data + num)->DevAddress << 1,(MD_I2C_Data + num)->pData,2);
Tom0108 0:761a63c6d020 148 }