YKNCT / YKNCT_I2C_lib

Dependents:   arim_AutoMachine

Revision:
2:f5faf991cd86
Parent:
1:67d5ea2ff6c1
Child:
3:397a179b4d9e
--- a/YKNCT_I2C.cpp	Tue Apr 02 09:50:29 2019 +0000
+++ b/YKNCT_I2C.cpp	Tue Apr 02 10:33:33 2019 +0000
@@ -29,12 +29,68 @@
     for(int i=0; i<4; i++)
         ad_data[i]=(int16_t)data[i*2+1]<<8|data[i*2];
 
+    wait_us(1000);
     return ad_data[num];
 }
 
+void Y_I2C::MD_I2C(MD_I2C_Data_TypeDef *MD_I2C_Data, uint8_t number)
+{
+    /* 送信データ
+      [0] [ MD出力更新 | 0 | 0 | 0 | 0 | ブレーキ | 回転方向 | MD指定 ]
+      [1] PWM値(7bit)
+    */
 
-
+    /* 送信データをMD更新フラグを立てて初期化 */
+    (MD_I2C_Data + number)->pData[0] = 0x80;
+    /* モーターの駆動状態によってデータセット */
+    switch (MD_GET_DRIVE(MD_I2C_Data, number)) {
+        /* ブレーキ,ブレーキビット 1,回転方向ビット 0 */
+        /* 0b00000100 */
+        case MD_BRAKE:
+            (MD_I2C_Data + number)->pData[0] |= 0x02 << 1;
+            break;
+        /* 正転,ブレーキビット 0,回転方向ビット 1 */
+        /* 0b00000001 */
+        case MD_FORWARD:
+            (MD_I2C_Data + number)->pData[0] |= 0x01 << 1;
+            break;
+        /* 逆転,ブレーキビット 0,回転方向ビット 0 */
+        /* 0b00000000 */
+        case MD_REVERSE:
+            (MD_I2C_Data + number)->pData[0] |= 0x00 << 1;
+            break;
+    }
 
+    /* PIC上の出力番号を指定 */
+    /* 0b00000000 or 0b00000001 */
+    (MD_I2C_Data + number)->pData[0] |= (MD_I2C_Data + number)->Number;
+    /* PWM値が100より大きかったら範囲内に補正 */
+    if (MD_GET_PWM(MD_I2C_Data, number) > 99)
+        MD_SET_PWM(MD_I2C_Data, number, 99);
 
+    /* PWM(0~100)を0~127に変換して代入(オーバーフロー防止で16bitに一時変換) */
+    (MD_I2C_Data + number)->pData[1] = (uint8_t)((uint16_t)MD_GET_PWM(MD_I2C_Data, number) * 127 / 100);
+
+    /*8bitから7bitに変換*/
+    i2c.write((MD_I2C_Data + number)->DevAddress << 1,(MD_I2C_Data + number)->pData,2);
+}
 
+/**
+  * @brief  MDに通信確認用送信
+  * @param  MD_I2C_Data: I2C式MDデータ構造
+  * @param  number: 使用MD番号
+  * @retval なし
+  * @detail I2C式MD側が通信が切れていないことを確認するために空データを送信する
+  */
+void Y_I2C::MD_I2C_Empty(MD_I2C_Data_TypeDef *MD_I2C_Data, uint8_t number)
+{
+    /* 送信データをMD更新フラグを立てず初期化 */
+    (MD_I2C_Data+number)->pData[0] = 0;
 
+    /* PIC上の出力番号を指定 */
+    /* 0b00000000 or 0b00000001 */
+    (MD_I2C_Data+number)->pData[0] |= (MD_I2C_Data+number)->Number;
+
+    /*8bitから7bitに変換*/
+    i2c.write((MD_I2C_Data + number)->DevAddress << 1,(MD_I2C_Data + number)->pData,2);
+}
\ No newline at end of file