工具/软件:TI C/C++编译器
您好!
我想将 ADC 设置为循环采样、这样会在超过限制一次时产生中断。 已经起作用的是周期性采样并生成中断。 所需的限值中断、我无法运行。 我找不到适合这一目的的样本,我认为文件至少是"简约"。 如果我启用 LIMIT_CHECK (见下面)、我会得到一个中断、但这会持续触发、程序的其余部分会受到这种干扰。 似乎不会清除中断。 欢迎提供任何帮助或提示。
ADCIntEnableEx (ADC_DEVICE_BASE、ADC_INT_DCON_SS0)和 ADCComparatorIntClear (ADC_DEVICE_BASE、ADC_SEQUENCE)之间有何区别?
提前感谢
Micky
#define ADC_SEQUENCE 0
#define ADC_SEQUEST_PRIO 0
#define ADC_DEVICE_BASE ADC0_BASE
#define SYSCTL_PERIPH_ADC_DEVICE SYSCTL_PERIPH_ADC0
#define ADC_INPUT_PIN GPIO_PIN_2
#define ADC_INPUT_PORT GPIO_PORTK_base
#define ADC_OPAMPLING 64
#define ADC_DIGITAL_COMP 0
#define ADC_VAL_LOW 20.
#define ADC_VAL_HIGH 750
#define ADC_COMP_RESET 1.
#define ADC_CHANNEL ADC_CTL_CH19
#define ADC_LAST_STEP 0
#define ADC_INT_SRC INT_ADC0SS0
#define TIMER_ADC3_100ms TIMER_A
#define TIMER_ADC3_10ms TIMER_B
#define ADC_SEQUENCER_LEN 8.
vfnInitAdc(){
SysCtlPeripheralEnable (SYSCTL_Periph_ADC_device); ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL | ADC_CLOCK_RATE_FULL、24); GPIOPinTypeADC (ADC_INPUT_PORT、ADC_INPUT_PIN); IntDisable (ADC_INT_SRC); ADCIntDisable (ADC_DEVICE_BASE、ADC_SEQUENCE); ADCSequenceDisable (ADC_DEVICE_BASE、ADC_SEQUENCE); ADCHardwareOversampleConfigure (ADC_DEVICE_BASE、ADC_OPAMPLING); ADCSequenceConfigure (ADC_DEVICE_BASE、ADC_SEQUENCE、ADC_TRIGGER_TIMER、ADC_SEQUEST_PRIO); #ifdef READ_VALUE ADCSequenceStepConfigure (ADC_DEVICE_BASE、ADC_SEQUENCE、ADC_LAST_STEP、ADC_CHANNEL | ADC_CTL_IE | ADC_CTL_END); #Elif defined (limit_check) ADCSequenceStepConfigure (ADC_DEVICE_BASE、ADC_SEQUENCE、ADC_LAST_STEP、ADC_CHANNEL | ADC_CTL_CMP0 | ADC_CTL_END); #else #error "ADC define read_value or limit_check " #endif ADCComparatorConfigure (ADC_DEVICE_BASE、ADC_DIGITAL_COMP、ADC_COMP_INT_HIGH_HONCE); ADCComparatorRegionSet (ADC_DEVICE_BASE、ADC_DIGITAL_COMP、ADC_VAL_LOW、ADC_VAL_HIGH); ADCComparatorReset (ADC_DEVICE_BASE、ADC_DIGITAL_COMP、ADC_COMP_RESET、ADC_COMP_RESET); ADCIntClear (ADC_DEVICE_BASE、ADC_SEQUENCE); ADCIntClearEx (ADC_DEVICE_BASE、ADC_INT_DCON_SS0); ADCComparatorIntClear (ADC_DEVICE_BASE、ADC_SEQUENCE); ADCIntEnable (ADC_DEVICE_BASE、ADC_SEQUENCE); // //ADCIntEnableEx (ADC_DEVICE_BASE、ADC_INT_DCON_SS0); // ADCComparatorIntEnable (ADC_DEVICE_BASE、ADC_SEQUENCE); IntEnable (ADC_INT_SRC); TimerControlTrigger (timer_app_base、timer_ADCISC_10ms、true); ADCSequenceEnable (ADC_DEVICE_BASE、ADC_SEQUENCE); } volatile UINT32_t UMAX=0; volatile UINT32_t UMIN=4096; void vfnADCseq0Handler (void) { ADCIntClearEx (ADC_DEVICE_BASE、ADC_INT_DCON_SS0); ADCIntClear (ADC_DEVICE_BASE、ADC_SEQUENCE); ADCComparatorIntClear (ADC_DEVICE_BASE、ADC_SEQUENCE); #ifdef read_value 静态 uint32_t auADCValue[8]; ADCSequenceDataGet (ADC_DEVICE_BASE、ADC_SEQUENCE、AUADCValue); //在 auADCValue[0]中的 der interessante Wert ist nun IF (UMAX auADCValue[0]) Umin=auADCValue[0]; #else guLimit=1; ADCComparatorReset (ADC_DEVICE_BASE、ADC_DIGITAL_COMP、ADC_COMP_RESET、ADC_COMP_RESET); //IntDisable (ADC_INT_SRC); #endif }