#ifndef MOTOR_CTRL_H
#define MOTOR_CTRL_H

/*!
  \file
  \brief モータ制御

  モータの回転制御を行う(SH7045F依存)

  \author Satofumi KAMIMURA

  $Id: motorCtrl.h 286 2008-10-20 09:40:22Z satofumi $
*/

#include "robotParams.h"


/*!
  \brief モータ制御用の構造体

  モータ制御に必要なパラメータを管理
*/
typedef struct {
  unsigned char id;		/*!< 使用するモータのデバイスID */
  int gain_p;			/*!< P制御のゲイン [1] */
  int gain_i;			/*!< I制御のゲイン [1/1024] */
  int i_value;			/*!< Iの積分値 */
  int r_per_v;	      /*!< (巻き線抵抗 / モータ電圧) * 桁揃えの定数 */
  int ke_per_v;	    /*!< (逆起電力定数 / モータ電圧) * 桁揃えの定数 */
} motorInfo_t;


/*!
  \brief モータの制御モード

  モータの制御モードを示す
*/
enum MotorMode {
  MTR_MODE_FREE,		/*!< サーボフリー */
  MTR_MODE_CW_BREAK = +1,	/*!< CW と Break による制御 */
  MTR_MODE_CCW_BREAK = -1,	/*!< CCW と Break による制御 */
};


/*!
  \brief モータ仕様

  Maxon のカタログより
  (222049)
*/
#ifndef MTR_POWER
#define MTR_POWER 12.0		/*!< 公称電圧 [V] */
#endif
#ifndef MTR_OHM
#define MTR_OHM 3.9		/*!< 端子間抵抗 [ohm] */
#endif
#ifndef MTR_RPM_PER_V
#define MTR_RPM_PER_V 675	/*!< 回転数定数 [rpm/V] */
#endif
#ifndef MTR_MAX_mA
#define MTR_MAX_mA 836		/*!< 最大連続電流 [mA] */
#endif

#ifndef MTR_TORQUE_CONST
#define MTR_TORQUE_CONST 14.1	/*!< トルク定数 [mNm/A] */
#endif

/*
  制御パラメータ
*/
#ifndef MTR_GAIN_P
#define MTR_GAIN_P 40		/*!< モータ制御の P ゲイン(重みは 1/1024) */
#endif
#ifndef MTR_GAIN_I
#define MTR_GAIN_I 4		/*!< モータ制御の I ゲイン(重みは 1/1024) */
#endif

/*!
  \brief モータ制御の固定小数点演算用パラメータ

  出力すべき PWM 比を固定小数点数にて計算するときに用いるパラメータ。
*/
#ifndef MTR_I_BIT_WIDTH
#define MTR_I_BIT_WIDTH 11	/*!< 電流の最大値を示すビット位置 */
#endif
#ifndef I_VALUE_MAX
#define I_VALUE_MAX 850		/*!< I項の値の最大値 */
#endif


extern void set_mode(const unsigned char id, const int mode);
extern void set_pwm(const unsigned char id, const int duty);

extern void initMotor(void);
extern void initMotorInfo(const unsigned char id, motorInfo_t *mtr);
extern void setMotorFree(motorInfo_t *mtr);
extern int setMotorRevolution(const int ref_cnt, const int cnt_diff,
			      motorInfo_t *mtr);

#endif /* !MOTOR_CTRL_H */
