This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
大家好!
我正在从事一个辐射检测项目。 我需要在 C2000 Launchpad 中使用 ADC 对放大器电路(Cremat)的输出进行采样。 我确信代码和连接正常。 当我用示波器测量放大器的输出时、可以看到 γ 峰值、如下图所示。 然而、当我将放大器的输出连接到 C2000的 ADC 输入时、 我可以在图形上看到奇怪的数据。 如果我错过了阻抗匹配等方面的信息、您能给我提供帮助吗?
您好!
请参阅我们的 ADC 输入电路设计应用手册: https://www.ti.com/lit/spract6
我不认为该应用手册中包含的内容会导致您出现错误、因为这通常会导致您的输出低于预期。
您是否确定已正确设置图形? 如果你将 ADC 结果存储在一个缓冲器中、你是否看到大多数样本接近4096?
您是否使用了我们的示例? 如果是、哪一个?
此致、
Ben Collier
您好!
是的、我正在使用缓冲器、正如您所说的、大多数样本4095。 图形应该没问题。 代码附在下面。 我使用 TI 示例作为缓冲器、左侧是我的工作。
//########################################################################### // Author: Halit Durukan //########################################################################### #include "F28x_Project.h" // Device Headerfile and Examples Include File #define ADC_BUF_LEN 1000 //########################################################################### // Global variables used in the project before main function. Declare other // variables in this section of the code. //########################################################################### Uint16 Result = 0; Uint16 AdcBuf[ADC_BUF_LEN]; //########################################################################### // Declare the service routines and functions //########################################################################### interrupt void xint1_isr(void); interrupt void cpu_timer(void); interrupt void adcint1_isr(void); //###################### Beginning of the main code ####################### void main(void) { // Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the F2837xD_SysCtrl.c file. InitSysCtrl(); // Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts DINT; // Initialize the PIE control registers to their default state. // The default state is all PIE interrupts disabled and flags // are cleared. // This function is found in the F2837xD_PieCtrl.c file. InitPieCtrl(); // Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000; // Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). // This will populate the entire table, even if the interrupt // is not used in this example. This is useful for debug purposes. // The shell ISR routines are found in F2837xD_DefaultIsr.c. // This function is found in F2837xD_PieVect.c. InitPieVectTable(); // Enable global Interrupts and higher priority real-time debug events: //EINT; // Enable Global interrupt INTM //ERTM; // Enable Global realtime interrupt DBGM //########################################################################### // User specific code: Your code comes here. //########################################################################### EALLOW; AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4 AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1; //power up the ADC AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1; //Set interrupt pulse positions to late AdcaRegs.ADCCTL2.bit.RESOLUTION = 0; // 12-bit resolution AdcaRegs.ADCCTL2.bit.SIGNALMODE = 0; // Single-ended (12-bit mode only) DELAY_US(1000); //have to delay at least 500 microseconds before using ADC AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0 will convert pin ADCINA0 AdcaRegs.ADCSOC0CTL.bit.ACQPS = 39; //0.2 micro seconds for sampling window (40 x 5ns = 0.2 micro secs) AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 0x01; //trigger on CPU Timer 0 CpuTimer0Regs.PRD.all = 10000 - 1;//Load period value. 20 kHz sampling (50 micro seconds period) CpuTimer0Regs.TPR.bit.TDDR = 0;//Set the prescale value for the timer as 1. CpuTimer0Regs.TCR.bit.TSS = 1;//Stop the timer. CpuTimer0Regs.TCR.bit.TRB = 1;//Reload the timer. CpuTimer0Regs.TCR.bit.TIE = 1;//Enable the Timer0 interrupt in the peripheral level. CpuTimer0Regs.TCR.bit.TSS = 0;//Start the timer. AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0; //EOC0 will set INT1 flag AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 1; //interrupts will be generated //whether the ADCINTFLG is //cleared or not AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag //Redirect the address of the ISR: PieVectTable.ADCA1_INT = &adcint1_isr; PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // Enable PIE Group 1 INT1 ADCA1 IER |= M_INT1;//Enable CPU INT1 includes Xint1 EINT;//Enable global interrupt mask INTM. ERTM; EDIS; for (;;) { } } //###################### End of main code ####################### //#################### Interrupt Service Routines ################# interrupt void adcint1_isr(void) { static Uint16 *AdcBufPtr = AdcBuf; *AdcBufPtr++ = AdcaResultRegs.ADCRESULT0; // Brute Force the circular buffer if (AdcBufPtr == (AdcBuf + ADC_BUF_LEN)) { AdcBufPtr = AdcBuf; } //Result = AdcaResultRegs.ADCRESULT0; GpioDataRegs.GPBTOGGLE.bit.GPIO32 = 1; PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; }
亲爱的本杰明:
我解决了我的问题,但想告诉你,我面临的问题,因为解决方案和问题本身非常有趣:D 我最后一次得到正确的结果是昨天。 从那时起、我就搜索了从产品说明书到论坛的每一个文档。 我正在更改采样窗口(ACQPS)和采样频率、但它根本不起作用。 在无数同样的琐碎之后,我开始觉得像一个白痴,因为它突然工作! 您能猜到发生了什么变化吗? 只是 PC 被拔下:D 出于某种原因,我需要在过去修理我的电脑,现在很清楚,几个电缆或螺钉出来:D 当我插入 PC 并使用 C2000时,它读周期性的噪音有某种原因。