工具/软件:Code Composer Studio
你好
我修改了ADC_SOC示例,使其能够读取三个电压值:
__interrupt void ADC_ISR(void);
UINT16 Voltage1;
UINT16 Voltage2;
UINT16 Voltage3;
void main(void){
InitSysCtrl();
EALLOW;
#define ADC_MODCLK 0x3;
EDIS;
EALLOW;
SysCtrlRegs.HISPPCP.ALL = ADC_MODCLK;
EDIS;
色调;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectorTable();
InitCpuTimers();//在此示例中,仅初始化CPU计时器
EALLOW;//这是写入EALLOW保护寄存器所必需的
PieVectorTable.ADCINT =&ADC_ISR;
EDIS;//这是禁用写入EALLOW保护寄存器所必需的
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设置为2nd SEQ1 Conv.
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;// set比较值
EPwm1Regs.TBPRD = 0xFFFF; //为ePWM1设置期间
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//开始计数
__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.PIEACK/ALL = PIEACK_Group1;//确认中断到PIE
返回;
}
1.读取这些值后,我使用(voltage*3/4095)得到一个0-3V的值,但是我得到的值有一个小错误,而且不精确,请问我的代码是否有问题?
2.另外,当我们编写(#define ADC_MODCLK 0x3;)时,我知道我们将ADC时钟分配为25MHz,我的问题是如何更快地读取ADC值? (因为在数据表中它表示ADC SoC为80ns)
此致,
ATA