2#include "../../../drivers/hardware_specific/teensy/teensy4_mcu.h"
4#include "../../../common/foc_utils.h"
5#include "../../../communication/SimpleFOCDebug.h"
10#if defined(__arm__) && defined(CORE_TEENSY) && ( defined(__IMXRT1062__) || defined(ARDUINO_TEENSY40) || defined(ARDUINO_TEENSY41) || defined(ARDUINO_TEENSY_MICROMOD) )
15volatile uint32_t val0, val1, val2;
22void read_currents(uint32_t *
a, uint32_t*b, uint32_t *
c=
nullptr){
31#ifdef SIMPLEFOC_TEENSY4_ADC_INTERRUPT_DEBUG
32 digitalWrite(30,HIGH);
35 ADC_ETC_DONE0_1_IRQ |= 1;
37 val0 = (ADC_ETC_TRIG0_RESULT_1_0 & 4095);
39 val1 = (ADC_ETC_TRIG0_RESULT_1_0 >> 16) & 4095;
40#ifdef SIMPLEFOC_TEENSY4_ADC_INTERRUPT_DEBUG
47#ifdef SIMPLEFOC_TEENSY4_ADC_INTERRUPT_DEBUG
48 digitalWrite(30,HIGH);
51 ADC_ETC_DONE0_1_IRQ |= 1 << 16;
52 val2 = ADC_ETC_TRIG0_RESULT_3_2 & 4095;
54#ifdef SIMPLEFOC_TEENSY4_ADC_INTERRUPT_DEBUG
61void adc1_init(
int pin1,
int pin2,
int pin3=
NOT_SET) {
63 ADC1_CFG = ADC_CFG_OVWREN
73 ADC1_GC |= ADC_GC_CAL;
74 while (ADC1_GC & ADC_GC_CAL) ;
89 ADC1_CFG = ADC_CFG_OVWREN
98 ADC2_GC |= ADC_GC_CAL;
99 while (ADC2_GC & ADC_GC_CAL) ;
109void adc_etc_init(
int pin1,
int pin2,
int pin3=
NOT_SET) {
110 ADC_ETC_CTRL &= ~(1 << 31);
111 ADC_ETC_CTRL = 0x40000001;
112 ADC_ETC_TRIG0_CTRL = ADC_ETC_TRIG_CTRL_TRIG_CHAIN(
_isset(pin3) ? 2 : 1) ;
116 ADC_ETC_TRIG0_CHAIN_1_0 =
117 ADC_ETC_TRIG_CHAIN_IE1(0) |
118 ADC_ETC_TRIG_CHAIN_B2B1 |
119 ADC_ETC_TRIG_CHAIN_HWTS1(1) |
120 ADC_ETC_TRIG_CHAIN_CSEL1(pin_to_channel[pin1]) |
121 ADC_ETC_TRIG_CHAIN_IE0(1) |
122 ADC_ETC_TRIG_CHAIN_B2B1 |
123 ADC_ETC_TRIG_CHAIN_HWTS0(1) |
124 ADC_ETC_TRIG_CHAIN_CSEL0(pin_to_channel[pin2]);
126 attachInterruptVector(IRQ_ADC_ETC0, adcetc0_isr);
127 NVIC_ENABLE_IRQ(IRQ_ADC_ETC0);
130 ADC_ETC_TRIG0_CHAIN_3_2 =
131 ADC_ETC_TRIG_CHAIN_IE0(2) |
132 ADC_ETC_TRIG_CHAIN_B2B0 |
133 ADC_ETC_TRIG_CHAIN_HWTS0(1) |
134 ADC_ETC_TRIG_CHAIN_CSEL0(pin_to_channel[pin3]);
136 attachInterruptVector(IRQ_ADC_ETC1, adcetc1_isr);
137 NVIC_ENABLE_IRQ(IRQ_ADC_ETC1);
162 Teensy4DriverParams* par = (Teensy4DriverParams*) ((TeensyDriverParams*)driver_params)->additional_params;
164 SIMPLEFOC_DEBUG(
"TEENSY-CS: Low side current sense failed, driver not supported!");
170#ifdef SIMPLEFOC_TEENSY4_ADC_INTERRUPT_DEBUG
187 adc1_init(pins[0], pins[1], pins[2]);
188 adc_etc_init(pins[0], pins[1], pins[2]);
193 .
pins = {pins[0], pins[1], pins[2] },
194 .adc_voltage_conv = (_ADC_VOLTAGE)/(_ADC_RESOLUTION)
201 Teensy4DriverParams* par = (Teensy4DriverParams*) ((TeensyDriverParams*)driver_params)->additional_params;
202 IMXRT_FLEXPWM_t* flexpwm = par->flextimers[0];
203 int submodule = par->submodules[0];
207 sprintf(buff,
"TEENSY-CS: Syncing to FlexPWM: %d, Submodule: %d", flexpwm_to_index(flexpwm), submodule);
211 int xbar_trig_pwm = flexpwm_submodule_to_trig(flexpwm, submodule);
212 if(xbar_trig_pwm<0)
return;
215 xbar_connect((uint32_t)xbar_trig_pwm, XBARA1_OUT_ADC_ETC_TRIG00);
219 flexpwm->SM[submodule].TCTRL = FLEXPWM_SMTCTRL_OUT_TRIG_EN(1<<1);
231#ifdef SIMPLEFOC_TEENSY4_ADC_INTERRUPT_DEBUG
233 xbar_connect (xbar_trig_pwm, XBARA1_OUT_IOMUX_XBAR_INOUT08) ;
234 IOMUXC_GPR_GPR6 |= IOMUXC_GPR_GPR6_IOMUXC_XBAR_DIR_SEL_8 ;
236 CORE_PIN4_CONFIG = 3 ;
238 IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_06 = IOMUXC_PAD_DSE(7) | IOMUXC_PAD_SPEED(3) | IOMUXC_PAD_SRE ;
#define SIMPLEFOC_DEBUG(msg,...)
void * _driverSyncLowSide(void *driver_params, void *cs_params)
#define SIMPLEFOC_CURRENT_SENSE_INIT_FAILED
void * _configureADCLowSide(const void *driver_params, const int pinA, const int pinB, const int pinC=NOT_SET)
float _readADCVoltageLowSide(const int pinA, const void *cs_params)
const int const int const int pinC
GenericCurrentSenseParams * params
return raw_adc *GenericCurrentSenseParams *cs_params adc_voltage_conv