21
21
// #define _SOFTWARE_6PWM 0
22
22
// #define _ERROR_6PWM -1
23
23
24
- typedef struct {
25
- int id ;
26
- pwmout_t pins[6 ];
27
- } portenta_h7_mcu_enty_s;
28
24
29
- portenta_h7_mcu_enty_s motor_slot[10 ];
30
- int slot_index = 0 ;
25
+
26
+ typedef struct PortentaDriverParams {
27
+ pwmout_t pins[4 ];
28
+ long pwm_frequency;
29
+ // float dead_zone;
30
+ } PortentaDriverParams;
31
+
31
32
32
33
33
34
/* Convert STM32 Cube HAL channel to LL channel */
@@ -379,112 +380,111 @@ void _alignPWMTimers(pwmout_t *t1, pwmout_t *t2, pwmout_t *t3, pwmout_t *t4){
379
380
// function setting the high pwm frequency to the supplied pins
380
381
// - Stepper motor - 2PWM setting
381
382
// - hardware speciffic
382
- void _configure2PWM (long pwm_frequency,const int pinA, const int pinB) {
383
+ void * _configure2PWM (long pwm_frequency,const int pinA, const int pinB) {
383
384
if ( !pwm_frequency || !_isset (pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
384
385
else pwm_frequency = _constrain (pwm_frequency, 0 , _PWM_FREQUENCY_MAX); // constrain to 50kHz max
385
386
386
- motor_slot[slot_index].id = pinA;
387
+ PortentaDriverParams* params = new PortentaDriverParams ();
388
+ params->pwm_frequency = pwm_frequency;
387
389
388
390
core_util_critical_section_enter ();
389
- _pwm_init (&(motor_slot[slot_index]. pins [0 ]), pinA, (long )pwm_frequency);
390
- _pwm_init (&(motor_slot[slot_index]. pins [1 ]), pinB, (long )pwm_frequency);
391
+ _pwm_init (&(params-> pins [0 ]), pinA, (long )pwm_frequency);
392
+ _pwm_init (&(params-> pins [1 ]), pinB, (long )pwm_frequency);
391
393
// allign the timers
392
- _alignPWMTimers (&(motor_slot[slot_index]. pins [0 ]), &(motor_slot[slot_index]. pins [1 ]));
394
+ _alignPWMTimers (&(params-> pins [0 ]), &(params-> pins [1 ]));
393
395
core_util_critical_section_exit ();
394
- slot_index++ ;
396
+ return params ;
395
397
}
396
398
397
399
398
400
// function setting the high pwm frequency to the supplied pins
399
401
// - BLDC motor - 3PWM setting
400
402
// - hardware speciffic
401
- void _configure3PWM (long pwm_frequency,const int pinA, const int pinB, const int pinC) {
403
+ void * _configure3PWM (long pwm_frequency,const int pinA, const int pinB, const int pinC) {
402
404
if ( !pwm_frequency || !_isset (pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
403
405
else pwm_frequency = _constrain (pwm_frequency, 0 , _PWM_FREQUENCY_MAX); // constrain to 50kHz max
404
406
405
- motor_slot[slot_index].id = pinA;
407
+ PortentaDriverParams* params = new PortentaDriverParams ();
408
+ params->pwm_frequency = pwm_frequency;
409
+
406
410
core_util_critical_section_enter ();
407
- _pwm_init (&(motor_slot[slot_index]. pins [0 ]), pinA, (long )pwm_frequency);
408
- _pwm_init (&(motor_slot[slot_index]. pins [1 ]), pinB, (long )pwm_frequency);
409
- _pwm_init (&(motor_slot[slot_index]. pins [2 ]), pinC, (long )pwm_frequency);
411
+ _pwm_init (&(params-> pins [0 ]), pinA, (long )pwm_frequency);
412
+ _pwm_init (&(params-> pins [1 ]), pinB, (long )pwm_frequency);
413
+ _pwm_init (&(params-> pins [2 ]), pinC, (long )pwm_frequency);
410
414
// allign the timers
411
- _alignPWMTimers (&(motor_slot[slot_index]. pins [0 ]), &(motor_slot[slot_index]. pins [1 ]), &(motor_slot[slot_index]. pins [2 ]));
415
+ _alignPWMTimers (&(params-> pins [0 ]), &(params-> pins [1 ]), &(params-> pins [2 ]));
412
416
core_util_critical_section_exit ();
413
- slot_index++;
417
+
418
+ return params;
414
419
}
415
420
421
+
422
+
416
423
// function setting the high pwm frequency to the supplied pins
417
424
// - Stepper motor - 4PWM setting
418
425
// - hardware speciffic
419
- void _configure4PWM (long pwm_frequency,const int pinA, const int pinB, const int pinC, const int pinD) {
426
+ void * _configure4PWM (long pwm_frequency,const int pinA, const int pinB, const int pinC, const int pinD) {
420
427
if ( !pwm_frequency || !_isset (pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
421
428
else pwm_frequency = _constrain (pwm_frequency, 0 , _PWM_FREQUENCY_MAX); // constrain to 50kHz max
422
429
423
- motor_slot[slot_index].id = pinA;
430
+ PortentaDriverParams* params = new PortentaDriverParams ();
431
+ params->pwm_frequency = pwm_frequency;
432
+
424
433
core_util_critical_section_enter ();
425
- _pwm_init (&(motor_slot[slot_index]. pins [0 ]), pinA, (long )pwm_frequency);
426
- _pwm_init (&(motor_slot[slot_index]. pins [1 ]), pinB, (long )pwm_frequency);
427
- _pwm_init (&(motor_slot[slot_index]. pins [2 ]), pinC, (long )pwm_frequency);
428
- _pwm_init (&(motor_slot[slot_index]. pins [3 ]), pinD, (long )pwm_frequency);
434
+ _pwm_init (&(params-> pins [0 ]), pinA, (long )pwm_frequency);
435
+ _pwm_init (&(params-> pins [1 ]), pinB, (long )pwm_frequency);
436
+ _pwm_init (&(params-> pins [2 ]), pinC, (long )pwm_frequency);
437
+ _pwm_init (&(params-> pins [3 ]), pinD, (long )pwm_frequency);
429
438
// allign the timers
430
- _alignPWMTimers (&(motor_slot[slot_index]. pins [0 ]), &(motor_slot[slot_index]. pins [1 ]), &(motor_slot[slot_index]. pins [2 ]), &(motor_slot[slot_index]. pins [3 ]));
439
+ _alignPWMTimers (&(params-> pins [0 ]), &(params-> pins [1 ]), &(params-> pins [2 ]), &(params-> pins [3 ]));
431
440
core_util_critical_section_exit ();
432
- slot_index++;
441
+
442
+ return params;
433
443
}
434
444
445
+
446
+
435
447
// function setting the pwm duty cycle to the hardware
436
448
// - Stepper motor - 2PWM setting
437
449
// - hardware speciffic
438
- void _writeDutyCycle2PWM (float dc_a, float dc_b, int pinA, int pinB){
439
- for (int i=0 ; i<slot_index; i++){
440
- if (motor_slot[i].id == pinA){
441
- core_util_critical_section_enter ();
442
- _pwm_write (&(motor_slot[i].pins [0 ]), (float )dc_a);
443
- _pwm_write (&(motor_slot[i].pins [1 ]), (float )dc_b);
444
- core_util_critical_section_exit ();
445
- }
446
- }
450
+ void _writeDutyCycle2PWM (float dc_a, float dc_b, void * params){
451
+ core_util_critical_section_enter ();
452
+ _pwm_write (&(((PortentaDriverParams*)params)->pins [0 ]), (float )dc_a);
453
+ _pwm_write (&(((PortentaDriverParams*)params)->pins [1 ]), (float )dc_b);
454
+ core_util_critical_section_exit ();
447
455
}
448
456
449
457
// function setting the pwm duty cycle to the hardware
450
458
// - BLDC motor - 3PWM setting
451
459
// - hardware speciffic
452
- void _writeDutyCycle3PWM (float dc_a, float dc_b, float dc_c, int pinA, int pinB, int pinC){
453
- for (int i=0 ; i<slot_index; i++){
454
- if (motor_slot[i].id == pinA){
455
- core_util_critical_section_enter ();
456
- _pwm_write (&(motor_slot[i].pins [0 ]), (float )dc_a);
457
- _pwm_write (&(motor_slot[i].pins [1 ]), (float )dc_b);
458
- _pwm_write (&(motor_slot[i].pins [2 ]), (float )dc_c);
459
- core_util_critical_section_exit ();
460
- }
461
- }
460
+ void _writeDutyCycle3PWM (float dc_a, float dc_b, float dc_c, void * params){
461
+ core_util_critical_section_enter ();
462
+ _pwm_write (&(((PortentaDriverParams*)params)->pins [0 ]), (float )dc_a);
463
+ _pwm_write (&(((PortentaDriverParams*)params)->pins [1 ]), (float )dc_b);
464
+ _pwm_write (&(((PortentaDriverParams*)params)->pins [2 ]), (float )dc_c);
465
+ core_util_critical_section_exit ();
462
466
}
463
467
464
468
465
469
// function setting the pwm duty cycle to the hardware
466
470
// - Stepper motor - 4PWM setting
467
471
// - hardware speciffic
468
- void _writeDutyCycle4PWM (float dc_1a, float dc_1b, float dc_2a, float dc_2b, int pin1A, int pin1B, int pin2A, int pin2B){
469
- for (int i=0 ; i<slot_index; i++){
470
- if (motor_slot[i].id == pin1A){
471
- core_util_critical_section_enter ();
472
- _pwm_write (&(motor_slot[i].pins [0 ]), (float )dc_1a);
473
- _pwm_write (&(motor_slot[i].pins [1 ]), (float )dc_1b);
474
- _pwm_write (&(motor_slot[i].pins [2 ]), (float )dc_2a);
475
- _pwm_write (&(motor_slot[i].pins [3 ]), (float )dc_2b);
476
- core_util_critical_section_exit ();
477
- }
478
- }
472
+ void _writeDutyCycle4PWM (float dc_1a, float dc_1b, float dc_2a, float dc_2b, void * params){
473
+ core_util_critical_section_enter ();
474
+ _pwm_write (&(((PortentaDriverParams*)params)->pins [0 ]), (float )dc_1a);
475
+ _pwm_write (&(((PortentaDriverParams*)params)->pins [1 ]), (float )dc_1b);
476
+ _pwm_write (&(((PortentaDriverParams*)params)->pins [2 ]), (float )dc_2a);
477
+ _pwm_write (&(((PortentaDriverParams*)params)->pins [3 ]), (float )dc_2b);
478
+ core_util_critical_section_exit ();
479
479
}
480
480
481
481
482
-
482
+ // 6-PWM currently not supported, defer to generic, which also doesn't support it ;-)
483
483
484
484
// Configuring PWM frequency, resolution and alignment
485
485
// - BLDC driver - 6PWM setting
486
486
// - hardware specific
487
- int _configure6PWM (long pwm_frequency, float dead_zone, const int pinA_h, const int pinA_l, const int pinB_h, const int pinB_l, const int pinC_h, const int pinC_l){
487
+ // void* _configure6PWM(long pwm_frequency, float dead_zone, const int pinA_h, const int pinA_l, const int pinB_h, const int pinB_l, const int pinC_h, const int pinC_l){
488
488
// if( !pwm_frequency || !_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
489
489
// else pwm_frequency = _constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX); // constrain to |%0kHz max
490
490
// // center-aligned frequency is uses two periods
@@ -510,13 +510,13 @@ int _configure6PWM(long pwm_frequency, float dead_zone, const int pinA_h, const
510
510
// _alignPWMTimers(HT1, HT2, HT3);
511
511
// break;
512
512
// }
513
- return -1 ; // success
514
- }
513
+ // return -1; // success
514
+ // }
515
515
516
516
// Function setting the duty cycle to the pwm pin (ex. analogWrite())
517
517
// - BLDC driver - 6PWM setting
518
518
// - hardware specific
519
- void _writeDutyCycle6PWM (float dc_a, float dc_b, float dc_c, float dead_zone, int pinA_h, int pinA_l, int pinB_h, int pinB_l, int pinC_h, int pinC_l ){
519
+ // void _writeDutyCycle6PWM(float dc_a, float dc_b, float dc_c, void* params ){
520
520
// // find configuration
521
521
// int config = _interfaceType(pinA_h, pinA_l, pinB_h, pinB_l, pinC_h, pinC_l);
522
522
// // set pwm accordingly
@@ -535,5 +535,5 @@ void _writeDutyCycle6PWM(float dc_a, float dc_b, float dc_c, float dead_zone, i
535
535
// _setPwm(pinC_h, _constrain(dc_c - dead_zone/2, 0, 1)*_PWM_RANGE, _PWM_RESOLUTION);
536
536
// break;
537
537
// }
538
- }
538
+ // }
539
539
#endif
0 commit comments