ARCS6 AR6-REV.24062600
読み取り中…
検索中…
一致する文字列を見つけられません
USV-PCIE7.hh
1
9//
10// Copyright (C) 2011-2021 Juan Padron and Yokokura, Yuki
11// This program is free software;
12// you can redistribute it and/or modify it under the terms of the BSD License.
13// For details, see the License.txt file.
14
15#ifndef USVPCIE7
16#define USVPCIE7
17
18#include <sys/mman.h>
19#include <unistd.h>
20#include <fcntl.h>
21#include <cstdint>
22#include <cmath>
23#include <array>
24
25// ARCS組込み用マクロ
26#ifdef ARCS_IN
27 // ARCSに組み込まれる場合
28 #include "ARCSassert.hh"
29 #include "ARCSeventlog.hh"
30#else
31 // ARCSに組み込まれない場合
32 #define arcs_assert(a) (assert(a))
33 #define PassedLog()
34 #define EventLog(a)
35 #define EventLogVar(a)
36#endif
37
38namespace ARCS {
42template <size_t N>
44 public:
50
53 USV_PCIE7(const unsigned long Addr)
54 : ADDR_BASE(Addr), fd(0), Memptr(nullptr)
55 {
56 PassedLog();
57 fd = open("/dev/mem", O_RDWR|O_SYNC); // メモリ空間へのfile descriptor取得
58 arcs_assert(fd != -1); // エラーがないか確認
59 Memptr = (uint32_t*)mmap(nullptr, MEMMAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, ADDR_BASE); //メモリ空間へのメモリーマップポインターを取得
60 close(fd);
61 arcs_assert(Memptr != MAP_FAILED); //ちゃんとポインタ取得できたか確認
62 }
63
67 : ADDR_BASE(right.ADDR_BASE), fd(0), Memptr(right.Memptr)
68 {
69 right.Memptr = nullptr; // ムーブ元はヌルポにしておく
70 }
71
74 PassedLog();
75 SetZeroCurrent(); // 念のためのゼロ電流指令
76 munmap(Memptr, MEMMAP_SIZE);// メモリマッピング解除
77 }
78
82 void SetCurrent(const double Current, const size_t Axis){
83 arcs_assert(1 <= Axis && Axis <= 7); // 軸の範囲チェック
84 UintAndFloat CurrentUnion; // float→uint32_t変換用共用体
85 CurrentUnion.FloatValue = -(float)Current; // 倍精度から単精度へキャストしてfloatとして共用体に格納,符号をエンコーダに合わせる
86 Memptr[Axis - 1] = CurrentUnion.BinaryExpr; // uint32_tとして共用体から読み出して,q軸電流指令に対応したメモリに書き込み
87 }
88
91 void SetCurrent(const std::array<double, N>& Current){
92 for(size_t i = 1; i <= N; ++i) SetCurrent(Current[i - 1], i);
93 }
94
96 void SetZeroCurrent(void){
97 for(size_t i = 1; i <= N; ++i) SetCurrent(0, i);
98 }
99
103 double GetCurrent(const size_t Axis){
104 arcs_assert(1 <= Axis && Axis <= 7); // 軸の範囲チェック
105 UintAndFloat CurrentUnion; // uint32_t→float変換用共用体
106 CurrentUnion.BinaryExpr = Memptr[IDX_RDBASE + IDX_PER_AXIS*(Axis - 1) + IDX_GNRL]; // q軸電流に対応したメモリから読み込んで,uint32_tとして共用体に格納
107 return (double)CurrentUnion.FloatValue; // [A] 単精度から倍精度へキャストして返す
108 }
109
112 void GetCurrent(std::array<double, N>& Current){
113 for(size_t i = 1; i <= N; ++i) Current[i - 1] = GetCurrent(i);
114 }
115
119 double GetVelocity(const size_t Axis){
120 arcs_assert(1 <= Axis && Axis <= 7); // 軸の範囲チェック
121 UintAndFloat VelocityUnion; // uint32_t→float変換用共用体
122 VelocityUnion.BinaryExpr = Memptr[IDX_RDBASE + IDX_PER_AXIS*(Axis - 1) + IDX_GNRL]; // 速度に対応したメモリから読み込んで,uint32_tとして共用体に格納
123 return ((double)VelocityUnion.FloatValue)*RPM_TO_RAD; // [rad/s] 単精度から倍精度へキャストしてRPM→rad/s換算して返す
124 }
125
128 void GetVelocity(std::array<double, N>& Velocity){
129 for(size_t i = 1; i <= N; ++i) Velocity[i - 1] = GetVelocity(i);
130 }
131
135 double GetPosition(const size_t Axis){
136 arcs_assert(1 <= Axis && Axis <= 7); // 軸の範囲チェック
137 return ((double)(ENC_MASK & Memptr[IDX_RDBASE + IDX_PER_AXIS*(Axis - 1) + IDX_POSL]))*PULSE_TO_RAD; // 位置に対応したメモリから読み込んで,マスクかけてpulse→rad換算して返す
138 }
139
142 void GetPosition(std::array<double, N>& Position){
143 for(size_t i = 1; i <= N; ++i) Position[i - 1] = GetPosition(i);
144 }
145
149 int32_t GetNumOfRotation(const size_t Axis){
150 arcs_assert(1 <= Axis && Axis <= 7); // 軸の範囲チェック
151 UintAndInt NumOfRotUnion; // uint32_t→int32_t変換用共用体
152 NumOfRotUnion.UnsignedExpr = Memptr[IDX_RDBASE + IDX_PER_AXIS*(Axis - 1) + IDX_POSH]; // 回転の数に対応したメモリから読み込む
153 return NumOfRotUnion.SignedExpr; // 符号付きで返す
154 }
155
159 double GetFullPosition(const size_t Axis){
160 arcs_assert(1 <= Axis && Axis <= 7); // 軸の範囲チェック
161 return (double)GetNumOfRotation(Axis)*2.0*M_PI + GetPosition(Axis); // 「回転の数の分のrad」と「0~2π」を足して返す
162 }
163
166 void GetFullPosition(std::array<double, N>& Position){
167 for(size_t i = 1; i <= N; ++i) Position[i - 1] = GetFullPosition(i);
168 }
169
173 double GetTorque(const size_t Axis){
174 arcs_assert(1 <= Axis && Axis <= 7); // 軸の範囲チェック
175 UintAndFloat TorqueUnion; // uint32_t→float変換用共用体
176 TorqueUnion.BinaryExpr = Memptr[IDX_RDBASE + IDX_PER_AXIS*(Axis - 1) + IDX_TRQ]; // トルクに対応したメモリから読み込んで,uint32_tとして共用体に格納
177 return ((double)TorqueUnion.FloatValue); // [Nm] 単精度から倍精度へキャストして返す
178 }
179
182 void GetTorque(std::array<double, N>& Torque){
183 for(size_t i = 1; i <= N; ++i) Torque[i - 1] = GetTorque(i);
184 }
185
189 uint32_t GetCounter(const size_t Axis){
190 arcs_assert(1 <= Axis && Axis <= 7); // 軸の範囲チェック
191 return Memptr[IDX_CNTBASE + Axis - 1]; // ユニネットデータ同期用カウント値を読み出して返す
192 }
193
195 void TurnServosOn(void){
196 // 書き込み値は無視され,書き込むとコマンドが全軸に同時に単純に発行される。
197 Memptr[IDX_SERVO_ON] = 0x01;
198 sleep(2); // サーボON状態が落ち着くまで2秒待機
199 }
200
202 void TurnServosOff(void){
203 // 書き込み値は無視され,書き込むとコマンドが全軸に同時に単純に発行される。
204 Memptr[IDX_SERVO_OFF] = 0x01;
205 }
206
209 // 書き込み値は無視され,書き込むとコマンドが全軸に同時に単純に発行される。
210 switch(Ctrl){
212 Memptr[IDX_ACCCTRL] = 0x01; // 加速度制御モード
213 break;
215 Memptr[IDX_CURCTRL] = 0x01; // 電流制御モード
216 break;
217 default:
218 break;
219 }
220 }
221
224 // 書き込み値は無視され,書き込むとコマンドが全軸に同時に単純に発行される。
225 Memptr[IDX_ERRCLR] = 0x01;
226 }
227
230 // 書き込み値は無視され,書き込むとコマンドが全軸に同時に単純に発行される。
231 Memptr[IDX_ZEROCAL] = 0x01;
232 }
233
234 private:
235 USV_PCIE7(const USV_PCIE7&) = delete;
236 const USV_PCIE7& operator=(const USV_PCIE7&) = delete;
237 static constexpr unsigned int MEMMAP_SIZE = 0x120;
238 static constexpr size_t IDX_RDBASE = 32;
239 static constexpr size_t IDX_PER_AXIS = 4;
240 static constexpr size_t IDX_POSH = 0;
241 static constexpr size_t IDX_POSL = 1;
242 static constexpr size_t IDX_TRQ = 2;
243 static constexpr size_t IDX_GNRL = 3;
244 static constexpr size_t IDX_CNTBASE = 60;
245 static constexpr size_t IDX_SERVO_ON = 20;
246 static constexpr size_t IDX_SERVO_OFF = 21;
247 static constexpr size_t IDX_ACCCTRL = 22;
248 static constexpr size_t IDX_CURCTRL = 23;
249 static constexpr size_t IDX_ERRCLR = 24;
250 static constexpr size_t IDX_ZEROCAL = 25;
251 static constexpr double RPM_TO_RAD = 2.0*M_PI/60.0;
252 static constexpr double PULSE_TO_RAD = 2.0*M_PI/1048576.0;
253 static constexpr uint32_t ENC_MASK = 0x000FFFFF;
254 const unsigned long ADDR_BASE;
255 int fd;
256 uint32_t* Memptr;
257
259 union UintAndFloat {
260 uint32_t BinaryExpr;
261 float FloatValue;
262 };
263
265 union UintAndInt {
266 uint32_t UnsignedExpr;
267 int32_t SignedExpr;
268 };
269
270};
271}
272
273#endif
ARCS イベントログクラス
#define PassedLog()
イベントログ用マクロ(ファイルと行番号のみ記録版)
Definition ARCSeventlog.hh:26
ARCS用ASSERTクラス
#define arcs_assert(a)
ARCS用assertマクロ a : assert条件
Definition ARCSassert.hh:17
USV_PCIE7インターフェースクラス ユニパルスUSV_PCIE7コントローラのための入出力機能を提供します。
Definition USV-PCIE7.hh:43
~USV_PCIE7()
デストラクタ
Definition USV-PCIE7.hh:73
void SetCurrent(const double Current, const size_t Axis)
指定した軸にq軸電流指令を設定する関数
Definition USV-PCIE7.hh:82
ControlMode
制御モードの定義
Definition USV-PCIE7.hh:46
@ CURRENT_CTRL
電流制御モード
Definition USV-PCIE7.hh:48
@ ACCELERATION_CTRL
加速度制御モード
Definition USV-PCIE7.hh:47
void TurnServosOn(void)
全軸サーボONにする関数
Definition USV-PCIE7.hh:195
void TurnServosOff(void)
全軸サーボOFFにする関数
Definition USV-PCIE7.hh:202
void GetTorque(std::array< double, N > &Torque)
全軸のトルクを取得する関数(配列版)
Definition USV-PCIE7.hh:182
void GetVelocity(std::array< double, N > &Velocity)
全軸の速度を取得する関数(配列版) (アナログ出力設定"AOMD 1 0 1.0"に設定のこと)
Definition USV-PCIE7.hh:128
int32_t GetNumOfRotation(const size_t Axis)
指定した軸の回転の数を取得する関数
Definition USV-PCIE7.hh:149
uint32_t GetCounter(const size_t Axis)
指定した軸の同期カウンタデータを取得する関数
Definition USV-PCIE7.hh:189
double GetCurrent(const size_t Axis)
指定した軸のq軸電流を取得する関数(アナログ出力設定"AOMD 4 0 1.0"に設定のこと)
Definition USV-PCIE7.hh:103
double GetFullPosition(const size_t Axis)
指定した軸の位置を取得する関数(値域±∞版)
Definition USV-PCIE7.hh:159
void ClearErrorStatus(void)
エラー状態をクリアする関数
Definition USV-PCIE7.hh:223
void SetCurrent(const std::array< double, N > &Current)
指定した軸にq軸電流指令を設定する関数(配列版)
Definition USV-PCIE7.hh:91
void GetPosition(std::array< double, N > &Position)
全軸の位置を取得する関数(値域0~2π版)(配列版)
Definition USV-PCIE7.hh:142
double GetPosition(const size_t Axis)
指定した軸の位置を取得する関数(値域0~2π版)
Definition USV-PCIE7.hh:135
double GetTorque(const size_t Axis)
指定した軸のトルクを取得する関数
Definition USV-PCIE7.hh:173
void GetFullPosition(std::array< double, N > &Position)
全軸の位置を取得する関数(値域±∞版)(配列版)
Definition USV-PCIE7.hh:166
void SetZeroCurrent(void)
全軸のq軸電流指令をゼロに設定する関数
Definition USV-PCIE7.hh:96
double GetVelocity(const size_t Axis)
指定した軸の速度を取得する関数(アナログ出力設定"AOMD 1 0 1.0"に設定のこと)
Definition USV-PCIE7.hh:119
USV_PCIE7(const unsigned long Addr)
コンストラクタ
Definition USV-PCIE7.hh:53
USV_PCIE7(USV_PCIE7 &&right)
ムーブコンストラクタ
Definition USV-PCIE7.hh:66
void SetControlMode(ControlMode Ctrl)
制御モードを設定する関数
Definition USV-PCIE7.hh:208
void GetCurrent(std::array< double, N > &Current)
全軸のq軸電流指令を取得する関数(配列版) (アナログ出力設定"AOMD 4 0 1.0"に設定のこと)
Definition USV-PCIE7.hh:112
void CalibrateZeroTorque(void)
トルクセンサのゼロ校正を実行する関数
Definition USV-PCIE7.hh:229