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.

[参考译文] TMS320F28379D:浏览存储器中 CHennel ADCB0的 AdcBuf

Guru**** 2595805 points
Other Parts Discussed in Thread: TMS320F28379D, CONTROLSUITE, C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/673118/tms320f28379d-browsing-the-adcbuf-of-chennel-adcb0-in-the-memory

器件型号:TMS320F28379D
Thread 中讨论的其他器件: controlSUITEC2000WARE

修正了 C28xx 实验6示例、以包含另一个 ADC 转换器。 以下代码适用于 ADC 文件:  

空 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;//主 ADC 配置
//位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;// ADC 时钟配置
//位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;
//位15 0:BURSTEN、0 =禁用突发模式、1 =启用突发模式
//位14-12000:保留
//位11-8 0000:BURSTSIZE、0=1 SOC 已转换(无关)
//位7-6 00:保留
//位5-0 000000:BURSTTRIGSEL,00=仅软件(无关)

//---调用 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 在循环模式下处理


///--- ADC B 的 SOC0配置
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 7;//使用 ePWM2-ADCSOCA 触发
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0;//转换通道 ADCINA0 (通道0)
AdcbRegs.ADCSOC0CTL.bit.ACQPS = 19;//采集窗口设置为(19+1)= 20个周期(200MHz SYSCLK 时为100ns)

AdcbRegs.ADCINTSOCSEL.bit.SOC0 = 0;//无 ADC 中断触发 SOC0 (TRIGSEL 域决定触发)
AdcbRegs.ADCSOCPRICTL.bit.SOCPRIORITY = 0;//所有 SOC 在循环模式下处理


//-- 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;//启用 ADC 中的中断
AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// EOC0触发中断

//--启用 ADC 中断
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 组1中启用 ADCA1中断
IER |= 0x0001;//在 IER 中启用 INT1以启用 PIE 组

//--完成
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;//为 ADC 加电
DelayU (1000);//加电后等待1ms、然后再使用 ADC
asm (" EDIS");//禁用 EALLOW 受保护寄存器访问

}//结束 InitAdc()


//--文件结尾------

ISR 代码如下所示:

///----------------------------------------------------------
中断空 ADCA1_ISR (空)// PIE1.1 @ 0x000D40 ADC-A 中断#1

静态 uint16 * AdcBufPtr = AdcBuf;//指向缓冲区的指针
静态 uint16 iQuadratureTable = 0;//正交表索引
静态易失性 UINT16 GPIO34_COUNT = 0;//引脚切换计数器
静态易失性 UINT16 PwmModDelay = 0;//更改 PWM 的计数器
静态易失性 UINT16 PwmModDir = 1;//为 PWM 创建一个方向
静态易失性 UINT16 PwmCmpaVal = PWM_MAX_DUTY;// PWM 的起始值

PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//必须确认 PIE 组

//--管理 ADC 寄存器
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1标志

//---读取 ADC 结果
*AdcBufPtR++= AdcResultRegs.ADCRESULT0;//读取结果

//--蛮力强制循环缓冲器
if (AdcBufPtr ==(AdcBuf + ADC_BUF_LEN))

AdcBufPtr = AdcBuf;//将指针回卷到开头

///----------------------------------------------------------
中断空 ADCB1_ISR (空)// PIE1.2 @ 0x000D42 ADC-B 中断#1

静态 uint16 * AdcBufPtr = AdcBuf;//指向缓冲区的指针
静态 uint16 iQuadratureTable = 0;//正交表索引
静态易失性 UINT16 GPIO34_COUNT = 0;//引脚切换计数器
静态易失性 UINT16 PwmModDelay = 0;//更改 PWM 的计数器
静态易失性 UINT16 PwmModDir = 1;//为 PWM 创建一个方向
静态易失性 UINT16 PwmCmpaVal = PWM_MAX_DUTY;// PWM 的起始值

PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//必须确认 PIE 组

//--管理 ADC 寄存器
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1标志

//---读取 ADC 结果
*AdcBufPtR++= AdcbResultRegs.ADCRESULT0;//读取结果

//--蛮力强制循环缓冲器
if (AdcBufPtr ==(AdcBuf + ADC_BUF_LEN))

AdcBufPtr = AdcBuf;//将指针回卷到开头

我的问题是、我在运行代码时看不到 ADC 通道 B0的转换。 我只看到 ADC 通道 A0的转换。 如何将 Adcb0的转换添加到存储器中的 AdcBuf。 我是否需要在主文件中添加更多代码或寄存器?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Hayder、

    首先、您忘记在 PIE 组1中启用 ADCB1中断:

    PieCtrlRegs.PIEIER1.bit.INTx2 = 1;//在 PIE 组1中启用 ADCB1中断

    接下来、您需要创建另一个循环缓冲区(请参阅 Lab.h)

    但愿这对您有所帮助。 如果您的问题得到了解答、请单击绿色的"验证答案"按钮。 谢谢。

    - Ken
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ken、

    我注意到在发布问题后错过了中断使能。
    但是、即使使用中断、我也无法看到 ADCB1的转换。 我尝试创建另一个循环缓冲区、如下所示:

    中断空 ADCB1_ISR (空)// PIE1.2 @ 0x000D42 ADC-B 中断#1

    静态 uint16 * AdcBufPtr1 = AdcBuf1; //指向缓冲区的指针

    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; //将指针回卷到开头


    我在主文件中将 AdcBuf1定义为(uint16 AdcBuf1[ADC_BUF_LEN];)、这与 AdcBuf 的定义类似。 但是、当我构建程序时、ccs7向我显示 adcbuf1未识别。

    如果上部新的缓冲循环正确、我不会这样做?
    此外、您能否为我提供(Lab.h)的链接?

    此致
    Hayder
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Hayder、

    首先、转换在 ADCINB0引脚上、ADCB1是中断。 确保使用正确的引脚(即 CHSEL = 0)。 接下来、您将在 include 文件夹中找到 Lab.h。 它应该位于 CCS 的顶部。

    但愿这对您有所帮助。 如果您的问题得到了解答、请单击绿色的"验证答案"按钮。 谢谢。

    - Ken
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我将输入信号连接到 TMS320F28379D Delfin 实验套件上的引脚12、该引脚对应于 ADCi-B0以及我在寄存器(即 CHSEL = 0)中选择的通道0。  然后我启用 (PieCtrlRegs.PIEIER1.bit.INTx2 = 1;)。

    我在 ADCB1_ISR 文件中收到了创建的新 AdcBuF1循环的生成错误、如下代码所示:

    中断空 ADCB1_ISR (空)// PIE1.2 @ 0x000D42 ADC-B 中断#1

    静态 uint16 * AdcBufPtr1 = AdcBuf1;//指向缓冲区的指针

    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;//将指针回卷到开头


    即使我在 main.c 文件中将错误 AdcBuf1[ADC_BUF_LEN]标识为 UINT16、也无法识别 AdcBuf1;

    如果新的缓冲循环不正确、请举一个正确的例子。 我刚刚尝试从 ADCA1_ISR 中复制 AdcBuf、并针对 ADCB1_ISR 进行了修改。


    此致  

    Hayder

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Hayder、

    在 CCS Project Explorer 窗口中、打开"Includes"文件夹、然后单击"Lab_common"的加号(打开)。 在 Lab_common 中、您将找到 Lab.h 打开 Lab.h 并在底部找到"Global Variables References"。 将缓冲区添加为 extern。 这应该可以解决问题。

    但愿这对您有所帮助。 如果您的问题得到了解答、请单击绿色的"验证答案"按钮。 谢谢。

    - Ken
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ken、

    非常感谢您帮助解决我之前的问题。

    我还有一个问题。 我想使用通过 GPIO28和 GPIO28与 PC 的串行端口连接来显示 adcBuf。 如何执行此操作?

    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Hayder、

    我很高兴这解决了您的问题。 至于开发与 PC 的通信链路、您需要开发此代码。 作为起点、您可以查看 C2000Ware 和 controlSUITE 中的示例。 这些示例是回路示例、因此您需要进行相应的修改。

    - Ken