Skip to content

Commit a149896

Browse files
author
Richard Unger
committed
portenta refactored (but untested)
1 parent 898e40e commit a149896

File tree

1 file changed

+63
-63
lines changed

1 file changed

+63
-63
lines changed

src/drivers/hardware_specific/portenta_h7_mcu.cpp

Lines changed: 63 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,14 @@
2121
// #define _SOFTWARE_6PWM 0
2222
// #define _ERROR_6PWM -1
2323

24-
typedef struct{
25-
int id ;
26-
pwmout_t pins[6];
27-
} portenta_h7_mcu_enty_s;
2824

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+
3132

3233

3334
/* 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){
379380
// function setting the high pwm frequency to the supplied pins
380381
// - Stepper motor - 2PWM setting
381382
// - 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) {
383384
if( !pwm_frequency || !_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
384385
else pwm_frequency = _constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX); // constrain to 50kHz max
385386

386-
motor_slot[slot_index].id = pinA;
387+
PortentaDriverParams* params = new PortentaDriverParams();
388+
params->pwm_frequency = pwm_frequency;
387389

388390
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);
391393
// 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]));
393395
core_util_critical_section_exit();
394-
slot_index++;
396+
return params;
395397
}
396398

397399

398400
// function setting the high pwm frequency to the supplied pins
399401
// - BLDC motor - 3PWM setting
400402
// - 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) {
402404
if( !pwm_frequency || !_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
403405
else pwm_frequency = _constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX); // constrain to 50kHz max
404406

405-
motor_slot[slot_index].id = pinA;
407+
PortentaDriverParams* params = new PortentaDriverParams();
408+
params->pwm_frequency = pwm_frequency;
409+
406410
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);
410414
// 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]));
412416
core_util_critical_section_exit();
413-
slot_index++;
417+
418+
return params;
414419
}
415420

421+
422+
416423
// function setting the high pwm frequency to the supplied pins
417424
// - Stepper motor - 4PWM setting
418425
// - 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) {
420427
if( !pwm_frequency || !_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
421428
else pwm_frequency = _constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX); // constrain to 50kHz max
422429

423-
motor_slot[slot_index].id = pinA;
430+
PortentaDriverParams* params = new PortentaDriverParams();
431+
params->pwm_frequency = pwm_frequency;
432+
424433
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);
429438
// 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]));
431440
core_util_critical_section_exit();
432-
slot_index++;
441+
442+
return params;
433443
}
434444

445+
446+
435447
// function setting the pwm duty cycle to the hardware
436448
// - Stepper motor - 2PWM setting
437449
//- 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();
447455
}
448456

449457
// function setting the pwm duty cycle to the hardware
450458
// - BLDC motor - 3PWM setting
451459
//- 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();
462466
}
463467

464468

465469
// function setting the pwm duty cycle to the hardware
466470
// - Stepper motor - 4PWM setting
467471
//- 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();
479479
}
480480

481481

482-
482+
// 6-PWM currently not supported, defer to generic, which also doesn't support it ;-)
483483

484484
// Configuring PWM frequency, resolution and alignment
485485
// - BLDC driver - 6PWM setting
486486
// - 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){
488488
// if( !pwm_frequency || !_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
489489
// else pwm_frequency = _constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX); // constrain to |%0kHz max
490490
// // center-aligned frequency is uses two periods
@@ -510,13 +510,13 @@ int _configure6PWM(long pwm_frequency, float dead_zone, const int pinA_h, const
510510
// _alignPWMTimers(HT1, HT2, HT3);
511511
// break;
512512
// }
513-
return -1; // success
514-
}
513+
// return -1; // success
514+
// }
515515

516516
// Function setting the duty cycle to the pwm pin (ex. analogWrite())
517517
// - BLDC driver - 6PWM setting
518518
// - 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){
520520
// // find configuration
521521
// int config = _interfaceType(pinA_h, pinA_l, pinB_h, pinB_l, pinC_h, pinC_l);
522522
// // set pwm accordingly
@@ -535,5 +535,5 @@ void _writeDutyCycle6PWM(float dc_a, float dc_b, float dc_c, float dead_zone, i
535535
// _setPwm(pinC_h, _constrain(dc_c - dead_zone/2, 0, 1)*_PWM_RANGE, _PWM_RESOLUTION);
536536
// break;
537537
// }
538-
}
538+
//}
539539
#endif

0 commit comments

Comments
 (0)