📄 dsp281x_adc04u.c
字号:
/* ==================================================================================
File name: DSP281x_ADC04U.C
Originator: Digital Control Systems Group
Texas Instruments
Description: This file contains source for the F281X general purpose
4 conversions ADC driver for unipolar signals
Target: TMS320F281x family
=====================================================================================
History:
-------------------------------------------------------------------------------------
04-15-2005 Version 3.20: Using DSP281x v. 1.00 or higher
----------------------------------------------------------------------------------*/
#include "DSP281x_Device.h"
#include "DSP281x_ADC04U.h"
#define CPU_CLOCK_SPEED 6.6667L // for a 150MHz CPU clock speed
#define ADC_usDELAY 5000L
#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_CLOCK_SPEED) - 9.0L) / 5.0L)
extern void DSP28x_usDelay(unsigned long Count);
void F281X_adc04u_drv_init(ADCVALS *p)
{
DELAY_US(ADC_usDELAY);
AdcRegs.ADCTRL1.all = ADC_RESET_FLAG; // Reset the ADC Module
asm(" NOP ");
asm(" NOP ");
AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3; // Power up bandgap/reference circuitry
DELAY_US(ADC_usDELAY); // Delay before powering up rest of ADC
AdcRegs.ADCTRL3.bit.ADCPWDN = 1; // Power up rest of ADC
AdcRegs.ADCTRL3.bit.ADCCLKPS = 6; // Set up ADCTRL3 register
DELAY_US(ADC_usDELAY);
AdcRegs.ADCTRL1.all = ADCTRL1_INIT_STATE_UNIPOLAR; // Set up ADCTRL1 register
AdcRegs.ADCTRL2.all = ADCTRL2_INIT_STATE_UNIPOLAR; // Set up ADCTRL2 register
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 3; // Specify four conversions
AdcRegs.ADCCHSELSEQ1.all = p->ChSelect; // Configure channel selection
EvaRegs.GPTCONA.bit.T1TOADC = 1; // Set up EV Trigger with Timer1 UF
}
void F281X_adc04u_drv_read(ADCVALS *p)
{
int16 DatQ15;
int32 Tmp;
// Wait until ADC conversion is completed
while (AdcRegs.ADCST.bit.SEQ1_BSY == 1)
{};
DatQ15 = (AdcRegs.ADCRESULT0>>1)&0x7FFF; // Convert raw result to Q15 (unipolar signal)
Tmp = (int32)p->Ch1Gain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->Ch1Out = (int16)(Tmp>>13); // Convert Q28 to Q15
DatQ15 = (AdcRegs.ADCRESULT1>>1)&0x7FFF; // Convert raw result to Q15 (unipolar signal)
Tmp = (int32)p->Ch2Gain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->Ch2Out = (int16)(Tmp>>13); // Convert Q28 to Q15
DatQ15 = (AdcRegs.ADCRESULT2>>1)&0x7FFF; // Convert raw result to Q15 (unipolar signal)
Tmp = (int32)p->Ch3Gain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->Ch3Out = (int16)(Tmp>>13); // Convert Q28 to Q15
DatQ15 = (AdcRegs.ADCRESULT3>>1)&0x7FFF; // Convert raw result to Q15 (unipolar signal)
Tmp = (int32)p->Ch4Gain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->Ch4Out = (int16)(Tmp>>13); // Convert Q28 to Q15
AdcRegs.ADCTRL2.all |= 0x4040; // Reset the sequence
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -