我想测试 F28379D 的牵引 ADC、并在内存浏览器中观察它们的输出、同时进行采样。 我希望 e2e.ti.com/.../4130.code.docx 使用 ePWM2-ADCSOCA 触发器对 adca 的 ch0和 ADCB 的 CH2进行采样、然后我想将 ADCINA0 (引脚#30)和 ADCINB2 (引脚#28)连接到午餐板的 P18和 P19 、并在 AdcBuf 和 AdcBuF1寄存器中查看它们的数据、但我不断遇到这个错误:
"../adc.c"、第92行:错误#29:需要表达式
1在编译"../adc.c"时检测到错误。
是否有人能 告诉我 我缺少了什么?
请注意、第92行是 :IER |= 0x0001;
下面是我所做的;我使用 了实验课程的 Lab6并添加了以下项目:
1-在 Lab.h 中添加了以下变量:
全局变量引用
//
extern float32 xDelay[filter_LEN];
extern float32系数[filter_LEN];
extern UINT16 AdcBuf[ADC_BUF_LEN];
extern UINT16 AdcBuf1[ADC_BUF_LEN];//*** MZ
extern UINT16 AdcBufFiled[ADC_BUF_LEN];
extern UINT16 AdcBuf1Filed[ADC_BUF_LEN];//**mz
extern UINT16 AdcBufRaw[2*ADC_BUF_LEN];
extern UINT16 AdcBuf1Raw[2 * ADC_BUF_LEN];//*** mz
extern UINT16 ClaFilteredOutput;
extern UINT16 DacOffset;
2-in main 函数我添加了以下变量:
#include "Lab.h"//主 include 文件
//--全局变量
UINT16 DEBUG_TOGGLE = 1;//用于实时模式调查测试
uint16 sine_enable = 0;//用于 DAC 波形生成
uint16 AdcBuf[ADC_BUF_LEN];// ADC 缓冲区分配
uint16 AdcBuf1[ADC_BUF_LEN];// ADC buffer1分配四个月
uint16 DacOffset;// DAC offset
uint16 DacOutput;// DAC 输出
3 -在默认 ISR 中、我添加了以下详细信息:
中断空 ADCB1_ISR (空)// PIE1.1 @ 0x000D40 ADC-B4]中断#1
{
静态 uint16 * AdcBufPtr1 = AdcBuf1;//指向缓冲区的指针
//static UINT16 iQuadratureTable = 0;//正交表索引
静态易失性 UINT16 GPIO34_COUNT = 0;//引脚切换计数器
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//必须确认 PIE 组
//--管理 ADC 寄存器
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1标志
//---读取 ADC 结果
*AdcBufPtr1++= AdcbResultRegs.ADCRESULT0;//读取结果
//--蛮力强制循环缓冲器
if (AdcBufPtr1 =>(AdcBuF1 + ADC_BUF_LEN))
{
AdcBufPtr1 = AdcBuF1;//将指针回卷到开头
}
//--示例:切换 GPIO18,以便我们可以使用 ADC 读取它***/
if (debug_toggle = 1)
{
GpioDataRegs.GPATOGGLE.bit.GPIO18 = 1;//切换引脚
}
}
4-在 adc.c 中、我添加了以下详细信息:
函数:InitAdca()
*
*说明:在 F28x7x 上初始化 ADC-A 和 B
(二 /
空 InitAdca (空)
{
asm (" EALLOW");//启用 EALLOW 受保护寄存器访问
//--复位 ADC。 这是一种良好的编程实践。
DevCfgRegs.SOFTPRES13.bit.ADC_A = 1;// ADC 复位
DevCfgRegs.SOFTPRES13.bit.ADC_A = 0;// ADC 从复位中释放
DevCfgRegs.SOFTPRES13.bit.ADC_B = 1;// ADC 复位
DevCfgRegs.SOFTPRES13.bit.ADC_B = 0;// ADC 从复位中释放
//---配置 ADC 基址寄存器
AdcaRegs.ADCCTL1.ALL = 0x0004;//主 ADC 配置
AdcbRegs.ADCCTL1.ALL = 0x0004;
//位15-14 00:保留
//位13 0:ADCBSY、ADC 忙、只读
//位12 0:保留
//位11-8 0:ADCBSYCHN、ADC 忙通道、只读
//位7 0:ADCPWDNZ、ADC 断电、0 =断电、1 =上电
//位6-3 0000:保留
//位2 1:INTPULSEPOS、INT 脉冲生成、0=转换开始、1=转换结束
//位1-0 00:保留
AdcaRegs.ADCCTL2.all = 0x0006;// ADC 时钟配置
AdcbRegs.ADCCTL2.ALL = 0x0006;
//位15-8 0:保留
//位7 0:SIGNALMODE,由下面的 AdcSetMode()配置以获得正确的校准
//位6 0:分辨率,由下面的 AdcSetMode()配置以获得正确的校准
//位5-4 00:保留
//位3-0 0110:预分频、ADC 时钟预分频器。 0110=CPUCLK/4
AdcaRegs.ADCBURSTCTL.ALL = 0x0000;
AdcbRegs.ADCBURSTCTL.ALL = 0x0000;
//---调用 AdcSetMode()以配置分辨率和信号模式。
//这也会对配置的模式执行正确的 ADC 校准。
AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);
AdcSetMode (ADC_ADCB、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);
//-- SOC0配置
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 7;//使用 ePWM2-ADCSOCA 触发
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0;//转换通道 ADCINA0 (通道0)
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 19;//采集窗口设置为(19+1)=20个周期(200MHz SYSCLK 时为100ns)
AdcaRegs.ADCINTSOCSEL.bit.SOC0 = 0;//无 ADC 中断触发 SOC0 (TRIGSEL 域决定触发)
AdcaRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;//所有 SOC 在循环模式下处理
//SOC0配置 ADCB
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 7;
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 2;
//SOC0将转换 ADCINB2
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 19;
AdcbRegs.ADCINTSOCSEL1.bit.SOC0 = 0;
AdcbRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;
//-- ADCA1中断配置
AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//中断脉冲、与标志状态无关
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 ADC 中的中断
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// EOC0触发中断
//ADCB1中断配置
AdcbRegs.ADCINTSEL1N2.bit.INT1CONT = 1;
AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1;
AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 0;
//--为 ADCa 启用 ADC 中断
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 组1中启用 ADCA1中断
PieCtrlRegs.PIEIER1.bit.INTx2 = 1;
IER |= 0x0001;//在 IER 中启用 INT1以启用 PIE 组1
//--完成
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;//为 ADC 加电
DelayU (1000);//加电后等待1ms、然后再使用 ADC
asm (" EDIS");//禁用 EALLOW 受保护寄存器访问
//-完成 ADCB
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
DelayU(1000);
asm (" EDIS");
}//结束 InitAdc()
//----文件结尾------------------------------------------