ADC使用技巧 TMS320x2802x, 2803x使用同样的ADC模块,它们有以下功能: ü 内建双采样保持电路的12位ADC ü 同时采样及连续采样 ü 从0 V到3.3V的输入范围,或按VREFHI/VREFLO比例 ü 与系统时钟一致,不需要分频 ü F28027 LaunchPad 有13个通道,多路复用输入 ü 16个SOC可对ADC灵活配置 ü 16个可单独寻址的转换结果寄存器 ü 多种转换触发源(软件触发、PWM触发、外部中断触发、定时
器触发、ADCINT1/2触发) ü 9个中断处理入口 一、SOC原理 F28027的ADC与其它基于序列的ADC不一样,它是基于SOC的。SOC
的配置灵活多样,它可以单独地配置通道、触发源、采样时间等,多个SOC
也可以配置到同一个通道、同一源触发、同一采样时间等;它可单个通道的
单次采样,可连续采样、双通道同时采样。ADC的触发也可以由软件实现。 如果在有CLA的芯片(如F2803x)中使用时,由于SOC与CLA的TASK相
联系,因此需要注意CLA的程序的入口问题。 SOC的配置是通过ADCSOCxCTL寄存器完成的。 二、ADC寄存器配置关系 由于F28系列的CPU中ADC配置非常灵活,带来了方便的同时,也容易
产生混淆。下图是对容易搞混淆的几个寄存器的关系所作的说明: l Software l Timers interrupts l XINT2 SOC l ePWM1-8 SOCA、B
|
三、优先级问题 1、由SOCPRIORITY设置的优先级,为高优先级。 2、优先循环(Round Robin) 在一系列的SOC中,它们首尾相接,形成一个圆,并朝着SOC0、SOC、
……的固定方向循环,与正在转换的SOC最近的下一个SOC的优先级最高。 这种方法很适用于电源、电机控制,因为需要有次序地处理。 四、同时采样 同时采样是在A及B通道中进行的。由硬件结构可见,只能设置一个A通
道及一个B通道同时采样。 F28系列的ADC的也规定,偶数SOC及下一个奇数SOC可以同时采样。
如,SOC0、SOC1可以同时采样,SOC6、SOC7可以同时采样。 同时采样对的触发源的任意一个均可以触发同时采样偶。 同时采样后,A通道先转换,B通道后转换。 五、ADC校准 一般使用TI提供的(*Device_cal)();,将TI预先存储在OTP中的ADC校准数
据拷贝到ADCREFSEL和ADCOFFTRIM寄存器中。 六、ADC的参考源 F28027提供了内部的带隙参考源,也可以由VREFHI/VREFLO引脚接入
外部的参考源。由ADCCTL1寄存器的内外部参考选择位选择。 七、示例 1、打开ADC时钟: SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADC 2、初始化ADC (*Device_cal)(); AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; // Power ADC BG AdcRegs.ADCCTL1.bit.ADCREFPWD = 1; // Power reference AdcRegs.ADCCTL1.bit.ADCPWDN = 1; // Power ADC AdcRegs.ADCCTL1.bit.ADCENABLE = 1; // Enable ADC AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; // Select interal BG 3、配置中断 AdcRegs.INTSEL3N4.bit.INT3E = 1; // for PWM2A AdcRegs.INTSEL3N4.bit.INT3SEL = 3; // EOC3 AdcRegs.INTSEL3N4.bit.INT3CONT = 1; 4、配置SOC AdcRegs.SOCPRICTL.all = 0; // SOC0 is first SOC AdcRegs.ADCSAMPLEMODE.all = 0x1B; // Simultaneous sampling enable For SOC0,2,6,8 AdcRegs.ADCINTSOCSEL1.all = 0; // Determined by the ADCSOCxCTL AdcRegs.ADCINTSOCSEL2.all = 0; // Determined by the ADCSOCxCTL AdcRegs.ADCSOCFRC1.all = 0; // trigger source AdcRegs.ADCSOC0CTL.bit.ACQPS = 6; // Sample window is 7 cycles AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 0x0d; // ePWM5A, ADCSOCA AdcRegs.ADCSOC0CTL.bit.CHSEL = 2; // ADCINA2 -- current |