#include "IQmathLib.h"
#include "DSP281x_Device.h"
#include "f281xadc04b.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);
extern Uint16 Iuflag;
extern Uint16 Ivflag;
void F281X_adc04b_drv_init(ADCVALSB *p)
{
DELAY_US(ADC_usDELAY);
AdcRegs.ADCTRL1.all = ADC_RESET_FLAG; // Reset the ADC Module 第14位总复位位写1后自动清零.
asm(" NOP ");//ADC的复位需要3个时钟周期,这期间ADC的控制寄存器不能被修改。
asm(" NOP ");
AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3; // Power up bandgap/reference circuitry Delay time for band gap reference to be stable
DELAY_US(ADC_usDELAY); // Delay before powering up rest of ADC 7--10ms
//调用延时1us函数,此处延时5000us
AdcRegs.ADCTRL3.bit.ADCPWDN = 1; // Power up rest of ADC
AdcRegs.ADCTRL3.bit.ADCCLKPS = 6; // Set up ADCTRL3 register
// ADCLK=HSPCLK/[12*(ADCTRL1[7]+1)]=12.5MHz
DELAY_US(ADC_usDELAY); //调用延时1us函数,此处延时5000us
AdcRegs.ADCTRL1.all = ADCTRL1_INIT_STATE_BIPOLAR; // Set up ADCTRL1 register
// 采样脉冲宽度(SOC)=1+1个ADCLK,不分频,级联模式,排序器的启动停止模式(转换完第一个序列就等待下一个触发信号)。
AdcRegs.ADCTRL2.all = ADCTRL2_INIT_STATE_BIPOLAR; // Set up ADCTRL2 register
//允许事件管理器A触发启动SEQ1
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 14; // Specify four conversions
AdcRegs.ADCCHSELSEQ1.all = 0x4343; // Configure channel selection
// 0x9810
AdcRegs.ADCCHSELSEQ2.all = 0x6543;
AdcRegs.ADCCHSELSEQ3.all = 0x6565;
AdcRegs.ADCCHSELSEQ4.all = 0x2222;
EvaRegs.GPTCONA.bit.T1TOADC = 1; // Set up EV Trigger with Timer1 UF
//设置下溢中断启动ADC
}
void F281X_adc04b_drv_read(ADCVALSB *p)
{
int16 DatQ15;
long Tmp;
// double temp;
// Wait until ADC conversion is completed
while (AdcRegs.ADCST.bit.SEQ1_BSY == 1)
{};
if(AdcRegs.ADCRESULT0>=AdcRegs.ADCRESULT2&&AdcRegs.ADCRESULT0<=AdcRegs.ADCRESULT4||AdcRegs.ADCRESULT0>=AdcRegs.ADCRESULT4&&AdcRegs.ADCRESULT0<=AdcRegs.ADCRESULT2)
DatQ15 = AdcRegs.ADCRESULT0-0x7FF0;
else if(AdcRegs.ADCRESULT2>=AdcRegs.ADCRESULT0&&AdcRegs.ADCRESULT2<=AdcRegs.ADCRESULT4||AdcRegs.ADCRESULT2>=AdcRegs.ADCRESULT4&&AdcRegs.ADCRESULT2<=AdcRegs.ADCRESULT0)
DatQ15 = AdcRegs.ADCRESULT2-0x7FF0;
else if(AdcRegs.ADCRESULT4>=AdcRegs.ADCRESULT0&&AdcRegs.ADCRESULT4<=AdcRegs.ADCRESULT2||AdcRegs.ADCRESULT4>=AdcRegs.ADCRESULT2&&AdcRegs.ADCRESULT4<=AdcRegs.ADCRESULT0)
DatQ15 = AdcRegs.ADCRESULT4-0x7FF0;
// DatQ15 = AdcRegs.ADCRESULT0-0x7FF0; //^0x8000; // Convert raw result to Q15 (bipolar signal)
Tmp = (int32)p->Ch1Gain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->Ch1Out = (int16)(Tmp>>13); // Convert Q28 to Q15
// p->Ch1Out -= p->Ch1Offset; // Add offset
if(AdcRegs.ADCRESULT1>=AdcRegs.ADCRESULT3&&AdcRegs.ADCRESULT1<=AdcRegs.ADCRESULT5||AdcRegs.ADCRESULT1>=AdcRegs.ADCRESULT5&&AdcRegs.ADCRESULT1<=AdcRegs.ADCRESULT3)
DatQ15 = AdcRegs.ADCRESULT1-0x7FF0;
else if(AdcRegs.ADCRESULT3>=AdcRegs.ADCRESULT1&&AdcRegs.ADCRESULT3<=AdcRegs.ADCRESULT5||AdcRegs.ADCRESULT3>=AdcRegs.ADCRESULT5&&AdcRegs.ADCRESULT3<=AdcRegs.ADCRESULT1)
DatQ15 = AdcRegs.ADCRESULT3-0x7FF0;
else if(AdcRegs.ADCRESULT5>=AdcRegs.ADCRESULT1&&AdcRegs.ADCRESULT5<=AdcRegs.ADCRESULT3||AdcRegs.ADCRESULT5>=AdcRegs.ADCRESULT3&&AdcRegs.ADCRESULT5<=AdcRegs.ADCRESULT1)
DatQ15 = AdcRegs.ADCRESULT5-0x7FF0;
// DatQ15 = AdcRegs.ADCRESULT1-0x7FF0; //^0x8000; // Convert raw result to Q15 (bipolar signal)
Tmp = (int32)p->Ch2Gain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->Ch2Out = (int16)(Tmp>>13); // Convert Q28 to Q15
// p->Ch2Out -= p->Ch2Offset; // Add offset
if(AdcRegs.ADCRESULT6>=AdcRegs.ADCRESULT8&&AdcRegs.ADCRESULT6<=AdcRegs.ADCRESULT10||AdcRegs.ADCRESULT6>=AdcRegs.ADCRESULT10&&AdcRegs.ADCRESULT6<=AdcRegs.ADCRESULT8)
DatQ15 = AdcRegs.ADCRESULT6;
else if(AdcRegs.ADCRESULT8>=AdcRegs.ADCRESULT6&&AdcRegs.ADCRESULT8<=AdcRegs.ADCRESULT10||AdcRegs.ADCRESULT8>=AdcRegs.ADCRESULT10&&AdcRegs.ADCRESULT8<=AdcRegs.ADCRESULT6)
DatQ15 = AdcRegs.ADCRESULT8;
else if(AdcRegs.ADCRESULT10>=AdcRegs.ADCRESULT6&&AdcRegs.ADCRESULT10<=AdcRegs.ADCRESULT8||AdcRegs.ADCRESULT10>=AdcRegs.ADCRESULT8&&AdcRegs.ADCRESULT10<=AdcRegs.ADCRESULT6)
DatQ15 = AdcRegs.ADCRESULT10;
// DatQ15 = AdcRegs.ADCRESULT2^0x8000; // Convert raw result to Q15 (bipolar signal)
DatQ15 = DatQ15 - p->Ch3Offset; // Add offset //电路决定的抬高电压的偏压值-_IQ15(1.291930541)
// if(DatQ15<_IQ15(0))
// Iuflag=1;
Tmp = (int32)p->Ch3Gain*(int32)DatQ15;
p->Ch3Out = (int32)(Tmp>>13); // Convert Q28 to Q15
// p->Ch3Out=_IQmpyIQX(p->Ch3Gain,13,DatQ15,15);
if(AdcRegs.ADCRESULT7>=AdcRegs.ADCRESULT9&&AdcRegs.ADCRESULT7<=AdcRegs.ADCRESULT11||AdcRegs.ADCRESULT7>=AdcRegs.ADCRESULT11&&AdcRegs.ADCRESULT7<=AdcRegs.ADCRESULT9)
DatQ15 = AdcRegs.ADCRESULT7;
else if(AdcRegs.ADCRESULT9>=AdcRegs.ADCRESULT7&&AdcRegs.ADCRESULT9<=AdcRegs.ADCRESULT11||AdcRegs.ADCRESULT9>=AdcRegs.ADCRESULT11&&AdcRegs.ADCRESULT9<=AdcRegs.ADCRESULT7)
DatQ15 = AdcRegs.ADCRESULT9;
else if(AdcRegs.ADCRESULT11>=AdcRegs.ADCRESULT7&&AdcRegs.ADCRESULT11<=AdcRegs.ADCRESULT9||AdcRegs.ADCRESULT11>=AdcRegs.ADCRESULT9&&AdcRegs.ADCRESULT11<=AdcRegs.ADCRESULT7)
DatQ15 = AdcRegs.ADCRESULT11;
// DatQ15 = AdcRegs.ADCRESULT3^0x8000; // Convert raw result to Q15 (bipolar signal)
DatQ15 = DatQ15 - p->Ch4Offset; // Add offset
Tmp = (int32)p->Ch4Gain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->Ch4Out = (int32)(Tmp>>13); // Convert Q28 to Q15
// p->Ch4Out =_IQmpyIQX(p->Ch4Gain,13,DatQ15,15);
if(AdcRegs.ADCRESULT12>=AdcRegs.ADCRESULT13&&AdcRegs.ADCRESULT12<=AdcRegs.ADCRESULT14||AdcRegs.ADCRESULT12>=AdcRegs.ADCRESULT14&&AdcRegs.ADCRESULT12<=AdcRegs.ADCRESULT13)
DatQ15 = AdcRegs.ADCRESULT12;
else if(AdcRegs.ADCRESULT13>=AdcRegs.ADCRESULT12&&AdcRegs.ADCRESULT13<=AdcRegs.ADCRESULT14||AdcRegs.ADCRESULT13>=AdcRegs.ADCRESULT14&&AdcRegs.ADCRESULT13<=AdcRegs.ADCRESULT12)
DatQ15 = AdcRegs.ADCRESULT13;
else if(AdcRegs.ADCRESULT14>=AdcRegs.ADCRESULT12&&AdcRegs.ADCRESULT14<=AdcRegs.ADCRESULT13||AdcRegs.ADCRESULT14>=AdcRegs.ADCRESULT13&&AdcRegs.ADCRESULT14<=AdcRegs.ADCRESULT12)
DatQ15 = AdcRegs.ADCRESULT14;
// DatQ15 = AdcRegs.ADCRESULT3^0x8000; // Convert raw result to Q15 (bipolar signal)
Tmp = (int32)p->Ch5Gain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15
p->Ch5Out = (int32)(Tmp>>13); // Convert Q28 to Q15
// p->Ch5Out += p->Ch5Offset; // Add offset
AdcRegs.ADCTRL2.all |= 0x4040; // Reset the sequence
}
请问这段程序中并没有设置顺序采样,我能默认他为顺序采样吗,另外为什么转换结果要和其他两个结果比较,如:AdcRegs.ADCRESULT14>=AdcRegs.ADCRESULT12&&AdcRegs.ADCRESULT14<=AdcRegs.ADCRESULT13||AdcRegs.ADCRESULT14>=AdcRegs.ADCRESULT13&&AdcRegs.ADCRESULT14<=AdcRegs.ADCRESULT12)
前两个采样结果p->Ch1Out, p->Ch2Out是采样电机的两相电流信号的sin 和cos信号从而计算出电角度,后面两个结果p->Ch3Out, p->Ch4Out是用于电机clark变换的(电机是永磁同步电机),p->Ch5Out这个结果是母线电流值。
另外还有
另外我这是采样电机的电流值用于电机的svpwm控制,程序中设置
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 14; // Specify four conversions
AdcRegs.ADCCHSELSEQ1.all = 0x4343; // Configure channel selection
// 0x9810
AdcRegs.ADCCHSELSEQ2.all = 0x6543;
AdcRegs.ADCCHSELSEQ3.all = 0x6565;
AdcRegs.ADCCHSELSEQ4.all = 0x2222;
是怎么样的一种采样过程呢,跪求指导