老师您好!我在做直流电机控制的项目,下面一段关于ADC配置的程序,为什么我在Watch中监测时,结果不对,模拟信号接在了ADCINA0上,电压为2.4V。在Watch中我监测了AdcRegs.ADCRESULT0>>4和Voltage[0]时,值不对,为什么?
…….
//150M的系统时钟
SysCtrlRegs.HISPCP.all=0x3;
……
void AdcSetup(void)
{
InitAdc();
AdcRegs.ADCTRL3.bit.ADCCLKPS=0X0;
AdcRegs.ADCTRL1.bit.ACQ_PS=0xf;
AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
AdcRegs.ADCTRL3.bit.SMODE_SEL=0;
AdcRegs.ADCMAXCONV.bit.MAX_CONV1=0;
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0X0;
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1=1;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;
}
//pwm模块的其他配置就不列举了,PWM已经调试正常,下面列举ET模块中的几条语句
void PwmSetup(void)
{
……
EPwm1Regs.ETSEL.bit.SOCAEN=1;
EPwm1Regs.ETSEL.bit.SOCASEL=0X1;
EPwm1Regs.ETPS.bit.SOCAPRD=0X1;
}
interrupt void adc_isr(void)
{
Voltage[0]=AdcRegs.ADCRESULT0>>4;
}
中断检查了,都打开了,我的配置有没有问题?感谢了
Young Hu:
能够进中断么?怎么不正常了?
老师您好!我在做直流电机控制的项目,下面一段关于ADC配置的程序,为什么我在Watch中监测时,结果不对,模拟信号接在了ADCINA0上,电压为2.4V。在Watch中我监测了AdcRegs.ADCRESULT0>>4和Voltage[0]时,值不对,为什么?
…….
//150M的系统时钟
SysCtrlRegs.HISPCP.all=0x3;
……
void AdcSetup(void)
{
InitAdc();
AdcRegs.ADCTRL3.bit.ADCCLKPS=0X0;
AdcRegs.ADCTRL1.bit.ACQ_PS=0xf;
AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
AdcRegs.ADCTRL3.bit.SMODE_SEL=0;
AdcRegs.ADCMAXCONV.bit.MAX_CONV1=0;
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0X0;
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1=1;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;
}
//pwm模块的其他配置就不列举了,PWM已经调试正常,下面列举ET模块中的几条语句
void PwmSetup(void)
{
……
EPwm1Regs.ETSEL.bit.SOCAEN=1;
EPwm1Regs.ETSEL.bit.SOCASEL=0X1;
EPwm1Regs.ETPS.bit.SOCAPRD=0X1;
}
interrupt void adc_isr(void)
{
Voltage[0]=AdcRegs.ADCRESULT0>>4;
}
中断检查了,都打开了,我的配置有没有问题?感谢了
user4539844:
回复 Young Hu:
可以进中断,不过结果不对,2.4V对应的结果不应该是3277吗?(ADCL0接地) 在Watch中我监测了AdcRegs.ADCRESULT0>>4和Voltage[0]。哪里出问题了?还是我监测的不对啊?
老师您好!我在做直流电机控制的项目,下面一段关于ADC配置的程序,为什么我在Watch中监测时,结果不对,模拟信号接在了ADCINA0上,电压为2.4V。在Watch中我监测了AdcRegs.ADCRESULT0>>4和Voltage[0]时,值不对,为什么?
…….
//150M的系统时钟
SysCtrlRegs.HISPCP.all=0x3;
……
void AdcSetup(void)
{
InitAdc();
AdcRegs.ADCTRL3.bit.ADCCLKPS=0X0;
AdcRegs.ADCTRL1.bit.ACQ_PS=0xf;
AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
AdcRegs.ADCTRL3.bit.SMODE_SEL=0;
AdcRegs.ADCMAXCONV.bit.MAX_CONV1=0;
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0X0;
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1=1;
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;
}
//pwm模块的其他配置就不列举了,PWM已经调试正常,下面列举ET模块中的几条语句
void PwmSetup(void)
{
……
EPwm1Regs.ETSEL.bit.SOCAEN=1;
EPwm1Regs.ETSEL.bit.SOCASEL=0X1;
EPwm1Regs.ETPS.bit.SOCAPRD=0X1;
}
interrupt void adc_isr(void)
{
Voltage[0]=AdcRegs.ADCRESULT0>>4;
}
中断检查了,都打开了,我的配置有没有问题?感谢了
user4539844:
回复 Jason Wu4:
好吧,我在看看,还有个问题,我在看ADC_DMA的例程时,下面的几句话,有问题,请帮助解答!
#pragma DATA_SECTION(ADC_Result,"DMARAML4");
volatile float ADC_Result[160];
#pragma DATA_SECTION(DMABuf1,"DMARAML4");
volatile float DMABuf1[160];
问题1:DMARAML4是自定义的映射区域?为什么要写这条语句,作用是什么?转换的结果不是都在AdcRegs.ADCRESULTx中吗?转化结束,就把这个ADC结果寄存器的值存储到DMA中不就行了吗?
问题2:DMA模块是个存储器?还是一个搬运数据的工具(简单说就是个搬运工)?要是存储器,他有多大啊?要是个搬运数据的一个模块,那么要是没有外设存储器件,他搬运的数据存在哪里了?是RAM中吗?
以下是另一个问题。我看例程中有这样的两句话:
……..
InitSysCtrl();
EALLOW;
SysCtrlRegs.HISPCP.all=0x3;
EDIS;
InitSysCtrl()这个函数中包含了一个这样的函数InitPeripheralClocks();
而InitPeripheralClocks()中有一条语句是SysCtrlRegs.HISPCP.all=0x0001;
问题出现了,高速外设时钟分频寄存器在一个程序中设置了两次,而且值不一样,为什么程序还能正确的转换出结果?这样做不是ADC的时钟就不一样了吗?为什么呢?