工具/软件:Code Composer Studio
您好,
我正在使用 CCs7、C2000 V3和最新版本的编译器。 我使用 Launchpad。 我使用"优化级别4"
我不理解 ADC 的时间结果。 我的程序即将结束
测试1) 、其中:
- acqs = 14、
- SYSCLK = 200MHz、
- ADCCLK = 50MHz (AdcaRegs.ADCCTL2.bit.prescale = 6)
我测量的执行时间接近74ns。
测试2) 、其中:
- acqs = 1、
- SYSCLK = 200MHz、
- ADCCLK = 50MHz (AdcaRegs.ADCCTL2.bit.prescale = 6)
我测量的执行时间接近77ns。
测试3) 、其中:
- acqs = 35、
- SYSCLK = 200MHz、
- ADCCLK = 50MHz (AdcaRegs.ADCCTL2.bit.prescale = 6)
我几乎交替测量74和160ns 的执行时间。
测量技术:
1)计划:
GPIO => 1.
代码
GPIO => 0
2) 2)"时间代码"=时间测量- GPIO 时间
GPIO 时间= 160/170ns
我的问题是
- 为什么我测量近75ns?
I Expected for I) (14+1)* SYSCLK + tlat = 290ns 、Tlat = 43 * 5ns = 215ns
2.我的衡量标准是“采集窗口持续时间”?
我预期:<<“采集窗口持续时间”+转换>> 因为我有:
AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;
我的计划:
/* cpu1.c -创建日期:1个服务器。 2018 -作者:Haris */
//包含
#include "F28x_Project.h"
#include "driverlib.h"
#include "math.h"
void ConfigureADC (void);
void SetupADCSoftware (void);
void Init_adc_jj (void);
//void APWM1 (void);
_interrupt void CPU_timer0_ISR (void);
_interrupt void CPU_Timer1_ISR (void);
_interrupt void CPU_timer2_ISR (void);
void PWM1_init (float duty1、int 分辨率);
void PWM1 (float duty1);
int i = 0;
//变量 jj
uint16分辨率= 200;//200 => PWM = 500kHz
uint16 AdcResult[4];
uint16 RapportCyclique;
int Flag_Timer1=0;
// PWM 优化
uint32_t 寄存器偏移;
uint16 Rapport =0;
uint16 acqps;
int main (空)
{
/***初始化 du Systeme et des PERIPHERIQUES***** /
InitSysCtrl();
InitGpio();
InitPeripheralClocks();//初始化 DES 时钟
InitFlash();//Initialize la RAM。
FlashOff ();//Desactive la RAM。
ServiceDoG();//初始化 DES Dog。
InitEPwm1Gpio();//Initialize les GPIO pour generer un PWM sur la sortie 1.
Dint;//清除所有中断
InitPieCtrl();
InitPieVectTable();
InitSysPll (INT_OSC2、IMULT_20、FULT_0、PLLCLK_By_1);
//INT_OSC2=>10MHz (= fOSCCLK)
//fPLLSYSCLK = fOSCCLK *(SYSPLLMULT.IMULT + SYSPLLMULT.FAULT)/SYSCLKDIVSEL.PLLSYSCLKDIV
//IMULT_X:乘法器 de r é quence (reglage de base 35)
//FMULT_X:多路复用器(*0/*0.25/*0.5/*0.75)
//PLLCLK_BY_X:PLLSYSCLKDIV:频率(最小1)
EALLOW;
ClkCfgRegs.PERCLKDIVSEL.BIT.EPWMCLKDIV = 1;//CLKDIV 会使频率下降
EDIS;
IER = 0x0000;//禁用 CPU 中断并清除所有 CPU 中断标志:
IFR = 0x0000;
//voir prog cpu_timers_cpu01覆铜和 d'info
EALLOW; //这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.TIMER0_INT =&CPU_timer0_ISR;
PieVectTable.Timer1_INT =&CPU_Timer1_ISR;
PieVectTable.TIMER2_INT =&CPU_timer2_ISR;
EDIS; //这是禁止写入 EALLOW 受保护寄存器所必需的
InitCpuTimer();
//
//将 CPU 定时器0、1和2配置为每秒中断一次:
// 200MHz CPU 频率,1秒周期(以 uSeconds 为单位)
//
ConfigCpuTimer (&CpuTimer0、201、100000);// 201 est legerement plus proche que 200 de 1sec
ConfigCpuTimer (&CpuTimer1、201、10);
ConfigCpuTimer (&CpuTimer2、201、1000000);
CpuTimer0Regs.TCR.ALL = 0x4000;
CpuTimer1Regs.TCR.ALL = 0x4000;
CpuTimer2Regs.TCR.ALL = 0x4000;
IER |= M_INT1;//连接 LES 计时器到中断
IER |= M_INT13;//timer 1 connecté à INT13
IER |= M_INT14;
PieCtrlRegs.PIEIER1.bit.INTx7=1;//自动 TINT0组1中断7
EINT; //启用全局中断 INTM
ERTM; //启用全局实时中断 DBGM
init_adc_jjj ();
PWM1_INIT (150、200);//初始化 du PWM1A
GPIO_SetupPinOptions (22、1、GPIO_PULLUP);
// asm (" ESTOP0");//停止程序
while (1){
if (Flag_Timer1=1){
GPIO_WritePin (22、1);
// AdcRegs.ADCSOCFRC1.all = 0x0001;//强制 SOC 用于对 SOC 进行重新校准 A (1= SOC0、2= SOC1、3= S0C1和 SOC2)
// AdcbRegs.ADCSOCFRC1.all = 0x0001;//强制 SOC 用于对 SOC 进行分频、使其复位 B (1= SOC0、2= SOC1、3= S0C1和 SOC2)
while (AdcaRegs.ADCINTFlG.bit.ADCINT2 =0);// Flag INT2 :fin d'aquisiton pour le SOC0: ADCA0
AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;
// while (AdcbRegs.ADCINTFlG.bit.ADCINT1 =0);//标志 INT 1:fin d'aquisiton pour le SOC0: ADCB3
//AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
// delay_US (0.290);
AdcResult[0]= AdcResultRegs.ADCRESULT0;//依赖 SOC0 du Groupe A、缓冲存储器
//AdcResult[2]= AdcbqResultRegs.ADCRESULT0;//依赖 SOC0 du Groupe B,缓冲存储
GPIO_WritePin (22、0);
Flag_Timer1 = 0;
asm (" ESTOP0");
}
}//fin Bouv无限制
//返回0;// inutile avec la cle Bouvini
}
_interrupt void CPU_timer0_ISR (void)
{ CpuTimer0.InterruptCount++;
//
//确认此中断以从组1接收更多中断
//
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}
//
// CPU_Timer1_ISR - CPU Timer1 ISR
//
_interrupt void CPU_Timer1_ISR (void)
{
CpuTimer1.InterruptCount++;
Flag_Timer1 = 1;
}
//
// cpu_timer2_ISR CPU Timer2 ISR
//
_interrupt void CPU_timer2_ISR (void)
{
CpuTimer2.InterruptCount++;
}
void PWM1_init (float duty1、int resolution)// LE PWM à une p é riode trop longue hors de du changement de rapport cyque si on ne fait pas
//多路信号分离 PWM1_init et PWM1 (某些 reglage reste 配置)
{
// 浮点 Rapport;
// Rapport = 1750 - duty1;// Reglage Haris
rapport = resolution - duty1;
/***定义 GPIO a utilizer **/
GPIO_SetupPinOptions (0、1、GPIO_PULLUP);
/**CARACTERISTIQUE DE LA PWM***** /
//ePWM_base selectionne quelle PWM on veut、第1条
ePWM_setTimeBasePeriod (EPWM1_base、分辨率);//<-- 1750 de 分辨率
ePWM_setTimeBasePeriod (EPWM1_base、(resolution));// resolution -1 comprendre pourquoi le -1 est (vrailevitile?) (程序)
ePWM_setPhaseShift (EPWM1_base、0U);
ePWM_setTimeBaseCounter (EPWM1_base、0U);//初始化 DU 计数器。
ePWM_setCounterCompareValue (EPWM1_BASE、
ePWM_COUNTER_COMPARE_A、
友好关系);//<--- 环流环流环流环流环流环流环流环流环流环流环流环流环流
ePWM_setTimeBaseCounterMode (EPWM1_base、
ePWM_COUNTER_MODE_UP);
ePWM_DisablePhaseShiftLoad (EPWM1_base);
ePWM_setClockPrescaler (EPWM1_base、
ePWM_CLOCK 分频器_1、
ePWM_HSCLOCK_DEVIDER_1);
EPWM_setCounterCompareShadowImage LoadMode (EPWM1_BASE、
ePWM_COUNTER_COMPARE_A、
ePWM_COMP_LOAD_ON_CNTR_ZERO);
ePWM_setActionQualifierAction (EPWM1_base、
ePWM_AQ_OUTPUT A、
ePWM_AQ_OUTPUT 高电平、
ePWM_AQ_output_on_timebase_up_CMPA);
ePWM_setActionQualifierAction (EPWM1_base、
ePWM_AQ_OUTPUT A、
ePWM_AQ_OUTPUT 低电平、
ePWM_AQ_output_on_timebase_period);
}
void PWM1 (浮点型1)
{
EPwm1Regs.CMPA.bit.CMPA =(uint16)(分辨率- duty1);
}
void Init_adc_jj (void){
//
//配置 ADC 并为其加电
//
ConfigureADC();
//
//设置用于软件转换的 ADC
//
SetupADCSoftware();
//
//循环无限地进行转换
//
AdcResult[0]= 0;
AdcResult[1]= 0;
AdcResult[2]= 0;
AdcResult[3]= 0;// evite des valeurs 超出范围
}
空配置 ADC (空)
{
EALLOW;
//
//写入配置
//
AdcaRegs.ADCCTL2.bit.prescale = 6;//divise 200MHz PAR 4 覆铜区最大自动量50MHz
AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCA、ADC_resolution_12位 、ADC_SIGNALMODE_single);// ADC_resolution_12位常规 a la Place du 0
AdcSetMode (ADC_ADCB、ADC_Resolution 12位 、ADC_SIGNALMODE_SINGLE);// ADC_Resolution 12位常规 a la Place du 0
//
//将脉冲位置设置为晚期
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;//当前 INT 的解除结界时刻、1 =可分配
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
//
//为 ADC 加电
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
//
//延迟1ms 以允许 ADC 加电时间
//
DELAY_US (1000);
EDIS;
}
//
// SetupADCSoftware -设置 ADC 通道和采集窗口
//
空 SetupADCSoftware (空)
{
// uint16 acqps;
//
//根据分辨率确定最小采集窗口(在 SYSCLKS 中)
//
if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)
{
acqps =14;//par 默认值:14 = 75ns => 1/2 LSB (15覆1/4LSB)
// 75ns =(14 + 1)* SYSCLK
}
否则、//分辨率为16位
{
acqps = 63;//320ns
}
//
//选择要转换的通道和转换结束标志
//ADCA
//
EALLOW;
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0将转换引脚 A0引脚30
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
//1个 SYSCLK 周期
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 2;//SOC0 se d é clenche sur 定时器1
//Trois lignes suivante attribut un flag à la conversion、c'est optionnel。
AdcaRegs.ADCINTSEL1N2.bit.INT2SEL = 0;// SOC0结束将设置 INT2标志
AdcaRegs.ADCINTSEL1N2.bit.INT2E = 1; //启用 INT2标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;//确保 INT2标志被清除
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 3; //SOC0将转换引脚 B3
AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
//1个 SYSCLK 周期
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 2;//SOC0 se d é clenche sur 定时器1
AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志/0=> SOC0
AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1; //启用 INT1标志
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
EDIS;
}
提前感谢,
此致
JJ.