Я пытаюсь измерить некоторые каналы АЦП с тем же секвенсором. Я взял базу в главе 5 Texas Tiva's ARM Cortex-M4 Workshop. Итак, мой (прерывистая) исходный код работает отлично:Tiva ADC Sequencer с различными источниками шагов
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_ints.h"
#include "driverlib/sysctl.h"
#include "driverlib/adc.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
uint32_t ui32ADC0Value[4];
volatile uint32_t ui32TempAvg;
volatile uint32_t ui32TempValueC;
int main(void) {
SysCtlClockSet(
SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_SYSDIV_5);
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
SysCtlPeripheralReset(SYSCTL_PERIPH_ADC0);
ADCSequenceDisable(ADC0_BASE, 1);
ADCSequenceConfigure(ADC0_BASE, 1, ADC_TRIGGER_PROCESSOR, 0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
GPIOPinTypeADC(GPIO_PORTD_BASE,
GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2);
ADCSequenceStepConfigure(ADC0_BASE, 1, 0, ADC_CTL_TS);
ADCSequenceStepConfigure(ADC0_BASE, 1, 1, ADC_CTL_TS);
ADCSequenceStepConfigure(ADC0_BASE, 1, 2, ADC_CTL_TS);
ADCSequenceStepConfigure(ADC0_BASE, 1, 3,
ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END);
IntEnable(INT_ADC0SS1);
ADCIntEnable(ADC0_BASE, 1);
ADCSequenceEnable(ADC0_BASE, 1);
IntMasterEnable();
while (1) {
ADCProcessorTrigger(ADC0_BASE, 1);
}
}
void ISRHandler(void) {
while (!ADCIntStatus(ADC0_BASE, 1, false)){};
ADCIntClear(ADC0_BASE, 1);
ADCSequenceDataGet(ADC0_BASE, 1, ui32ADC0Value);
ui32TempAvg = ui32ADC0Value[3];
ui32TempValueC = (1475 - ((2475 * ui32TempAvg))/4096)/10;
}
Однако, если я изменю эту часть
ADCSequenceStepConfigure(ADC0_BASE, 1, 0, ADC_CTL_TS);
ADCSequenceStepConfigure(ADC0_BASE, 1, 1, ADC_CTL_TS);
ADCSequenceStepConfigure(ADC0_BASE, 1, 2, ADC_CTL_TS);
ADCSequenceStepConfigure(ADC0_BASE, 1, 3,
ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END);
этой части (так шаги от 0 до 2 читать другие каналы, вместо ADC_CTL_TS) , где мои аналоговые каналы контактный заземлен (поэтому измерение будет читать вблизи нуля):
ADCSequenceStepConfigure(ADC0_BASE, 1, 0, ADC_CTL_CH7);
ADCSequenceStepConfigure(ADC0_BASE, 1, 1, ADC_CTL_CH6);
ADCSequenceStepConfigure(ADC0_BASE, 1, 2, ADC_CTL_CH5);
ADCSequenceStepConfigure(ADC0_BASE, 1, 3,
ADC_CTL_TS | ADC_CTL_IE | ADC_CTL_END);
шаг 3 (где я измерить ADC_CTL_TS) сходит с ума, г угловые значения совершенно некогерентные. Кроме того, при поиске в отладке измерение TS выглядит как «ходьба» по другим шагам, потому что, когда 3 из них близки к 0, другая «движущаяся» намного больше. Это похоже на временное несоосность.
Почему и как его исправить? Благодарю.
Фантастический. Это сработало. – Rego
И в том случае, когда я использую ADC_TRIGGER_ALWAYS, без триггера процессора, где его исправить? – Rego
Я никогда не работал с этим режимом и считаю, что это не очень полезно для этого способа работы. IMO это может быть достаточно для одноканальной выборки или операции DMA (или если вы действительно уверены в ваших таймингах). На самом деле, я считаю, что это будет работать в вашем случае. –