We are trying to figure out how to configure the HSADC microcontroller LPC4370. We took the project periph_hsadc as a basis. When clocking ADC from MAINPLL and USBPLL everything works fine, but when using PLLAUDIO tuned to 80 MHz, the ADC reads some noise that is not related to the input signal. How can we solve this problem? Thanks.
Here is our code:
static void HsadcInit(void) {
uint32_t freqHSADC = 0;
setupClock(HSADC_CLOCK_RATE);
Chip_HSADC_Init(LPC_ADCHS);
freqHSADC = Chip_HSADC_GetBaseClockRate(LPC_ADCHS);
DEBUGOUT_S("HSADC sampling rate = %dKHz\r\n", freqHSADC / 1000);
Chip_HSADC_SetupFIFO(LPC_ADCHS, 8, false);
Chip_HSADC_ConfigureTrigger(LPC_ADCHS, HSADC_CONFIG_TRIGGER_SW,
HSADC_CONFIG_TRIGGER_RISEEXT, HSADC_CONFIG_TRIGGER_NOEXTSYNC,
HSADC_CHANNEL_ID_EN_ADD, 0x90);
Chip_HSADC_SetACDCBias(LPC_ADCHS, 0, HSADC_CHANNEL_DCBIAS, HSADC_CHANNEL_NODCBIAS);
Chip_HSADC_SetThrLowValue(LPC_ADCHS, 0, ((HSADC_MAX_SAMPLEVAL * 1) / 10));
Chip_HSADC_SetThrHighValue(LPC_ADCHS, 0, ((HSADC_MAX_SAMPLEVAL * 9) / 10));
Chip_HSADC_SetThrLowValue(LPC_ADCHS, 1, ((HSADC_MAX_SAMPLEVAL * 4) / 10));
Chip_HSADC_SetThrHighValue(LPC_ADCHS, 1, ((HSADC_MAX_SAMPLEVAL * 6) / 10));
Chip_HSADC_SetPowerSpeed(LPC_ADCHS, false);
Chip_HSADC_EnablePower(LPC_ADCHS);
Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 0, (HSADC_DESC_CH(0) |
HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(0x95) | HSADC_DESC_THRESH_A |
HSADC_DESC_RESET_TIMER));
Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 1, (HSADC_DESC_CH(0) |
HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(0x01) | HSADC_DESC_THRESH_A |
HSADC_DESC_RESET_TIMER));
Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 2, (HSADC_DESC_CH(0) |
HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(0x01) | HSADC_DESC_THRESH_A |
HSADC_DESC_RESET_TIMER));
Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 3, (HSADC_DESC_CH(0) |
HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(0x01) | HSADC_DESC_THRESH_A |
HSADC_DESC_RESET_TIMER));
Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 4, (HSADC_DESC_CH(0) |
HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(0x01) | HSADC_DESC_THRESH_A |
HSADC_DESC_RESET_TIMER));
Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 5, (HSADC_DESC_CH(0) |
HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(0x01) | HSADC_DESC_THRESH_A |
HSADC_DESC_RESET_TIMER));
Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 6, (HSADC_DESC_CH(0) |
HSADC_DESC_BRANCH_NEXT | HSADC_DESC_MATCH(0x01) | HSADC_DESC_THRESH_A |
HSADC_DESC_RESET_TIMER));
Chip_HSADC_SetupDescEntry(LPC_ADCHS, 0, 7, (HSADC_DESC_CH(0) | HSADC_DESC_BRANCH_NEXT
| HSADC_DESC_HALT | HSADC_DESC_INT
| HSADC_DESC_MATCH(1) | HSADC_DESC_THRESH_A | HSADC_DESC_RESET_TIMER));
Chip_HSADC_EnableInts(LPC_ADCHS, 0, (HSADC_INT0_DSCR_DONE));
NVIC_EnableIRQ(ADCHS_IRQn);
Chip_HSADC_UpdateDescTable(LPC_ADCHS, 0);
timer_setup();
}
static void setupClock(uint32_t rate)
{
SetUpPLL0audio(100, 15, 1);
Chip_Clock_SetBaseClock(CLK_BASE_ADCHS, CLKIN_AUDIOPLL, true, false);
uint32_t frequency = ClockSourceFreqMeasure(CLKIN_AUDIOPLL);
DEBUGOUT_S("Measured frequency=%d\r\n", frequency);
Chip_Clock_EnableOpts(CLK_ADCHS, true, true, 1);
}
void SetUpPLL0audio(uint32_t msel, uint32_t nsel, uint32_t psel)
{
LPC_CGU->PLL[CGU_AUDIO_PLL].PLL_CTRL = (6 << 24)
| _BIT(0);
LPC_CGU->PLL[CGU_AUDIO_PLL].PLL_NP_DIV = (NDEC_Encode(nsel) << 12) | PDEC_Encode(psel);
LPC_CGU->PLL[CGU_AUDIO_PLL].PLL_MDIV = MDEC_Encode(msel);
LPC_CGU->PLL[CGU_AUDIO_PLL].PLL_CTRL = (6 << 24)
| (6<< 12);
while (!(LPC_CGU->PLL[CGU_AUDIO_PLL].PLL_STAT & 1));
LPC_CGU->PLL[CGU_AUDIO_PLL].PLL_CTRL |= (1<<4);
}