私は現在、IMUまたは慣性測定ユニット、TDKのICM20948と通信するための基本的なルーチンを開発しています-私が開発したPCBを介してI2Cプロトコルを使用するInvenSenseは、現在、次のように通信する機能を持っています:
int writeRegister(uint8 slaveAdress, uint8 registerAdress, uint8 data);
uint8 readRegisters(uint8 slaveAdress, uint8_t subAddress, uint8 count, uint8 dest);
int selectAutoClockSource(uint8 slaveAdress)
そして、適切に動作している他のいくつか(これが動作していると私に言ったレジスタを読んだことがあります)ポイントは、ICM20948データシートデバイスが、加速度データを読み取るためにそれを構成する順序を指定していないことです。コードを見つけましたGitHubで、より具体的にはhttps://github.com/dtornqvist/icm-20948-arduino-library Arduinoで書かれているので、現在使用している言語であるcに移植して、現在の設定機能
int begin(uint8 slaveAdress){
if (changeUserBank_force(slaveAdress, USER_BANK_0) < 0) {
return -1;
}
if (selectAutoClockSource(slaveAdress) < 0) {
return -2;
}
// enable I2C master mode
if(enableI2cMaster(slaveAdress) < 0){
return -3;
}
if (powerDownMag(slaveAdress) < 0) {
return -4;
}
reset(slaveAdress);
CyDelay(10);
if (selectAutoClockSource(slaveAdress) < 0) {
return -6;
}
whoAreU(slaveAdress);
if(enableAccelGyro(slaveAdress, UB0_PWR_MGMNT_2, UB0_PWR_MGMNT_2_SEN_ENABLE) == 1){
} else {
UART_DEBUG_PutString("\r\n Error al habilitar el giroscopio y acelerometro");
return -7;
}
if(configAccel(slaveAdress, ACCEL_RANGE_2G, ACCEL_DLPF_BANDWIDTH_246HZ) != 1){
return -8;
}
if (setAccelSrd(slaveAdress,0) < 0) {
return -12;
}
return 1;
}
その後、私は私を呼び出します:
int16_t getAccelX_mss(uint8 slaveAdress){
uint8 _axcountsH, _axcountsL;
int16_t _axcounts;
if (changeUserBank_force(slaveAdress, USER_BANK_0) < 0) {
return -1;
}
_axcountsH = readRegisters(slaveAdress, 0x45u, 1, _axcountsH);
_axcountsL = readRegisters(slaveAdress, 0x46u, 1, _axcountsL);
_axcounts = (((int16_t)_axcountsH) << 8) | _axcountsL;
sprintf(Rx_aux, " 0x%d ", _axcounts);
UART_DEBUG_PutString("\r\n Acce Read: ");
UART_DEBUG_PutString(Rx_aux);
return 1;
}
45u と 46u (アクセラレーション) レジスタ情報の組み合わせを UART 経由で返すはずの関数ですが、次の出力を受信しています (Hterm 0.8.3 を使用して uart 出力をキャプチャしています)
UART ok...<\r><\n>
Begin.<\r><\n>
Begin with no errors.<\r><\n>
Acce Read: 0x0
PCB を動かしても、加速度が発生して結果が 0x0 のままになることについては、まったくわかりません。このクラスのソフトウェアで作業したことがある人はいますか?作業を続ける方法についてアドバイスをもらえますか? または、コードに見たことのない重要なエラーがありますか?