Statistics
| Branch: | Tag: | Revision:

amiro-os / modules / DiWheelDrive_1-2 / module.c @ 70dd091e

History | View | Annotate | Download (15.62 KB)

1
/*
2
AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
3
Copyright (C) 2016..2019  Thomas Schöpping et al.
4

5
This program is free software: you can redistribute it and/or modify
6
it under the terms of the GNU General Public License as published by
7
the Free Software Foundation, either version 3 of the License, or
8
(at your option) any later version.
9

10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
GNU General Public License for more details.
14

15
You should have received a copy of the GNU General Public License
16
along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
*/
18

    
19
/**
20
 * @file
21
 * @brief   Structures and constant for the DiWheelDrive module.
22
 *
23
 * @addtogroup diwheeldrive_module
24
 * @{
25
 */
26

    
27
#include "module.h"
28

    
29
/*===========================================================================*/
30
/**
31
 * @name Module specific functions
32
 * @{
33
 */
34
/*===========================================================================*/
35

    
36
/** @} */
37

    
38
/*===========================================================================*/
39
/**
40
 * @name ChibiOS/HAL configuration
41
 * @{
42
 */
43
/*===========================================================================*/
44

    
45
CANConfig moduleHalCanConfig = {
46
  /* mcr  */ CAN_MCR_ABOM | CAN_MCR_AWUM | CAN_MCR_TXFP,
47
  /* btr  */ CAN_BTR_SJW(1) | CAN_BTR_TS2(2) | CAN_BTR_TS1(13) | CAN_BTR_BRP(1),
48
};
49

    
50
I2CConfig moduleHalI2cImuConfig = {
51
  /* I²C mode   */ OPMODE_I2C,
52
  /* frequency  */ 400000,
53
  /* duty cycle */ FAST_DUTY_CYCLE_2,
54
};
55

    
56
I2CConfig moduleHalI2cProxEepromPwrmtrConfig = {
57
  /* I²C mode   */ OPMODE_I2C,
58
  /* frequency  */ 400000,
59
  /* duty cycle */ FAST_DUTY_CYCLE_2,
60
};
61

    
62
PWMConfig moduleHalPwmDriveConfig = {
63
  /* frequency              */ 7200000,
64
  /* period                 */ 360,
65
  /* callback               */ NULL,
66
  /* channel configurations */ {
67
    /* channel 0              */ {
68
      /* mode                   */ PWM_OUTPUT_ACTIVE_HIGH,
69
      /* callback               */ NULL
70
    },
71
    /* channel 1              */ {
72
      /* mode                   */ PWM_OUTPUT_ACTIVE_HIGH,
73
      /* callback               */ NULL
74
    },
75
    /* channel 2              */ {
76
      /* mode                   */ PWM_OUTPUT_ACTIVE_HIGH,
77
      /* callback               */ NULL
78
    },
79
    /* channel 3              */ {
80
      /* mode                   */ PWM_OUTPUT_ACTIVE_HIGH,
81
      /* callback               */ NULL
82
    },
83
  },
84
  /* TIM CR2 register       */ 0,
85
#if (STM32_PWM_USE_ADVANCED == TRUE)
86
  /* TIM BDTR register      */ 0,
87
#endif /* (STM32_PWM_USE_ADVANCED == TRUE) */
88
  /* TIM DIER register      */ 0
89
};
90

    
91
QEIConfig moduleHalQeiConfig = {
92
  /* mode           */ QEI_COUNT_BOTH,
93
  /* channel config */ {
94
    /* channel 0 */ {
95
      /* input mode */ QEI_INPUT_NONINVERTED,
96
    },
97
    /* channel 1 */ {
98
      /* input mode */ QEI_INPUT_NONINVERTED,
99
    },
100
  },
101
  /* encoder range  */  0x10000u,
102
};
103

    
104
SerialConfig moduleHalProgIfConfig = {
105
  /* bit rate */ 115200,
106
  /* CR1      */ 0,
107
  /* CR1      */ 0,
108
  /* CR1      */ 0,
109
};
110

    
111
/** @} */
112

    
113
/*===========================================================================*/
114
/**
115
 * @name GPIO definitions
116
 * @{
117
 */
118
/*===========================================================================*/
119

    
120
/**
121
 * @brief   LED output signal GPIO.
122
 */
123
static apalGpio_t _gpioLed = {
124
  /* line */ LINE_LED,
125
};
126
ROMCONST apalControlGpio_t moduleGpioLed = {
127
  /* GPIO */ &_gpioLed,
128
  /* meta */ {
129
    /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
130
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
131
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
132
  },
133
};
134

    
135
/**
136
 * @brief   POWER_EN output signal GPIO.
137
 */
138
static apalGpio_t _gpioPowerEn = {
139
  /* line */ LINE_POWER_EN,
140
};
141
ROMCONST apalControlGpio_t moduleGpioPowerEn = {
142
  /* GPIO */ &_gpioPowerEn,
143
  /* meta */ {
144
    /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
145
    /* active state   */ APAL_GPIO_ACTIVE_HIGH,
146
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
147
  },
148
};
149

    
150
/**
151
 * @brief   IR_INT input signal GPIO.
152
 */
153
static apalGpio_t _gpioIrInt = {
154
  /* line */ LINE_IR_INT,
155
};
156
ROMCONST apalControlGpio_t moduleGpioIrInt = {
157
  /* GPIO */ &_gpioIrInt,
158
  /* meta */ {
159
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
160
    /* active state   */ (VCNL4020_LLD_INT_EDGE == APAL_GPIO_EDGE_RISING) ? APAL_GPIO_ACTIVE_HIGH : APAL_GPIO_ACTIVE_LOW,
161
    /* interrupt edge */ VCNL4020_LLD_INT_EDGE,
162
  },
163
};
164

    
165
/**
166
 * @brief   SYS_UART_UP bidirectional signal GPIO.
167
 */
168
static apalGpio_t _gpioSysUartUp = {
169
  /* line */ LINE_SYS_UART_UP,
170
};
171
ROMCONST apalControlGpio_t moduleGpioSysUartUp = {
172
  /* GPIO */ &_gpioSysUartUp,
173
  /* meta */ {
174
    /* direction      */ APAL_GPIO_DIRECTION_BIDIRECTIONAL,
175
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
176
    /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
177
  },
178
};
179

    
180
/**
181
 * @brief   IMU_INT input signal GPIO.
182
 */
183
static apalGpio_t _gpioImuInt = {
184
  /* line */ LINE_IMU_INT,
185
};
186
ROMCONST apalControlGpio_t moduleGpioImuInt = {
187
  /* GPIO */ &_gpioImuInt,
188
  /* meta */ {
189
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
190
    /* active state   */ APAL_GPIO_ACTIVE_HIGH, // TODO
191
    /* interrupt edge */ APAL_GPIO_EDGE_RISING, // TODO
192
  },
193
};
194

    
195
/**
196
 * @brief   SYS_SNYC bidirectional signal GPIO.
197
 */
198
static apalGpio_t _gpioSysSync = {
199
  /* line */ LINE_SYS_INT_N,
200
};
201
ROMCONST apalControlGpio_t  moduleGpioSysSync = {
202
  /* GPIO */ &_gpioSysSync,
203
  /* meta */ {
204
    /* direction      */ APAL_GPIO_DIRECTION_BIDIRECTIONAL,
205
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
206
    /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
207
  },
208
};
209

    
210
/**
211
 * @brief   IMU_RESET output signal GPIO.
212
 */
213
static apalGpio_t _gpioImuReset = {
214
  /* line */ LINE_IMU_RESET_N,
215
};
216
ROMCONST apalControlGpio_t  moduleGpioImuReset = {
217
  /* GPIO */ &_gpioImuReset,
218
  /* meta */ {
219
    /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
220
    /* active state   */ APAL_GPIO_ACTIVE_LOW, // TODO
221
    /* interrupt edge */ APAL_GPIO_EDGE_NONE, // TODO
222
  },
223
};
224

    
225
/**
226
 * @brief   PATH_DCSTAT input signal GPIO.
227
 */
228
static apalGpio_t _gpioPathDcStat = {
229
  /* line */ LINE_PATH_DCSTAT,
230
};
231
ROMCONST apalControlGpio_t moduleGpioPathDcStat = {
232
  /* GPIO */ &_gpioPathDcStat,
233
  /* meta */ {
234
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
235
    /* active state   */ LTC4412_LLD_STAT_ACTIVE_STATE,
236
    /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
237
  },
238
};
239

    
240
/**
241
 * @brief   PATH_DCEN output signal GPIO.
242
 */
243
static apalGpio_t _gpioPathDcEn = {
244
  /* line */ LINE_PATH_DCEN,
245
};
246
ROMCONST apalControlGpio_t moduleGpioPathDcEn = {
247
  /* GPIO */ &_gpioPathDcEn,
248
  /* meta */ {
249
    /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
250
    /* active state   */ LTC4412_LLD_CTRL_ACTIVE_STATE,
251
    /* interrupt edge */ APAL_GPIO_EDGE_NONE,
252
  },
253
};
254

    
255
/**
256
 * @brief   SYS_PD bidirectional signal GPIO.
257
 */
258
static apalGpio_t _gpioSysPd = {
259
  /* line */ LINE_SYS_PD_N,
260
};
261
ROMCONST apalControlGpio_t moduleGpioSysPd = {
262
  /* GPIO */ &_gpioSysPd,
263
  /* meta */ {
264
    /* direction      */ APAL_GPIO_DIRECTION_BIDIRECTIONAL,
265
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
266
    /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
267
  },
268
};
269

    
270
/**
271
 * @brief   SYS_REG_EN input signal GPIO.
272
 */
273
static apalGpio_t _gpioSysRegEn = {
274
  /* line */ LINE_SYS_REG_EN,
275
};
276
ROMCONST apalControlGpio_t moduleGpioSysRegEn = {
277
  /* GPIO */ &_gpioSysRegEn,
278
  /* meta */ {
279
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
280
    /* active state   */ APAL_GPIO_ACTIVE_HIGH,
281
    /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
282
  },
283
};
284

    
285
/**
286
 * @brief   IMU_BOOT_LOAD output signal GPIO.
287
 */
288
static apalGpio_t _gpioImuBootLoad = {
289
  /* line */ LINE_IMU_BOOT_LOAD_N,
290
};
291
ROMCONST apalControlGpio_t moduleGpioImuBootLoad = {
292
  /* GPIO */ &_gpioImuBootLoad,
293
  /* meta */ {
294
    /* direction      */ APAL_GPIO_DIRECTION_OUTPUT,
295
    /* active state   */ APAL_GPIO_ACTIVE_LOW, // TODO
296
    /* interrupt edge */ APAL_GPIO_EDGE_NONE, // TODO
297
  },
298
};
299

    
300
/**
301
 * @brief   IMU_BL_IND input signal GPIO.
302
 */
303
static apalGpio_t _gpioImuBlInd = {
304
  /* line */ LINE_IMU_BL_IND,
305
};
306
ROMCONST apalControlGpio_t moduleGpioImuBlInd = {
307
  /* GPIO */ &_gpioImuBlInd,
308
  /* meta */ {
309
    /* direction      */ APAL_GPIO_DIRECTION_INPUT,
310
    /* active state   */ APAL_GPIO_ACTIVE_HIGH, // TODO
311
    /* interrupt edge */ APAL_GPIO_EDGE_NONE, // TODO
312
  },
313
};
314

    
315
/**
316
 * @brief   SYS_WARMRST bidirectional signal GPIO.
317
 */
318
static apalGpio_t _gpioSysWarmrst = {
319
  /* line */ LINE_SYS_WARMRST_N,
320
};
321
ROMCONST apalControlGpio_t moduleGpioSysWarmrst = {
322
  /* GPIO */ &_gpioSysWarmrst,
323
  /* meta */ {
324
    /* direction      */ APAL_GPIO_DIRECTION_BIDIRECTIONAL,
325
    /* active state   */ APAL_GPIO_ACTIVE_LOW,
326
    /* interrupt edge */ APAL_GPIO_EDGE_BOTH,
327
  },
328
};
329

    
330
/** @} */
331

    
332
/*===========================================================================*/
333
/**
334
 * @name AMiRo-OS core configurations
335
 * @{
336
 */
337
/*===========================================================================*/
338

    
339
#if (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
340
ROMCONST char* moduleShellPrompt = "DiWheelDrive";
341
#endif /* (AMIROOS_CFG_SHELL_ENABLE == true) || (AMIROOS_CFG_TESTS_ENABLE == true) */
342

    
343
/** @} */
344

    
345
/*===========================================================================*/
346
/**
347
 * @name Startup Shutdown Synchronization Protocol (SSSP)
348
 * @{
349
 */
350
/*===========================================================================*/
351

    
352
/** @} */
353

    
354
/*===========================================================================*/
355
/**
356
 * @name Low-level drivers
357
 * @{
358
 */
359
/*===========================================================================*/
360

    
361
A3906Driver moduleLldMotors = {
362
  /* power enable GPIO  */ &moduleGpioPowerEn,
363
};
364

    
365
AT24C01BDriver moduleLldEeprom = {
366
  /* I2C driver   */ &MODULE_HAL_I2C_PROX_EEPROM_PWRMTR,
367
  /* I²C address  */ AT24C01B_LLD_I2C_ADDR_FIXED,
368
};
369

    
370
// TODO: BNO055
371

    
372
INA219Driver moduleLldPowerMonitorVdd = {
373
  /* I2C Driver       */ &MODULE_HAL_I2C_PROX_EEPROM_PWRMTR,
374
  /* I²C address      */ INA219_LLD_I2C_ADDR_FIXED,
375
  /* current LSB (uA) */ 0x00u,
376
  /* configuration    */ NULL,
377
};
378

    
379
LEDDriver moduleLldStatusLed = {
380
  /* LED enable Gpio */ &moduleGpioLed,
381
};
382

    
383
LTC4412Driver moduleLldPowerPathController = {
384
  /* Control GPIO */ &moduleGpioPathDcEn,
385
  /* Status GPIO  */ &moduleGpioPathDcStat,
386
};
387

    
388
PCA9544ADriver moduleLldI2cMultiplexer = {
389
  /* I²C driver   */ &MODULE_HAL_I2C_PROX_EEPROM_PWRMTR,
390
  /* I²C address  */ PCA9544A_LLD_I2C_ADDR_FIXED | PCA9544A_LLD_I2C_ADDR_A0 | PCA9544A_LLD_I2C_ADDR_A1 | PCA9544A_LLD_I2C_ADDR_A2,
391
};
392

    
393
TPS6211xDriver moduleLldStepDownConverterVdrive = {
394
  /* Power enable Gpio */ &moduleGpioPowerEn,
395
};
396

    
397
VCNL4020Driver moduleLldProximity = {
398
  /* I²C Driver */ &MODULE_HAL_I2C_PROX_EEPROM_PWRMTR,
399
};
400

    
401
/** @} */
402

    
403
/*===========================================================================*/
404
/**
405
 * @name Tests
406
 * @{
407
 */
408
/*===========================================================================*/
409
#if (AMIROOS_CFG_TESTS_ENABLE == true) || defined(__DOXYGEN__)
410

    
411
/*
412
 * A3906 (motor driver)
413
 */
414
#include <module_test_A3906.h>
415
static int _testA3906ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
416
{
417
  return moduleTestA3906ShellCb(stream, argc, argv, NULL);
418
}
419
AOS_SHELL_COMMAND(moduleTestA3906ShellCmd, "test:MotorDriver", _testA3906ShellCmdCb);
420

    
421
/*
422
 * AT24C01BN-SH-B (EEPROM)
423
 */
424
#include <module_test_AT24C01B.h>
425
static int _testAt24co1bShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
426
{
427
  return moduleTestAt24c01bShellCb(stream, argc, argv, NULL);
428
}
429
AOS_SHELL_COMMAND(moduleTestAt24c01bShellCmd, "test:EEPROM", _testAt24co1bShellCmdCb);
430

    
431
// TODO: BNO055
432

    
433
/*
434
 * INA219 (power monitor)
435
 */
436
#include <module_test_INA219.h>
437
static int _testIna219ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
438
{
439
  return moduleTestIna219ShellCb(stream, argc, argv, NULL);
440
}
441
AOS_SHELL_COMMAND(moduleTestIna219ShellCmd, "test:PowerMonitor", _testIna219ShellCmdCb);
442

    
443
/*
444
 * Status LED
445
 */
446
#include <module_test_LED.h>
447
static int _testLedShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
448
{
449
  return moduleTestLedShellCb(stream, argc, argv, NULL);
450
}
451
AOS_SHELL_COMMAND(moduleTestLedShellCmd, "test:StatusLED", _testLedShellCmdCb);
452

    
453
/*
454
 * LTC4412 (power path controller)
455
 */
456
#include <module_test_LTC4412.h>
457
static int _testLtc4412ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
458
{
459
  return moduleTestLtc4412ShellCb(stream, argc, argv, NULL);
460
}
461
AOS_SHELL_COMMAND(moduleTestLtc4412ShellCmd, "test:PowerPathController", _testLtc4412ShellCmdCb);
462

    
463
/*
464
 * PCA9544A (I2C multiplexer)
465
 */
466
#include <module_test_PCA9544A.h>
467
static int _testPca9544aShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
468
{
469
  return moduleTestPca9544aShellCb(stream, argc, argv, NULL);
470
}
471
AOS_SHELL_COMMAND(moduleTestPca9544aShellCmd, "test:I2CMultiplexer", _testPca9544aShellCmdCb);
472

    
473
/*
474
 * TPS62113 (step-down converter)
475
 */
476
#include <module_test_TPS6211x.h>
477
static int _testTps6211xShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
478
{
479
  return moduleTestTps6211xShellCb(stream, argc, argv, NULL);
480
}
481
AOS_SHELL_COMMAND(moduleTestTps62113ShellCmd, "test:StepDownConverter", _testTps6211xShellCmdCb);
482

    
483
/*
484
 * VCNL4020 (proximity sensor)
485
 */
486
#include <module_test_VCNL4020.h>
487
static int _testVcnl4020ShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
488
{
489
  return moduleTestVcnl4020ShellCb(stream, argc, argv, NULL);
490
}
491
AOS_SHELL_COMMAND(moduleTestVcnl4020ShellCmd, "test:ProximitySensor", _testVcnl4020ShellCmdCb);
492

    
493
/*
494
 * entire module
495
 */
496
static int _testAllShellCmdCb(BaseSequentialStream* stream, int argc, char* argv[])
497
{
498
  (void)argc;
499
  (void)argv;
500

    
501
  int status = AOS_OK;
502
  char* targv[AMIROOS_CFG_SHELL_MAXARGS] = {NULL};
503
  aos_testresult_t result_test = {0, 0};
504
  aos_testresult_t result_total = {0, 0};
505

    
506
  /* A3906 (motor driver) */
507
  status |= moduleTestA3906ShellCb(stream, 0, targv, &result_test);
508
  result_total = aosTestResultAdd(result_total, result_test);
509

    
510
  /* AT24C01B (EEPROM) */
511
  status |= moduleTestAt24c01bShellCb(stream, 0, targv, &result_test);
512
  result_total = aosTestResultAdd(result_total, result_test);
513

    
514
  // TODO: BNO055
515

    
516
  /* INA219 (power monitor) */
517
  status |= moduleTestIna219ShellCb(stream, 0, targv, &result_test);
518
  result_total = aosTestResultAdd(result_total, result_test);
519

    
520
  /* Status LED */
521
  status |= moduleTestLedShellCb(stream, 0, targv, &result_test);
522
  result_total = aosTestResultAdd(result_total, result_test);
523

    
524
  /* LTC4412 (power path controller) */
525
  status |= moduleTestLtc4412ShellCb(stream, 0, targv, &result_test);
526
  result_total = aosTestResultAdd(result_total, result_test);
527

    
528
  /* PCA9544A (I2C multiplexer) */
529
  status |= moduleTestPca9544aShellCb(stream, 0, targv, &result_test);
530
  result_total = aosTestResultAdd(result_total, result_test);
531

    
532
  /* TPS62113 (step-down converter) */
533
  status |= moduleTestTps6211xShellCb(stream, 0, targv, &result_test);
534
  result_total = aosTestResultAdd(result_total, result_test);
535

    
536
  /* VCNL4020 (proximity sensor) */
537
  // wheel left
538
  targv[1] = "-wl";
539
  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
540
  result_total = aosTestResultAdd(result_total, result_test);
541
  // front left
542
  targv[1] = "-fl";
543
  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
544
  result_total = aosTestResultAdd(result_total, result_test);
545
  // front right
546
  targv[1] = "-fr";
547
  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
548
  result_total = aosTestResultAdd(result_total, result_test);
549
  // wheel right
550
  targv[1] = "-wr";
551
  status |= moduleTestVcnl4020ShellCb(stream, 2, targv, &result_test);
552
  result_total = aosTestResultAdd(result_total, result_test);
553
  targv[1] = "";
554

    
555
  // print total result
556
  chprintf(stream, "\n");
557
  aosTestResultPrintSummary(stream, &result_total, "entire module");
558

    
559
  return status;
560
}
561
AOS_SHELL_COMMAND(moduleTestAllShellCmd, "test:all", _testAllShellCmdCb);
562

    
563
#endif /* (AMIROOS_CFG_TESTS_ENABLE == true) */
564

    
565
/** @} */
566
/** @} */