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.

[参考译文] CCSTUDIO-C2000:任何 F28M36x ADC1文档

Guru**** 2032800 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/651506/ccstudio-c2000-any-f28m36x-adc1-document

器件型号:CCSTUDIO-C2000

您好!  

我正在尝试了解如何对 ADC1进行编程、我是否可以参考任何文档?

我有一些用于初始化的现有示例代码、但当我尝试打印读数值时、它看起来都是0。  

void ADC_Init()

*(unsigned int*) 0x4E58 = 7;//针对 InitAnalogSystemClock() Advisory 的权变措施
if (((** InitAnalogSystemClock)(ACLKDIV4)| 0x8000)!= 0xA005){
//如果返回值不是0xA005,则模拟子系统未正确初始化
ASM (" ESTOP0");
for (;;);

EALLOW;
//初始化模拟子系统并将时钟分频器设置为4分频
while (((** AnalogClockEnable)(AnalogConfig1、ADC1_ENABLE));//启用 ADC 1
while (((** AnalogClockEnable)(AnalogConfig2、ADC2_enable));//启用 ADC 2
(**读取 AnalogClockStatus)(AnalogConfig2);//等待 AnalogClockEnable 函数完成

//在最后一次复位是调试器复位时复位两个 ADC (这不是
//复位 ADC
Adc1Regs.ADCCTL1.bit.reset = 1;

//在调用器件校准之前,等待确保 ADC 不会复位
_asm (" nop");
_asm (" nop");

//校准器件的温度
(**设备校准)();

EDIS;

//Init the ADC
InitAdc1();


//配置 ADC 读数以连续触发(ADCINT1和 ADCINT2之间交替)
EALLOW;
Adc1Regs.ADCCTL2.bit.ADCNONOVERLAP = 1;//启用非重叠模式、即转换和未来采样事件不重叠
Adc1Regs.ADCCTL1.bit.INTPULSEPOS = 0;// ADCINT1在 ADCResults 锁存后跳闸
Adc1Regs.INTSEL1N2.bit.INT1E = 1;//启用 ADCINT1
Adc1Regs.INTSEL1N2.bit.INT2E = 1;//启用 ADCINT2
Adc1Regs.INTSEL1N2.bit.INT1CONT = 1;//启用 ADCINT1连续模式
Adc1Regs.INTSEL1N2.bit.INT2CONT = 1;//启用 ADCINT2连续模式
Adc1Regs.INTSEL1N2.bit.INT1SEL = 3;//设置 EOC3以触发 ADCINT1触发
Adc1Regs.INTSEL1N2.bit.INT2SEL = 1;//设置 EOC1以触发 ADCINT2触发

Adc1Regs.ADCSOC0CTL.bit.CHSEL = 0;//将 SOC0通道选择设置为 ADC1A0 (EOC0)
Adc1Regs.ADCSOC1CTL.bit.CHSEL = 2;//将 SOC1通道选择设置为 ADC1A2 (EOC1)
Adc1Regs.ADCSOC2CTL.bit.CHSEL = 3;//将 SOC2通道选择设置为 ADC1A3 (EOC2)
Adc1Regs.ADCSOC3CTL.bit.CHSEL = 4;//将 SOC3通道选择设置为 ADC1A4 (EOC3)

Adc1Regs.ADCINTSOCSEL.bit.SOC0 = 2;// ADCINT2触发 SOC0
Adc1Regs.ADCINTSOCSEL1.bit.SOC1 = 2;// ADCINT2触发 SOC1
Adc1Regs.ADCINTSOCSEL1.bit.SOC2 = 1;// ADCINT1触发 SOC2
Adc1Regs.ADCINTSOCSEL1.bit.SOC3 = 1;// ADCINT1触发 SOC3

Adc1Regs.ADCSOC0CTL.bit.ACQPS = 25;//将 SOC0 S/H 窗口设置为26个 ADC 时钟周期(25个 ACQPS 加1)
Adc1Regs.ADCSOC1CTL.bit.ACQPS = 25;//将 SOC1 S/H 窗口设置为26个 ADC 时钟周期(25个 ACQPS 加1)
Adc1Regs.ADCSOC2CTL.bit.ACQPS = 25;//将 SOC2 S/H 窗口设置为26个 ADC 时钟周期(25个 ACQPS 加1)
Adc1Regs.ADCSOC3CTL.bit.ACQPS = 25;//将 SOC3 S/H 窗口设置为26个 ADC 时钟周期(25个 ACQPS 加1)
EDIS;


DELAY_US (5000);

// EALLOW;
// PieVectTable.ADCINT1 =&ADC_ISR;
// EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
//
////在 PIE 中启用 ADCINT1
// PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 中启用 INT 1.1
// IER |= M_INT1;//启用 CPU 中断1


//手动启动转换
Adc1Regs.ADCSOCFRC1.bit.SOC0 = 1;//在 SOC0上触发转换
Adc1Regs.ADCSOCFRC1.bit.SOC1 = 1;//在 SOC1上触发转换
Adc1Regs.ADCSOCFRC1.bit.SOC2 = 1;//在 SOC2上触发转换
Adc1Regs.ADCSOCFRC1.bit.SOC3 = 1;//在 SOC3上触发转换

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

    您需要参阅此器件 TRM (技术参考手册)的 ADC 部分。 您可以在此处查看相同内容:
    www.ti.com/.../spruhe8

    您还可以在此处查看其他文档:
    www.ti.com/.../technicaldocuments

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

    您还可以参阅 controlSUITE 或 C2000Ware 中的一些示例、例如 ADC_SoC。

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

    嗨、Tommy、  

    感谢您回来。  

    我在代码中执行了与 C28_ADC 文件类似的步骤、但我在调用 InitAdc1 ()时发现、我的代码将崩溃、并且从调试模式中看不到任何错误

    我必须对该 API 进行注释以使软件运行、但我认为如果没有此 API 调用、ADC 将无法运行、因为我得到的 ADC 值非常小。  

    代码片段:

    //初始化系统控制
    InitSysCtrl();

    //初始化 GPIO
    InitGpio();

    Flash_Init();

    // InitAdc1();//初始化 ADC1

    (笑声)

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

    您是否能够在 InitAdc1()中设置断点并通过函数单步执行以查看哪个语句会导致程序崩溃?

    您是否在闪存或 RAM 之外执行? 如果您在闪存之外执行、是否正在执行 memcpy 过程以将 RAM 函数从闪存移动到 RAM? 如果跳过 memcpy 步骤、delay_US()往往会出现行为错误。

    我建议使用 RAM 构建进行初始开发、因为它更快、并且具有更少的上述复杂情况。

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

    1.你能确认我是否没有调用 InitAdc1(),ADC 块不应该工作,所以我得到较小的值,比如4096中的190个?

    2.我尝试在 InitAdc1()的入口点添加 B.P,但当我从 main 恢复时,我得到下面的错误。
    [C28xx_0]{MODULE#22}:第1022行:E_unPluggedInterrupt:已取消插拔的中断已标记:INTR#19
    xdc.runtime.Error.raise:终止执行
    基本上、我尝试设置断点、但如果我在代码中进行 InitAdc1 () API 调用、我无法设置断点。

    我执行闪存、我想、因为在我的 M3代码中、我确实有这个

    /*闪存 API 函数必须从 RAM 内存中运行。 如果闪存 API 已经存在
    *在 RAM 中、则可以跳过此步骤。
    *
    *不要从闪存运行闪存 API。 *
    memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);

    但是、我在 C28中使用了 API、我是否还需要在 C28代码中使用该 API?

    4.至于 RAM 的构建、我不确定如何将其配置为 RAM 的构建。 我不想为我的发展增加更多的复杂度。 如果这是一个易于配置的步骤、您能告诉我如何操作吗?

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

    [引用 user="chenkun chuang"]1. 您能否确认我是否未调用 InitAdc1 ()、ADC 块不应工作、因此我得到较小的值、比如4096中的190?

    但情况不一定如此。  如果跳过 InitAdc1()、我会将 ADC 的状态视为未知、而不是禁用。

    预期的结果值完全取决于施加到 ADC 引脚上的电压。

    [引用 user="chenkun chuang"]2. 我尝试在 InitAdc1()的入口点添加 B.P,但当我从 main 恢复时,我得到下面的错误。
    [C28xx_0]{MODULE#22}:第1022行:E_unPluggedInterrupt:已取消插拔的中断已标记:INTR#19
    xdc.runtime.Error.raise:终止执行
    基本上、我尝试设置断点、但如果我在代码中进行 InitAdc1 () API 调用、我无法设置断点。 [/报价]

    这可能与在闪存之外执行相关: processors.wiki.ti.com/.../FAQs

    [引用 user="chenkun chuang"]3. 我执行闪存、我想、因为在我的 M3代码中、我确实有这个

    /*闪存 API 函数必须从 RAM 内存中运行。 如果闪存 API 已经存在
    *在 RAM 中、则可以跳过此步骤。
    *
    *不要从闪存运行闪存 API。 *
    memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);

    但是、我在 C28中使用了 API、我是否还需要在 C28代码中使用此 API?

    C28和 M3在代码库和程序执行方面完全独立、因此您还需要 C28的 memcpy。

    [引用 user="chenkun chuang"]4. 至于 RAM 构建、我不确定如何将其配置为 RAM 构建。 我不想为我的发展增加更多的复杂度。 如果这是一个易于配置的步骤、您能告诉我如何操作吗?

    如果您使用的是 controlSUITE 中的示例工程、则可以通过以下方式更改编译目标:右键单击工程或转至 Project 菜单>> Build Configurations >> Set Active >> RAM  

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

    嗨、Tommy、  

    我尝试了一些实验、很高兴其中一些问题得到了解决。  

    1.你能确认我是否没有调用 InitAdc1(),ADC 块不应该工作,所以我得到较小的值,比如4096中的190个?

    但情况不一定如此。  如果跳过 InitAdc1()、我会将 ADC 的状态视为未知、而不是禁用。

    预期的结果值完全取决于施加到 ADC 引脚上的电压。

    [Chenkun]在我的实验中,我需要调用这个 initAdc1();否则,ADC 值为4095而不发生变化。  

    2.我尝试在 InitAdc1()的入口点添加 B.P,但当我从 main 恢复时,我得到下面的错误。  

    [C28xx_0]{MODULE#22}:第1022行:E_unPluggedInterrupt:已取消插拔的中断已标记:INTR#19
    xdc.runtime.Error.raise:终止执行
    基本上、我尝试设置断点、但如果我在代码中进行 InitAdc1 () API 调用、我无法设置断点。

    这可能与在闪存之外执行相关: processors.wiki.ti.com/.../FAQs

    [Chenkun]我发现我不能再回到下一个 B.P. 相反、我必须"步入"、以便能够识别 PC 出错的位置。

     


    解决方案是为该延迟 API 添加 RAM 函数、如前所述。 按照以下步骤解决该问题。

    1.将 F28M36x_usDelay.asm 复制到在另一个文件中调用此 API 的同一文件夹中。  

    2.添加  memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);在 C28的 init 函数中。  

    感谢你的帮助。  

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

    我很高兴你能取得进展。 您的观察结果对我来说是合理的。

    Tommy