3838
3939
4040/* *
41-  *  Low side adc reading implementation   
41+  *  Low side adc reading implementation 
4242*/ 
4343
4444
@@ -58,12 +58,12 @@ float _readADCVoltageLowSide(const int pin, const void* cs_params){
5858}
5959
6060
61- //  function configuring low-side current sensing  
61+ //  function configuring low-side current sensing
6262void * _configureADCLowSide (const  void * driver_params, const  int  pinA,const  int  pinB,const  int  pinC){
63-   //  check if driver timer is already running  
63+   //  check if driver timer is already running
6464  //  fail if it is
6565  //  the easiest way that I've found to check if timer is running
66-   //  is to start it and stop it  
66+   //  is to start it and stop it
6767  ESP32MCPWMDriverParams *p = (ESP32MCPWMDriverParams*)driver_params;
6868  mcpwm_timer_t * t = (mcpwm_timer_t *) p->timers [0 ];
6969
@@ -74,7 +74,7 @@ void* _configureADCLowSide(const void* driver_params, const int pinA,const int p
7474    return  SIMPLEFOC_CURRENT_SENSE_INIT_FAILED;
7575  }
7676
77-    
77+ 
7878  ESP32CurrentSenseParams* params = new  ESP32CurrentSenseParams{};
7979  int  no_adc_channels = 0 ;
8080
@@ -90,14 +90,31 @@ void* _configureADCLowSide(const void* driver_params, const int pinA,const int p
9090      params->pins [no_adc_channels++] = adc_pins[i];
9191    }
9292  }
93-    
93+ 
9494  t->user_data  = params;
9595  params->adc_voltage_conv  = (_ADC_VOLTAGE)/(_ADC_RESOLUTION);
9696  params->no_adc_channels  = no_adc_channels;
9797  return  params;
9898}
9999
100+ static  bool  IRAM_ATTR _mcpwmTriggerADCCallback (mcpwm_timer_handle_t  tim, const  mcpwm_timer_event_data_t * edata, void * user_data){
101+   ESP32CurrentSenseParams *p = (ESP32CurrentSenseParams*)user_data;
102+ #ifdef  SIMPLEFOC_ESP32_INTERRUPT_DEBUG //  debugging toggle pin to measure the time of the interrupt with oscilloscope
103+   gpio_set_level (GPIO_NUM,1 ); // cca 250ns for on+off
104+ #endif 
100105
106+   //  sample the phase currents one at a time
107+   //  ESP's adc read takes around 10us which is very long
108+   //  increment buffer index
109+   p->buffer_index  = (p->buffer_index  + 1 ) % p->no_adc_channels ;
110+   //  so we are sampling one phase per call
111+   p->adc_buffer [p->buffer_index ] = adcRead (p->pins [p->buffer_index ]);
112+ 
113+ #ifdef  SIMPLEFOC_ESP32_INTERRUPT_DEBUG //  debugging toggle pin to measure the time of the interrupt with oscilloscope
114+   gpio_set_level (GPIO_NUM,0 ); // cca 250ns for on+off
115+ #endif 
116+   return  true ;
117+ }
101118
102119void * _driverSyncLowSide (void * driver_params, void * cs_params){
103120#ifdef  SIMPLEFOC_ESP32_INTERRUPT_DEBUG
@@ -115,29 +132,12 @@ void* _driverSyncLowSide(void* driver_params, void* cs_params){
115132
116133  //  set the callback for the low side current sensing
117134  //  mcpwm_timer_event_callbacks_t can be used to set the callback
118-   //  for three timer events  
135+   //  for three timer events
119136  //  - on_full  - low-side
120-   //  - on_empty - high-side  
137+   //  - on_empty - high-side
121138  //  - on_sync  - sync event (not used with simplefoc)
122139  auto  cbs = mcpwm_timer_event_callbacks_t {
123-     .on_full  = [](mcpwm_timer_handle_t  tim, const  mcpwm_timer_event_data_t * edata, void * user_data){ 
124-       ESP32CurrentSenseParams *p = (ESP32CurrentSenseParams*)user_data;
125- #ifdef  SIMPLEFOC_ESP32_INTERRUPT_DEBUG //  debugging toggle pin to measure the time of the interrupt with oscilloscope
126-       gpio_set_level (GPIO_NUM,1 ); // cca 250ns for on+off
127- #endif 
128- 
129-       //  sample the phase currents one at a time
130-       //  ESP's adc read takes around 10us which is very long 
131-       //  increment buffer index
132-       p->buffer_index  = (p->buffer_index  + 1 ) % p->no_adc_channels ;
133-       //  so we are sampling one phase per call
134-       p->adc_buffer [p->buffer_index ] = adcRead (p->pins [p->buffer_index ]); 
135- 
136- #ifdef  SIMPLEFOC_ESP32_INTERRUPT_DEBUG //  debugging toggle pin to measure the time of the interrupt with oscilloscope
137-       gpio_set_level (GPIO_NUM,0 ); // cca 250ns for on+off
138- #endif 
139-       return  true ; 
140-     },
140+     .on_full  = _mcpwmTriggerADCCallback,
141141  };
142142  SIMPLEFOC_ESP32_CS_DEBUG (" Timer "  +String (t->timer_id )+"  enable interrupt callback."  );
143143  //  set the timer state to init (so that we can call the `mcpwm_timer_register_event_callbacks` )
0 commit comments