配置了三种模式,为单次模式,连续模式和DMA传输 单次模式是调用一次采集函数,在指定的某一个AD端口采集,用到的时候在去采样 连续模式是连续转换多个通道,采用级联模式,采用16路AD通道的值 DMA传输时AD采样的值直接通过DMA传输到内存中,不需要要CPU干预,持续采样,放到内存,需要用到数据的时候去读取相应的存储区即可。 级联顺序转换 //级联顺序转换
void Ad_Contrun_Init(void)
{
EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK
EDIS;
InitAdc(); // For this example, init the ADC
// Specific ADC setup for this example:
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Sequential mode: Sample rate = 1/[(2+ACQ_PS)*ADC //clock in ns]
// If Simultaneous mode enabled: Sample rate = 1/[(3+ACQ_PS)*ADC //clock in ns]
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 1 级联模式
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x1; //允许向CPU发出中断请求
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1;
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // 连续模式
AdcRegs.ADCTRL3.bit.SMODE_SEL= 0; // 顺序采样
AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; // Enable Sequencer override feature
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0xF; // 要转换的通道数
AdcRegs.ADCCHSELSEQ1.all = 0x3210; // Initialize all ADC channel
AdcRegs.ADCCHSELSEQ2.all = 0x7654; //每个通道对应相应的结果寄存器
AdcRegs.ADCCHSELSEQ3.all = 0xBA98;
AdcRegs.ADCCHSELSEQ4.all = 0xFEDC;
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
DELAY_US(100);
}
//级联顺序转换,根据初始化的通道数可以改变相应要获取的结果寄存器
void Ad_Contrun_Get(Uint16 *value)
{
value[0] = ( (AdcRegs.ADCRESULT0)>>4);
value[1] = ( (AdcRegs.ADCRESULT1)>>4);
value[2] = ( (AdcRegs.ADCRESULT2)>>4);
value[3] = ( (AdcRegs.ADCRESULT3)>>4);
value[4] = ( (AdcRegs.ADCRESULT4)>>4);
value[5] = ( (AdcRegs.ADCRESULT5)>>4);
value[6] = ( (AdcRegs.ADCRESULT6)>>4);
value[7] = ( (AdcRegs.ADCRESULT7)>>4);
value[8] = ( (AdcRegs.ADCRESULT8)>>4);
value[9] = ( (AdcRegs.ADCRESULT9)>>4);
value[10] = ( (AdcRegs.ADCRESULT10)>>4);
value[11] = ( (AdcRegs.ADCRESULT11)>>4);
value[12] = ( (AdcRegs.ADCRESULT12)>>4);
value[13] = ( (AdcRegs.ADCRESULT13)>>4);
value[14] = ( (AdcRegs.ADCRESULT14)>>4);
value[15] = ( (AdcRegs.ADCRESULT15)>>4);
}
main函数中调用 Uint16 ad[16]={0};
... ... Ad_Contrun_Init(); //AD连续顺序转换
while(1) { .... Ad_Contrun_Get(ad); // 读取AD值
.... ..... .. }
|