This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
在解决方案资源管理器中、我有一个模拟通道读取示例。 同样、我无法读取模拟通道 B 数据。
您能否提供 模拟 B 通道读取代码的配置代码或示例链接? 我对确切配置有点困惑。
我将逐个读取所有 ADC INB 通道数据。
此致-
Sudip
您好、SDIP、
我使用 example_2805xexc以及 相应 的寄存器中的 example_2805xexcands 项目来查看输入、并且似乎在相应的寄存器中选择了 B 通道8-15。 您是否尝试修改此项目以使用它?
此致、
Omer Amir
您好 Omer Amir、
非常感谢您的快速响应。
示例:Example_2805xAdis c
实际上、我需要 逐个读取 B 通道输入中的所有 ADC。 对于 INA/INB 选择、哪些寄存器设置?
您可以提供 exapme 代码吗?
此致-
Sudip
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.ADCINT1 =&ADC_ISR;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
//
//步骤4. 初始化所有器件外设:
//
InitAdc ();//对于此示例,初始化 ADC
AdcOffsetSelfCal();
//
//步骤5. 特定于用户的代码、启用_interrupts:
//
//在 PIE 中启用 ADCINT1
//
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 中启用 INT 1.1
IER |= M_INT1;//启用 CPU 中断1
EINT;//启用全局_中断 INTM
ERTM;//启用全局实时__interrupt DBGM
LoopCount = 0;
ConversionCount = 0;
//
//配置 ADC
//注意:
//通道 ADCINA4将被双采样以先解决 ADC 问题
//修订版0芯片勘误表的样例问题。
//由于循环,SOC0首先转换,然后是 SOC1,最后是 SOC2
//
EALLOW;
AdcRegs.ADCCTL1.bit.INTPULSEPOS= 1;//ADCINT1在 AdcResults 锁存后跳闸
AdcRegs.INTSEL1N2.bit.INT1E = 1;//启用 ADCINT1
AdcRegs.INTSEL1N2.bit.INT1CONT = 0;//禁用 ADCINT1连续模式
AdcRegs.INTSEL1N2.bit.INT1SEL = 2;//设置 EOC2以触发 ADCINT1
AdcRegs.ADCSOC0CTL.bit.CHSEL = 4;//将 SOC0通道选择设置为 ADCINA4
AdcRegs.ADCSOC1CTL.bit.CHSEL = 4;//将 SOC1通道选择设置为 ADCINA4
AdcRegs.ADCSOC2CTL.bit.CHSEL = 2;//将 SOC2通道选择设置为 ADCINA2
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;//设置 EPWM1A 上的 SOC0启动触发器
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5;//设置 EPWM1A 上的 SOC1启动触发器
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 5;//设置 EPWM1A 上的 SOC2启动触发
AdcRegs.ADCSOC0CTL.bit.ACQPS = 9;//SOC0 S/H 窗口= 10 (9+1)个时钟周期
AdcRegs.ADCSOC1CTL.bit.ACQPS = 9;//SOC0 S/H 窗口= 10 (9+1)个时钟周期
AdcRegs.ADCSOC2CTL.bit.ACQPS = 9;//SOC0 S/H 窗口= 10 (9+1)个时钟周期
EDIS;
//
//假设 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;//向上计数并启动
//
//等待 ADC _interrupt
//
for (;;)
{
LoopCount++;
}
}
_interrupt void ADC_ISR (void)
{
//
//将 ADCRESULT0作为针对 rev0的第1个样本勘误表的权变措施的一部分丢弃
//
Voltage1[ConversionCount]= AdcResult.ADCRESULT1;
Voltage2[ConversionCount]= AdcResult.ADCRESULT2;
//
//如果记录了10次转换,则重新开始
//
if (ConversionCount = 9)
{
ConversionCount = 0;
}
其他
{
ConversionCount++;
}
//
//清除 ADCINT1标志为下一个 SOC 重新初始化
//
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
PieCtrlRegs.PIEACK.all = PIEACK_Group1;//确认__interrupt 到 PIE
返回;
}
您好 Omer Amir、
非常感谢您的宝贵回复。 可能是我丢失了一些东西。
我将重试。
此致-
Sudip
您好、SDIP、
[引用 userid="452796" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1182544/tms320f28055-need-code-to-read-analogue-channel-b/4453940 #4453940"]实际上、我需要 逐个读取 B 通道输入中的所有 ADC。 对于 INA/INB 选择、哪些寄存器设置?
您可以提供 exapme 代码吗?
[/报价]这里的代码对于这个器件来说已经足够了、你只需要更改你在 CHSEL 和其他地方使用 B 通道时使用的值、使用的位字段应该是一样的。 如果要读取通道 B 上的所有输入、只需配置所有16个 SOC (可以复制用于配置 SOC 的现有代码、只需更改 SOC 编号、以便包含0到15)。 您可以查看参考手册中的"ADC SOC0-SOC15控制寄存器(ADCSOCxCTL)"部分、了解 SOC 控制寄存器中需要更改的内容。 您可以决定要使用哪些触发器、或者是否要执行软件触发器。
此致、
Omer Amir
您好 Omer Amir、
非常感谢您的回复。 我根据您的信息进行了实验。 现在、我能够读取通道 B
但有一个问题。
我注意到 B1、B4、B6、B7无法读取。
对于+VCC=4095计数、0V=0计数、休息 B 通道。
所述通道+/-相同的值~519计数。
您能告诉我这个问题的原因吗? 配置如下所示:
此致-
Sudip
MAIN ()
{
//////////////////////////////////////////////////////////////////////////////////////
InitSysCtrl();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
//////////////////////////////// ///////////////////////////////////////////////////////////
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
EDIS;
EALLOW;
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;//电源 ADC BG
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1;//电源基准
AdcRegs.ADCCTL1.bit.ADCPWDN = 1;//电源 ADC
AdcRegs.ADCCTL1.bit.ADCENABLE = 1;//启用 ADC
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0;//选择内部 BG
EDIS;
DELAY_US (1000);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 中启用 INT 1.1
IER |= M_INT1;//启用 CPU 中断1
EINT;//启用全局_中断 INTM
ERTM;//启用全局实时__interrupt DBGM
EALLOW;
AdcRegs.ADCSOC0CTL.bit.CHSEL = 15;//值9、12、14、15无响应
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;//设置 EPWM1A 上的 SOC0启动触发器
AdcRegs.ADCSOC0CTL.bit.ACQPS = 9;//SOC0 S/H 窗口= 10 (9+1)个时钟周期
EDIS;
//
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;//向上计数并启动
for (;;)
{
unsigned int r0 = AdcResult.ADCRESULT0;
}
}
您好、SDIP、
我注意到您没有 AdcOffsetSelfCal()函数来重新校准 ADC 零偏移误差、这是有原因的吗? 您还能解释一下您的硬件设置吗? 您是否正在使用 controlCARD?
此致、
Omer Amir