工具/软件:Code Composer Studio
你好
我已使用 ADC_SOC 示例读取三个 A/D 通道、并使用两个函数"Start_Timer"和"Stop_Timer" 来测量读取这些通道所需的时间。 执行此操作几乎需要0.005s、但是在 TMS320F28335的数据表中、ADC 的转换时间为80ns。 请检查我的代码、看看为什么需要这么长的时间?
void main (void) { InitSysCtrl(); EALLOW; #define ADC_MODCLK 0x3 EDIS; EALLOW; SysCtrlRegs.HISPCP。all = ADC_MODCLK; EDIS; Dint; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); InitCpuTimer();//对于此示例,只初始化 CPU 计时器 EALLOW;//这是写入 EALLOW 受保护寄存器所必需的 PieVectTable.ADCINT =&ADC_ISR; EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的 StartTimer(); InitAdc ();//对于此示例,初始化 ADC PieCtrlRegs.PIEIER1.bit.INTx6=1; IER |= M_INT1; //启用 CPU 中断1 EINT; //启用全局中断 INTM ERTM; //启用全局实时中断 DBGM // LoopCount = 0; ConversionCount = 0; // //配置 ADC // AdcRegs.ADCMAXCONV.ALL = 0x0003; //在 SEQ1上设置2 conv AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x2;//将 ADCINA2设置为第一个 SEQ1转换器 AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x3;//将 ADCINA3设置为第2个 SEQ1转换器 AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x4; // //从 ePWM 启用 SOCA 以启动 SEQ1 // AdcRegs.ADCTRL2.bit.ePWM_SOCA_SEQ1 = 1; AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;//启用 SEQ1中断(每个 EOS) // //假设 ePWM1时钟已在 InitSysCtrl()中启用; // EPwm1Regs.ETSEL.bit.SOCAEN = 1; //在组上启用 SOC EPwm1Regs.ETSEL.bit.SOCASEL = 4;//从 CPMA 中选择 SOC、以进行递增计数 EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲 EPwm1Regs.CMPA.half.CMPA = 0x0080;//设置比较值 EPwm1Regs.TBPRD = 0xFFFF; //为 ePWM1设置周期 EPwm1Regs.TBCTL.bit.CTRMODE = 0;//向上计数并启动 StopTimer(); Δ_time=cpuTime*6.66e-9; void StartTimer (void) { // cpuTime1 = 0; EALLOW; CpuTimer2Regs.TCR.bit.TRB = 1; //将 CPU 定时器重置为周期值 CpuTimer2Regs.TCR.bit.TSS = 0; //启动或复位 CPU 定时器2. cpuTime1 = CpuTimer2Regs.TIM.all; //在代码前获取 CPU 定时器2的值 EDIS; } void StopTimer (void) { EALLOW; cpuTime2 = CpuTimer2Regs.TIM.all;//获取代码后 CPU 定时器2的值 cpuTime = cpuTime1 - cpuTime2; //使用 cpuTimer2计算时间 CpuTimer2Regs.TCR.bit.TSS = 1; //启动或复位 CPU 定时器2. EDIS; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// _interrupt void ADC_ISR (void) { Voltage1 = AdcRegs.ADCRESULT0 >>4; Voltage2 = AdcRegs.ADCRESULT1 >>4; Voltage3 = AdcRegs.ADCRESULT2 >>4; 电流=电压1 -电压2; 电压=电压2-电压3; // //如果记录了40次转换,则重新开始 // // //为下一个 ADC 序列重新初始化 // AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; //重置 SEQ1 AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; //清除 INT SEQ1位 PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断 返回; }