工具/软件:TI C/C++编译器
我有一个基于ADC_SoC示例运行的C28程序,该示例使用ePWM,其代码如下所示,但目前它仅运行ADC1
void main (void)
{
//步骤1。 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例功能可在F28M35x_sysctrl.c文件中找到。
InitSysCtrl();
#ifdef _flash
//将时间关键代码和Flash设置代码复制到RAM
//这包括以下函数:InitFlash();
//
链接器创建RamfuncsLoadStart,RamfuncsLoadSize和RamfuncsRunStart //符号。 请参阅设备.cmd文件。
memcpy (&RamfuncsRunStart,&RamfuncsLoadStart,(size_t)&RamfuncsLoadSize);
//调用闪存初始化以设置闪存等待//
此函数必须驻留在RAM中
InitFlash();
#endif
//步骤2。 初始化GPIO:
//初始化GPIO
InitGpio();//将GPIO设置为其默认状态。
EALLOW;
GpioG1CtrlRegs.GPADIR.bit.GPIO29 = 1;//将PE5_GPIO29设置为输出TM -这适用于我添加到PCB的直接接线LED
EDIS;
//步骤3。 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
dint;
//将PIE控制寄存器初始化为其默认状态。
//默认状态是禁用所有PIE中断,
并清除标志//。
//此函数位于F28M35x_PIECTRL.c文件中。
InitPieCtrl();//
禁用CPU中断并清除所有CPU中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向shell Interrupt
//服务例程(ISR)的指针初始化PIE矢量表。
//这将填充整个表,即使在此
示例中未使用中断//。 这对于调试非常有用。
// shell ISR例程位于F28M35x_DefaultIsr.C.中
//此函数位于F28M35x_PieVect.C.中
本
例中使用的InitPieVectorTable();//中断被重新映射到此
文件中找到的// ISR函数。
EALLOW;//这是写入EALLOW保护寄存器所必需的
PieVectorTable.ADCINT1 =&ADC1_ISR; // ADC_SOC_c28.c中的TM指向ADC转换后运行的本地ISR代码
EDIS;//这是禁用写入EALLOW保护寄存器的必需
项//步骤4。 初始化设备外围设备。 此功能可以是
// 在F28M35x_CpuTimers.c
//# InitCpuTimers();中找到 // TM初始化CPU计时器(不使用已禁用的计时器)
InitAdc1(); // TM初始化ADC1 (当我们到达该位置时需要添加ADC2)
//在PIE中启用ADCINT1
PieCtrlRegs.PIEIER1.bit.INTx1 =1;//在饼图中启用INT 1.1
IER |= M_INT1; //启用CPU中断1
EINT; //启用全局中断INTM
ERTM; //启用全局实时中断DBGM
LoopCount = 0; // TM不确定我们是否需要此功能
ConversionCount = 0;// TM不确定我们是否需要此
//配置ADC
EALLOW;
Adc1Regs.ADCCTL2.bit.ADCNONOVERLAP = 1; //启用非重叠模式,即
//转换和未来
//采样事件不重叠
Adc1Regs.ADCCTL1.bit.INTPULSEPOS = 1; // ADCINT1在AdcResults锁定后跳闸
Adc1Regs.INTSEL1N2.bit.INT1E = 1; //已启用ADCINT1
Adc1Regs.INTSEL1N2.bit.INT1CONT = 0; //禁用ADCINT1连续模式
Adc1Regs.INTSEL1N2.bit.INT1SEL = 0; //设置EOC0以触发ADCINT1
Adc1Regs.ADCSOC0CTL.bit.CHSEL = 2; //将SOC0通道选择设置为ADC1A2 ### Current SS
Adc1Regs.ADCSOC1CTL.bit.CHSEL = 3; //将SOC1通道选择设置为ADC1A3 ###故障电流
AnalogSysctrlRegs.TRIG1sel.all = 5; //将EPWM1SOCA分配给ADC模块的ADC触发器1
Adc1Regs.ADCSOC0CTL.bit.TRIGSEL = 5; //将SOC0启动触发器设置为ADC的ADC触发器1 (EPWM1 SOCA)
Adc1Regs.ADCSOC1CTL.bit.TRIGSEL = 5; //将SOC1启动触发器设置为ADC的ADC触发器1 (EPWM1 SOCA)
Adc1Regs.ADCSOC0CTL.bit.ACQPS = 6; //将SOC0 S/H窗口设置为7个ADC时钟周期,(6 ACQPS +1)
ADc1Regs.ADCSOC1CTL.bit.ACQPS = 6; //将SOC1 S/H窗口设置为7个ADC时钟周期,(6 ACQPS +1)
EDIS;
////假定ePWM1时钟已在InitSysCtrl()中启用;
//为ADC SOC1设置事件触发器(SOCA)
EPwm1Regs.ETSEL.bit.SOCAEN = 1; //在组上启用SOC
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTRU_CMPA;//从CMPA中选择SOC ON
//增加
EPwm1Regs.ETPS.bit.SOCAPRD = 3; //每隔三次生成一次脉冲
//事件
//时基寄存器
EPwm1Regs.TBPRD =周期; //设置定时器周期,PWM
//频率= 1 /周期
EPwm1Regs.TBPHS.ALL = 0; //时基相位寄存器
EPwm1Regs.TBCTR = 0; //时基计数器寄存器
EPwm1Regs.TBCTL.bit.PRDLD = TB_immediate;//设置即时负载
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//计数模式:用于
//非对称PWM
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; //禁用相位加载
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
//将阴影寄存器加载设置为零
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHAME;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADO;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//在CTR上加载=零
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;//在CTR上加载=零
//设置比较值
EPwm1Regs.CMPA.Half.CMPA =工作周期A; //初始设置占空比50 %
EPwm1Regs.CMBB =工作周期B; //初始设置占空比50 %
//设置操作
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; //将PWM2A设置为零
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; //在事件A上清除PWM2A
//计数
EPwm1Regs.AQCTLB.bit.ZRO = AQ_CLEAR; //将PWM2B设置为零
EPwm1Regs.AQCTLB.bit.CBU = AQ_SET; //清除事件B上的PWM2B,向上
//计数
//步骤6。 空闲循环。 只需坐下来永远循环(可选):
用于(;;);
} //主
端__interrupt void ADC1_ISR(void)
{
// TM我相信这些是在进行ADC转换之后发生的
当我们进入ADC ISR时,GpioG1DataRegs.GPASET.bit.GPIO29=1;// LED亮起
myVoltsArray[myIndex]=来自ADC结果0的Adc1Result.ADCRESULT0;// TM设置电压数组元素
myAmpsArray[myIndex]=来自ADC结果1的Adc1Result.ADCRESULT1;// TM温度设置安培数组元素
myIndex++;
如果(myIndex > 10){// TM,则10为1.2607万,为测试而缩小
myIndex =0;
}
//如果记录了10个转换,请重新开始
IF (ConversionCount == 9)
{
ConversionCount = 0;
}
Else ConversionCount++;
当我们退出ADC ISR时,GpioG1DataRegs.GPACLEAR.bit.GPIO29=1;// LED熄灭
adc1Regs.ADCINTFLGCLL.bit.ADCINT1 = 1;//清除ADCINT1标志重新初始化
//用于下一个SOC
PIECtrlRegs.PIEACK/ALL = PIEACK_Group1;//确认中断到PIE
返回;
}
我希望每秒对ADC1INA2和ADC2INA2 2.16万 执行同时转换,然后获取这些结果并将其存储在我的循环数组缓冲区中。 我在参考手册(spruh22h.pdf)中阅读了有关同时采样模式的内容,但我不清楚结果是如何返回的-我想我可以将ADC1INA2和ADC2INA2设置为由ePWM信号触发,但我是否需要2个ISR来获取结果?
如果ADC1INA2值超时,我需要替换ADC1INA3中的读数(读取的相同源的灵敏度比敏感程度低10倍),这一要求会使问题更加复杂。 所以我真正想要的是,如果读数高于(然后 低于)设置值,则更改ADC1INAx值的来源。 解决此问题的另一种方法可能是始终获取 ADC1INA2和ADC2INA2读数,然后立即跟进ADC1INA3读数(将在< 1个美国后出现,但没关系); 在这种方法中,我将测试ADC1INA2值,如果该值已达到最大值,我只需使用ADC1INA3值除以10,并将其存储在结果数组中。
请注意,我正在获取12位结果并将其存储在16位寄存器中,因此如果我要存储第二个结果x10,它仍将适合于16位结果阵列-通过这种方式,我可以捕获过流的值。