Hello all,
I am trying to trigger ADC0 of the Teensy 3.6 with the PDB. I want 2 measurements per PWM period, so I have used FTM3 as a trigger input to PDB0 with 2 pretriggers. The delay of PDB0_CH0DLY0 is 0 while the delay of PDB0_CH0DLY1 is MOD/2.
This is all working correctly. However, I have a weird issue. ADC0 always makes 2 conversions for each trigger, so I get 4 measurements, 2 of which are redundant. To put it simply, ADC0_SC1A and ADC0_SC1B always convert together for each pretrigger.
I have the code of FTM3, PDB and ADC0 below respectively. [Note: MOD value is equal to 599 while Phi is equal to 200.]
FTM3:
void initFTM3(void) {
SIM_SCGC3 |= 0x02000000;
FTM3_SC = 0x00;
FTM3_CONF = 0xC0;
FTM3_FMS = 0x00;
FTM3_MODE |= 0x05;
FTM3_C0SC = 0x28;
FTM3_C1SC = 0x28;
FTM3_C2SC = 0x28;
FTM3_C3SC = 0x28;
FTM3_C4SC = 0x68;
FTM3_C5SC = 0x28;
FTM3_COMBINE = 0x030303;
FTM3_COMBINE |= 0x1010;
FTM3_COMBINE |= 0x202020;
FTM3_DEADTIME = 0x00;
FTM3_CNT = 0x00;
FTM3_CNTIN = 0x00;
FTM3_MOD = MOD;
FTM3_SYNC = 0x02;
FTM3_SC = 0x28;
PORTD_PCR0 = 0x400;
PORTD_PCR1 = 0x400;
PORTD_PCR2 = 0x400;
PORTD_PCR3 = 0x400;
PORTC_PCR8 = 0x300;
PORTC_PCR9 = 0x300;
FTM3_C0V = (MOD+1)/2 - Phi;
FTM3_C1V = (MOD+1)/2;
FTM3_C2V = 0;
FTM3_C3V = (MOD+1) - Phi;
FTM3_C4V = ((MOD+1) - Phi)/2 - 8;
FTM3_C5V = (2*(MOD+1) - Phi)/2 - 8;
FTM3_EXTTRIG |= 0x04;
asm("nop");
}
PDB:
void initPDB0(void) {
SIM_SCGC6 |= 0x400000;
PDB0_CNT = 0;
PDB0_MOD = MOD;
PDB0_CH0C1 |= 0x303;
PDB0_CH0DLY0 = 0;
PDB0_CH0DLY1 = (MOD+1)/2;
PDB0_SC = 0xBA1;
}
ADC0:
void initADC0(void) {
SIM_SCGC6 |= 0x08000000;
SIM_SOPT7 = 0x00;
ADC0_CFG1 = 0x04;
ADC0_CFG2 = 0x04;
ADC0_SC2 = 0x40;
ADC0_SC3 = 0x00;
ADC0_SC1A = 0x4C;
ADC0_SC1B = 0x51;
NVIC_SET_PRIORITY(IRQ_ADC0, 128);
NVIC_CLEAR_PENDING(IRQ_ADC0) |= 1<<7;
NVIC_ISER1 |= 1<<7;
NVIC_ENABLE_IRQ(IRQ_ADC0);
asm("cpsie i");
}
Below is the ISR of ADC0 to read measurements from the results registers ADC0_RA and ADC0_RB.
void adc0_isr(void) {
bool control = true;
if (ADC0_SC1A & 0xCC) {
V_analog[0] = ADC0_RA;
V_o = VoutScale*V_analog[0];
operation();
control = !control;
}
if (ADC0_SC1B & 0xD1) {
V_analog[0] = ADC0_RB;
V_in = VinScale*V_analog[0];
control = !control;
}
asm("nop");
}
The value of the variable control is always TRUE, which means it is toggled twice for each pretrigger which means ADC0_SC1A and ADC0_SC1B convert twice. I want just one conversion per pretrigger.
Does anyone know why this happens? Is there something I missed in the initialization or if I have a mistake in the code?
Thanks in advance.
Hi,
Have a great day,
TIC
-------------------------------------------------------------------------------
Note:
- If this post answers your question, please click the "Mark Correct" button. Thank you!
- We are following threads for 7 weeks after the last post, later replies are ignored
Please open a new thread and refer to the closed one, if you have a related question at a later point in time.
-------------------------------------------------------------------------------
Hello,
thank you very much. This helped with the correct calling of the result registers.
However, I think two conversions are still happening when the PDB triggers the ADC the first time in the period.
To explain why I think it is:
Hope this explains what I am trying to say.
Regards.