16
16
#define _ADC_VOLTAGE 3 .3f
17
17
#define _ADC_RESOLUTION 4095 .0f
18
18
19
+
20
+ typedef struct ESP32MCPWMCurrentSenseParams {
21
+ int pins[3 ];
22
+ float adc_voltage_conv;
23
+ mcpwm_unit_t mcpwm_unit;
24
+ int buffer_index;
25
+ } ESP32MCPWMCurrentSenseParams;
26
+
27
+
19
28
/* *
20
29
* Inline adc reading implementation
21
30
*/
22
31
// function reading an ADC value and returning the read voltage
23
32
float _readADCVoltageInline (const int pinA, const void * cs_params){
24
33
uint32_t raw_adc = adcRead (pinA);
25
- return raw_adc * ((GenericCurrentSenseParams *)cs_params)->adc_voltage_conv ;
34
+ return raw_adc * ((ESP32MCPWMCurrentSenseParams *)cs_params)->adc_voltage_conv ;
26
35
}
27
36
28
37
// function reading an ADC value and returning the read voltage
29
- void * _configureADCInline (const void * driver_params, const int pinA,const int pinB,const int pinC){
38
+ void * _configureADCInline (const void * driver_params, const int pinA, const int pinB, const int pinC){
30
39
_UNUSED (driver_params);
31
40
32
41
pinMode (pinA, INPUT);
33
42
pinMode (pinB, INPUT);
34
43
if ( _isset (pinC) ) pinMode (pinC, INPUT);
35
44
36
- GenericCurrentSenseParams * params = new GenericCurrentSenseParams {
45
+ ESP32MCPWMCurrentSenseParams * params = new ESP32MCPWMCurrentSenseParams {
37
46
.pins = { pinA, pinB, pinC },
38
47
.adc_voltage_conv = (_ADC_VOLTAGE)/(_ADC_RESOLUTION)
39
48
};
@@ -46,60 +55,68 @@ void* _configureADCInline(const void* driver_params, const int pinA,const int pi
46
55
/* *
47
56
* Low side adc reading implementation
48
57
*/
49
- static mcpwm_dev_t *MCPWM[2 ] = {&MCPWM0, &MCPWM1};
50
- int a1, a2, a3; // Current readings from internal current sensor amplifiers
51
- int _pinA, _pinB, _pinC;
52
58
53
59
static void IRAM_ATTR mcpwm0_isr_handler (void *);
54
60
static void IRAM_ATTR mcpwm1_isr_handler (void *);
55
61
byte currentState = 1 ;
56
-
57
- int * adc_pins;
58
- int * adc_buffer ;
59
- int adc_pin_count;
60
- int adc_pin_read_index ;
61
-
62
+ // two mcpwm units
63
+ // - max 2 motors per mcpwm unit (6 adc channels)
64
+ int adc_pins[ 2 ][ 6 ]={ 0 } ;
65
+ int adc_pin_count[ 2 ]={ 0 } ;
66
+ uint32_t adc_buffer[ 2 ][ 6 ]={ 0 } ;
67
+ int adc_read_index[ 2 ]={ 0 };
62
68
63
69
// function reading an ADC value and returning the read voltage
64
70
float _readADCVoltageLowSide (const int pin, const void * cs_params){
65
71
uint32_t raw_adc;
66
72
67
- if (pin == _pinA) raw_adc = a1 ;
68
- else if (pin == _pinB) raw_adc = a2 ;
69
- else if (pin == _pinC) raw_adc = a3 ;
73
+ mcpwm_unit_t unit = ((ESP32MCPWMCurrentSenseParams*)cs_params)-> mcpwm_unit ;
74
+ int buffer_index = ((ESP32MCPWMCurrentSenseParams*)cs_params)-> buffer_index ;
75
+ float adc_voltage_conv = ((ESP32MCPWMCurrentSenseParams*)cs_params)-> adc_voltage_conv ;
70
76
71
- return raw_adc * ((GenericCurrentSenseParams*)cs_params)->adc_voltage_conv ;
77
+ for (int i=0 ; i < adc_pin_count[unit]; i++){
78
+ if ( pin == ((ESP32MCPWMCurrentSenseParams*)cs_params)->pins [i]) // found in the buffer
79
+ return adc_buffer[unit][buffer_index + i] * adc_voltage_conv;
80
+ }
81
+ // not found
82
+ return 0 ;
72
83
}
73
84
74
- // function reading an ADC value and returning the read voltage
85
+ // function configuring low-side current sensing
75
86
void * _configureADCLowSide (const void * driver_params, const int pinA,const int pinB,const int pinC){
76
- _UNUSED (driver_params);
77
-
78
- _pinA= pinA;
79
- _pinB= pinB;
80
- if ( _isset (pinC) ) _pinC= pinC;
87
+
88
+ mcpwm_unit_t unit = ((ESP32MCPWMDriverParams*)driver_params)->mcpwm_unit ;
89
+ int index_start = adc_pin_count[unit];
90
+ adc_pins[unit][adc_pin_count[unit]++] = pinA;
91
+ adc_pins[unit][adc_pin_count[unit]++] = pinB;
92
+ if ( _isset (pinC) ) adc_pins[unit][adc_pin_count[unit]++] = pinC;
81
93
82
94
pinMode (pinA, INPUT);
83
95
pinMode (pinB, INPUT);
84
96
if ( _isset (pinC) ) pinMode (pinC, INPUT);
85
97
86
- GenericCurrentSenseParams * params = new GenericCurrentSenseParams {
98
+ ESP32MCPWMCurrentSenseParams * params = new ESP32MCPWMCurrentSenseParams {
87
99
.pins = { pinA, pinB, pinC },
88
- .adc_voltage_conv = (_ADC_VOLTAGE)/(_ADC_RESOLUTION)
100
+ .adc_voltage_conv = (_ADC_VOLTAGE)/(_ADC_RESOLUTION),
101
+ .mcpwm_unit = unit,
102
+ .buffer_index = index_start
89
103
};
90
104
91
105
return params;
92
106
}
93
107
94
108
95
109
void _driverSyncLowSide (void * driver_params, void * cs_params){
96
- // high side registers enable interrupt
97
- // MCPWM[MCPWM_UNIT_0]->int_ena.timer0_tez_int_ena = true;//A PWM timer 0 TEP event will trigger this interrupt
98
110
99
- // low-side register enable interrupt
100
111
mcpwm_dev_t * mcpwm_dev = ((ESP32MCPWMDriverParams*)driver_params)->mcpwm_dev ;
101
112
mcpwm_unit_t mcpwm_unit = ((ESP32MCPWMDriverParams*)driver_params)->mcpwm_unit ;
113
+
114
+ // low-side register enable interrupt
102
115
mcpwm_dev->int_ena .timer0_tep_int_ena = true ;// A PWM timer 0 TEP event will trigger this interrupt
116
+ // high side registers enable interrupt
117
+ // mcpwm_dev->int_ena.timer0_tep_int_ena = true;//A PWM timer 0 TEZ event will trigger this interrupt
118
+
119
+ // register interrupts (mcpwm number, interrupt handler, handler argument = NULL, interrupt signal/flag, return handler = NULL)
103
120
if (mcpwm_unit == MCPWM_UNIT_0)
104
121
mcpwm_isr_register (mcpwm_unit, mcpwm0_isr_handler, NULL , ESP_INTR_FLAG_IRAM, NULL ); // Set ISR Handler
105
122
else
@@ -109,63 +126,38 @@ void _driverSyncLowSide(void* driver_params, void* cs_params){
109
126
// Read currents when interrupt is triggered
110
127
static void IRAM_ATTR mcpwm0_isr_handler (void *){
111
128
// // high side
112
- // uint32_t mcpwm_intr_status_0 = MCPWM0.int_st.timer0_tez_int_st;
129
+ // uint32_t mcpwm_intr_status = MCPWM0.int_st.timer0_tez_int_st;
113
130
114
131
// low side
115
132
uint32_t mcpwm_intr_status = MCPWM0.int_st .timer0_tep_int_st ;
116
133
if (mcpwm_intr_status){
117
- switch (currentState)
118
- {
119
- case 1 :
120
- a1 = adcRead (_pinA);
121
- currentState = 2 ;
122
- break ;
123
- case 2 :
124
- a2 = adcRead (_pinB);
125
- currentState = _isset (_pinC) ? 3 : 1 ;
126
- break ;
127
- case 3 :
128
- a3 = adcRead (_pinC);
129
- currentState = 1 ;
130
- break ;
131
- }
134
+ adc_buffer[0 ][adc_read_index[0 ]] = adcRead (adc_pins[0 ][adc_read_index[0 ]]);
135
+ adc_read_index[0 ]++;
136
+ if (adc_read_index[0 ] == adc_pin_count[0 ]) adc_read_index[0 ] = 0 ;
132
137
}
133
- // high side
134
- // MCPWM0.int_clr.timer0_tez_int_clr = mcpwm_intr_status_0;
135
-
136
138
// low side
137
139
MCPWM0.int_clr .timer0_tep_int_clr = mcpwm_intr_status;
140
+ // high side
141
+ // MCPWM0.int_clr.timer0_tez_int_clr = mcpwm_intr_status_0;
138
142
}
139
143
144
+
140
145
// Read currents when interrupt is triggered
141
146
static void IRAM_ATTR mcpwm1_isr_handler (void *){
142
147
// // high side
143
- // uint32_t mcpwm_intr_status_0 = MCPWM1.int_st.timer0_tez_int_st;
148
+ // uint32_t mcpwm_intr_status = MCPWM1.int_st.timer0_tez_int_st;
144
149
145
150
// low side
146
151
uint32_t mcpwm_intr_status = MCPWM1.int_st .timer0_tep_int_st ;
147
152
if (mcpwm_intr_status){
148
- switch (currentState)
149
- {
150
- case 1 :
151
- a1 = adcRead (_pinA);
152
- currentState = 2 ;
153
- break ;
154
- case 2 :
155
- a2 = adcRead (_pinB);
156
- currentState = _isset (_pinC) ? 3 : 1 ;
157
- break ;
158
- case 3 :
159
- a3 = adcRead (_pinC);
160
- currentState = 1 ;
161
- break ;
162
- }
153
+ adc_buffer[1 ][adc_read_index[1 ]] = adcRead (adc_pins[1 ][adc_read_index[1 ]]);
154
+ adc_read_index[1 ]++;
155
+ if (adc_read_index[1 ] == adc_pin_count[1 ]) adc_read_index[1 ] = 0 ;
163
156
}
164
- // high side
165
- // MCPWM1.int_clr.timer0_tez_int_clr = mcpwm_intr_status_0;
166
-
167
157
// low side
168
158
MCPWM1.int_clr .timer0_tep_int_clr = mcpwm_intr_status;
159
+ // high side
160
+ // MCPWM1.int_clr.timer0_tez_int_clr = mcpwm_intr_status_0;
169
161
}
170
162
171
163
0 commit comments