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.

[参考译文] CCS/TMS320F28377D:单个 ADC 模块的 ADC 值错误

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/678288/ccs-tms320f28377d-wrong-adc-values-of-a-single-adc-module

器件型号:TMS320F28377D
Thread 中讨论的其他器件:controlSUITE

工具/软件:Code Composer Studio

您好!

我尝试通过微控制器上 ADCD 模块的通道 ADCDIN2和 ADCDIN3 (电压适用于两个通道、直接通过万用表在 ADC 通道引脚处测量)转换2.5V 直流电压而不产生基本噪声。 AdcdRegsiters 的控制权交给 CPU2、两个 SOC 的触发也由 CPU2完成。 两个项目(每个内核一个项目)都是具有操作系统的项目。 这两个 SOC 每10毫秒由操作系统的时钟模块触发一次。 预期值为2.5/3.3*4096=3103,因为我以12位分辨率运行。

问题本身如下所示:AdcdResultRegister 显示的值大约为2300、而不是预期的大约3100。

我观察到的情况:我还让 ADCA 模块按 预期工作、在我 的应用程序中不会出现错误、我初始化并触发了错误(我将在我的文本末尾发布我的代码)、其方式与 ADCD 模块完全相同。

我在事故中观察到的情况: 当我在 CPU2上加载 CPU1的.out 文件时、让它运行、不要重置器件、在 CPU2上加载 CPU2的正确.out 文件并让该程序运行后、ADCD 模块按预期工作、并在 AdcdResultRegister 中显示大约为3000-3100的值! 当我复位器件时、必须首先在 CPU2上运行 CPU1 .out 文件、然后 ADCD 才能按预期再次运行。 在我看来、CPU1的.out 文件中的某些内容会初始化微控制器中的某些内容、这是 ADCD 模块正常工作所必需的(但显然对于 ADCA 模块来说不是必需的、因为这在内核的正常加载和运行时可以正常工作)、 在器件复位时将删除该位。

我希望你们能为我提供一些建议,我会提前表示感谢。

 

 

CPU1代码:

MAIN_1.c:

int main()
{
system_printf ("enter main ()\n");
InitGpio ();
InitDrehzahlsensoren ();
InitSF_DC_Test ();
#ifdef _standalone
IPCBootCPU2 (C1C2_Brom_bootmode_boot_boot_boot_f_floin);
#endif
BIOS_start();
返回(0);
} 


Drehzahlsensoren_1.c:

#include 


//Initializiert Die eCAP1 Peripherie、Die Flanken des Drehzahlsensors 1 erkennt
void InitDrehzahlerkennung_1 ()
{
EALLOW;InputXlak.INPUTSELECTLOelt.BIT.INECT
T7SELIS= 0;// INPUCC1
INTRENTRUSTU1.INTREN.INPUTINTRENTRU1.INTRENTRENTREN.INTRENTRENTRU1.INTRENTRENTRENTRU1.INTRENTRENTRENTRU1.INTRIP1

= 0;// INTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRENTRU1.INTRENTRENTRENTRENTRENTRU1.INTRENTRENTRENTRU1.INTRU1.INTRENTRENTRENTRU1.INTRU1.INTRENTRENTRENTRENTRENTRENTRU1.



//Initializiert Die ECap2 Peripherie、Die Flanken des Drehzahlsensors 2 erkennt
void InitDrehzahlerkennung_2 ()
{
EALLOW;InputXlectLOelt.bit.INECT
T8SELCLIS= 0;// INPUT8
INPUBLDER8

= INTREN.INTRENTRENTRU8;INPUTINTRENTRU8 INTRENTRENTREMORT.INTREN.INTRENTRENTREMENTRENTRU8 = 0 = INTRENTRU8 INTRUTRENTRENTRUTRUTREN.INTRUTRENTRENTREMORT8 INTRIPERENTRENTREMENTREMEN.INTREMENTRENTRENTRENTREN.INTREN.INTREMENTREMENTREMENTREN.INTREMEN.INTREMEN.INTREN.INTRIPERENTREN.INTRENTRENTRENTRENTRENTREN.INTR











void InitDS_DC_Test (){EALLOW;DevCfgRegs.CPUSEL11.bit.ADC_D = 1;//ADCD 寄存器未发送 CPU2 verbunden EDIS;}//Initializiert Die ECap3 Peripherie、Die das PWM Signal für Initialersten ADC erbunund Pusht Initit;
}UTPU2

(PLUG_OUTFPU3)、GPIO3 (PGCTRU3)、GPIO3 (PLU_OUTFPU3)、GPIO3 (PUTU3)//GPIO3线性输出 konfiguriert
EALLOW;
OutputXbarRegs.OUTPUT2MUX0TO15CFG.bit.MUX4 = 3;//Der ECap3输出线性发送 MUX4 der OUTPUTXBAR2 verbunden OutputXbarRegs.OUTPUT2MUXENAB4 = 3
;// DCCEST.USTR1 = UCC3/ UCC3/ UTRUTRUT1 = UCCEST.USTRUTRUT1 = USTRUT1 = USTRUT1 = UTRUTRUSTRUTRUSTRUT1 = UTRUTRUTRUSTRUTRUTRUTRUT1 = UTRUTRUTRUTRUTRUTRUTRUTRUTRUTRUT1 =




//Initializiert 裸片 ECap4 Peripherie、Die das PWM Signal für den zweiten ADC erzeugt
void InitADC2MCLK ()
{
GPIO_SetupPinMux (2、GPIO_MUX_CPU2、5);//GPIO2 wivon CPU2 gesteuround OUTPUTXBAR1 (2
、GPIO2);GPIO2输出引

脚2、GPIO2、GPIOMUTRUTRUTRU1、GPIO2、GPIOMUTRUTRUTRU2、GPIOMUTRU1、GPIOUTX6、GPIOUTRUTRUTRUTRU0、GPIOUT2、GPIOMUTRUTRU0、GPIOUTRUTRU0、GPIOUTU//Der ECap3输出 wid mUX4 der OUTPUTXBAR1 verbunden
OutputXbarRegs.OUTPUT1MUXENABLE.bit.MUX6 = 1;//Der Slot MUX4 der OUTPUTXBAR1 wrd aktiviert DevCfgRegs.CPUSEL1.bit.MUX6 = 1;// Dedtinitzh
(



1) INCLK = 1;



ENCH INCLITH (1) INCLK = 1) INITH (INCLK) INCLK (ENCH 1) INITH (ENCH INCLK);INCLINITH (INCLK = INCLK) INITH (ENCH 1) INCLK (ENCH INITH (ENCH) INCLK) INITH (ENCH INITH (ENCH 1) INCLK (INCLINITH (ENCH) INIT





Schwingungsfuehler_1.c:

#include "Schwingungsfuehler_1.h"

void InitSF_DC_Test ()
{
EALLOW;
DevCfgRegs.CPUSEL11.bit.ADC_A = 1;//ADCA 寄存器未发送 CPU2 verbunden
EDIS;
}

CPU2代码:

 


MAIN_2.c:

#include 
#include 
#include 
#include 
#include "main_2.h"

int main ()
{
system_printf ("enter main()\n");
InitDrehzahlsensoren();
InitSF_DC_Test ();
BIOS_start();
返回(0);
} 

Drehzahlsensoren_2.c:

#include

//Initializiert Die eCAP1 Peripherie、Die Die Flanken des Drehzahlsensors 1 erkennt
空 InitDrehzahlerkennung_1 ()

   EALLOW;
   CpuSysRegs.PCLKCR3.bit.ECAP1 = 1;                   //eCAP1 bekommt den Betriebstakt
   ECap1Regs.ECCTL1.bit.CAP1POL=0;                   //CEVT1 wrd bei steigender Flanke gefeuert
   ECap1Regs.ECCTL1.bit.CAP2POL=0;                   //CEVT2 wrd bei steigender Flanke gefeuert
   ECap1Regs.ECCTL1.bit.CAP3POL=0;                   //CEVT3前侧保险丝 Flanke gefeuert
   ECap1Regs.ECCTL1.bit.CAP4POL=0;                   //CEVT4前侧转向器 Flanke gefeuert
   ECap1Regs.ECCTL1.bit.CTRST1 = 1;                   // Zähler 线 zurückgesetzt CEVT1
   ECap1Regs.ECCTL1.bit.CTRST2 = 1;                   // Zähler 线性 zurückgesetzt CEVT2
   ECap1Regs.ECCTL1.bit.CTRST3 = 1;                   // Zähler 线 zurückgesetzt CEVT3
   ECap1Regs.ECCTL1.bit.CTRST4 = 1;                   // Zähler 线 zurückgesetzt CEVT4
   ECap1Regs.ECCTL1.bit.CAPLDEN = 1;                   //cap Register werden mit time-Stps der jeweiligen CEVTS geladen
   ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;                   // Zähler des ECAP1 wrd gestartet
   ECap1Regs.ECEINT.BIT.CEVT1 = 1;                      //CEVT1 feuert einen eCAP1-在 Richtung CPU 中进行中断
   EDIS;


//Initializiert Die ECap2 Peripherie、Die Die Flanken des Drehzahlsensors 2 erkennt
空 InitDrehzahlerkennung_2 ()

   EALLOW;
   CpuSysRegs.PCLKCR3.bit.ECAP2 = 1;      //ECap2 bekommt den Betriebstakt
   ECap2Regs.ECCTL1.bit.CAP1POL=0;      //CEVT1 wrd bei steigender Flanke gefeuert
   ECap2Regs.ECCTL1.bit.CAP2POL=0;      //CEVT2 wrd bei steigender Flanke gefeuert
   ECap2Regs.ECCTL1.bit.CAP3POL=0;      //CEVT3 wrd bei steigender Flanke gefeuert
   ECap2Regs.ECCTL1.bit.CAP4POL=0;      //CEVT4 winitrd bei steigender Flanke gefeuert
   ECap2Regs.ECCTL1.bit.CTRRST1 = 1;      Zähler Ω 线性 zurückgesetzt CEVT1
   ECap2Regs.ECCTL1.bit.CTRST2 = 1;      Zähler Ω 线性 zurückgesetzt CEVT2
   ECap2Regs.ECCTL1.bit.CTRST3 = 1;      // Zähler 线性 nach CEVT3 zurückgesetzt
   ECap2Regs.ECCTL1.bit.CTRRST4 = 1;      // Zähler 线性 zurückgesetzt CEVT4
   ECap2Regs.ECCTL1.bit.CAPLDEN = 1;      //CAP 寄存器未发送时间戳记、Jeweiligen CEVT geladen
   ECap2Regs.ECCTL2.bit.TSCTRSTOP = 1;      // Zähler DES ECAP2 wrd gestartet
   ECap2Regs.ECEINT.BIT.CEVT1 = 1;         //CEVT1 feuert einen ECap2 - Richtung CPU 中的中断
   EDIS;


空 InitDS_DC_Test ()

   EALLOW;
   CpuSysRegs.PCLKCR13.bit.ADC_D = 1;             //ADCD bekommt den Betriebstakt
   AdcdRegs.ADCCTL2.bit.prescale = 6;             //ADCLK = SYSCLK/4
   AdcSetMode (ADC_ADCD、ADC_Resolution_12位      //ADCD auf 12位 Auflösung und Singlemode eingestellt
                、ADC_SIGNALMODE_SINGLE);
   AdcdRegs.ADCCTL1.bit.ADCPWDNZ = 1;             //ADCD wrd eingeschalettet
   DELAY_US (1000);                            //1ms Wartezeit um ADCD komplett hochfahren zu Lassen
   AdcdRegs.ADCSOC0CTL.bit.CHSEL = 2;             //SOC0 kon眩 晕 Kanal 2.
   AdcdRegs.ADCSOC0CTL.bit.ACQPS = 15;             //SOC0 S&H 窗口、具有16个 SYSCLK eingestellt
   AdcdRegs.ADCSOC0CTL.bit.TRIGSEL = 0;         //SOC0线对软件 getriggerert
   AdcdRegs.ADCSOC1CTL.bit.CHSEL = 3;             //SOC1 kon眩 晕 Kanal 3.
   AdcdRegs.ADCSOC1CTL.bit.ACQPS = 15;             //SOC1 S&H 窗口、具有16个 SYSCLK eingestellt
   AdcdRegs.ADCSOC1CTL.bit.TRIGSEL = 0;         //SOC1线性导入软件 getriggerert
   EDIS;


void starteADCWandlungDS_DC ()      //alle 10ms

   AdcdRegs.ADCSOCFRC1.bit.SOC0 = 1;   //SOC0具有 getriggerert;Abtetung Kanal 2.
   AdcdRegs.ADCSOCFRC1.bit.SOC1 = 1;   //SOC1具有 getriggerert;Abtetung Kanal 3.


//Initializiert Die ECap3 Peripherie、Die das PWM Signal für den ersten ADC erseugt
空 InitADC1MCLK ()

   CpuSysRegs.PCLKCR3.bit.ECAP3 = 1;                   //ECap3 bekommt den Betriebstakt
   ECap3Regs.ECCTL2.bit.CAP_APWM = 1;                   //ECap3模式
   ECap3Regs.CAP1 = 20000000;                         //裸片 Periodaauer PWM beträgt 100ms
   ECap3Regs.CAP2 = 5000000;                         //裸片开启时间器 PWM beträgt 25ms
   ECap3Regs.ECCTL2.bit.TSCTRSTOP = 1;                   //Der Zähler des ECap3 wrd gestartet
   EDIS;


//Initializiert DIE ECap4 Peripherie、Die das PWM Signal für den zweiten ADC erzeugt
空 InitADC2MCLK ()

   EALLOW;
   CpuSysRegs.PCLKCR3.bit.ECAP4 = 1;                   //ECap4 bekommt den Betriebstakt
   ECap4Regs.ECCTL2.bit.CAP_APWM = 1;                   //ECap4模式
   ECap4Regs.CAP1 = 20000000;                         //裸片 Periodaauer PWM beträgt 100ms
   ECap4Regs.CAP2 = 5000000;                         //裸片开启时间器 PWM beträgt 25ms
   ECap4Regs.ECCTL2.bit.TSCTRSTOP = 1;                   //Der Zähler des ECap4 wrd gestartet
   EDIS;


//中断例程 zum Verarbeiten DER 时间戳 des eCAP1-Moduls für Die Berechnung
//von Drehzahl und Periodendauer
void hon_timestams_1 ()

   RPM_1 =(1.0/(ECap1Regs.CAP1*(1.0/CCP_FREQ))))*60.0;   // Berechnung der Drehzahl
   periodode_1 = ECap1Regs.CAP1*(1.0/CPU_FREQ);         // Berechnung der Periodaauer
   ECap1Regs.ECCLR.bit.CEVT1 = 1;                   //CEVT1中断标志 löschen
   ECap1Regs.ECCLR.bit.INT = 1;                   //eCAP1-Interrupt-Flag löschen


//中断例程 zum Verarbeiten DER 时间戳 des ECap2-Moduls für Die Berechnung
//von Drehzahl und Periodendauer
void hon_timestams_2 ()

   RPM_2 =(1.0/(ECap2Regs.CAP1*(1.0/CCP_FREQ))))*60.0;   // Berechnung der Drehzahl
   periodode_2 = ECap2Regs.CAP1*(1.0/CPU_FREQ);         // Berechnung der Periodaauer
   ECap2Regs.ECCLR.bit.CEVT1 = 1;                   //CEVT1中断标志 löschen
   ECap2Regs.ECCLR.bit.INT = 1;                   //ECap2-Interrupt-Flag löschen


void DS_DC_Test_1 ()

   POWER_DS1 = AdcdResultRegs.ADCRESULT0;


void DS_DC_Test_2 ()

   power_ds2 = AdcdResultRegs.ADCRESULT1;


空 InitDrehzahlsensoren()

   InitDrehzahlerkennung_1 ();
   InitDrehzahlerkennung_2();
   InitADC1MCLK();
   InitADC2MCLK ();
   InitDS_DC_Test ();


Schwingungsfuehler_2.c:

#include "Schwingungsfuehler_2.h"

void InitSF_DC_Test ()
{
EALLOW;
CpuSysRegs.PCLKCR13.bit.ADC_A = 1;//ADCA bekomden Betriebstakt
AdcaRegs.ADCCTL2.bit.prescale = 6;ADCA bekomden BECClemstakt Adcle.ADC12_ADCK_Resolutions/ADC12_ADCK_12
Auflösung;ADCK_12 / ADCK_ADCK_ADCK_12位 ADCK_Resolutions/ADCK_4 (ADCK_12)
ADC_SIGNALMODE_SINGLE);
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;//ADCA 无线网络延迟
_US (1000);//1ms Wartezeit um ADCA komplett 寄存器 hchfahren
AdcaRegs.CS0.ADCSOC0
= ADCTR0;ADCSOC0 = ADCTR0 = ADCTR0;ADCSO0 = ADCTR0 = ADCTR0。

//SOC1 konigert Kanal 1
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 15;//SOC1 S&H 窗口具有16个 SYSCLK 获取存储
器。ADCSOC1CTL.bit.TRIGSEL = 0;//SOC1 WIRG REGLES 软件获取



1个 SYSCLK;ADC1COVERT = 0;ADCEST.ADC1.ADC1.ADCf 0;ADCESR = ADC1.ADC1.ADCf


Abultung Kanal 1
}

void SF_DC_Test_1 ()//tetalle 10ms
{
if (periode_1 > 0.1)//wenn Unwuchtsignal unter 10Hz (600 u/min)
{
static uint16 counter = 0;// Zählervariable für tisle berits abgetasersumte
static UwuchtSIGNAL unter 10Hz (600 u/min)}{static uintele+ für
adt uerteldas 0;// ademe+ adtesfers/admes+ rumersum_sensume+ rumersume+ rumersumes+adtes+ rumersumersume+ adtures+ ademe+ ademe+ adtes+
// Erhöhen der Zählervariable
if (counter >= perode-1/0.01)//wenn eine perode abgetastet wurde
{
mittelwert_summe // counterSumme der Abstitwertte durch Anzahl der Abmitwerte_SF_signal_1
= mittelwert_summe;// Division der Amteltenwest_durme
= ten = telten / telten beträgt zurücksetzen für
è re durten = ten / tesn sumertelten = teneert f richten dures/ tesn// Zählervariable zurücksetzen für neue Berechnung
}
}}}else//wenn Unwuchtsignal über 10Hz (600 u/min)
{
dc_sf_signal_1 = AdcaResultRegs.ADCRESULT0;//gleichspannung des ersten





perist der aktuelle Abwert}}sf_ase_DC (10u2)/unstatic tunt (1)/ei20Hz

(10u/uelt)// Zählervariable für bereits abgetastete Werte
static uint32 mittelwert_summe = 0;//变量 für das aufsumieren der Abstitwerte_summe
+= AdcaResults.ADCRESULT1;//fturmieren des aktuellen Abbwertes

>2 Erhöhen/ eastere+

计数器/eurtene+/ e+计数器/eetr/ eureriperipere+= 0.01 μ Zählervariable//除法器 Summe der Abstitwerte durch Anzahl der Abtichtwerte
dc_sfon_2 = mittelwert_summe;// Gleichspannung des zweiten SFS beträgt ertelten Mitwert
mittiwert_summe = 0;// Summenvariable zurücksetzen für neue Berechnung
Zählervariable zurücksetzen für

über /esfn = 0;//

adt1 dc/uncheminuenu = 600 dc/esfuenu/esfr = 0//Gleichspannung des zweiten SFS ist der aktuelle Abchetwert
}




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

    这是适合您的应用的 TI 电路板还是定制电路板? 我不希望看到 VREFHI = 3.3V、而是希望它为2.5V 或3.0V。

    我认为调试的第一步是在 CPU2上加载并运行 CPU2代码、然后在"Expressions"窗口中检查 ADC-D 与 ADC-A 的设置。 检查 ADC 加电、时钟启用、SOC 通道、S+H 和触发选择是否正确等基本内容

    现在、在 CPU2上运行 CPU1代码、然后再次检查 ADC-D 寄存器以查看发生了哪些更改。

    如果您没有发现任何 ADC-D 寄存器发生了变化、那么您可能会对 CPU1代码正在解决的 ADC 触发器有一些问题;您可以应用类似的调试策略并在这两种情况下检查寄存器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Devin、

    感谢您的回复、

    我使用的是定制板、通过万用表测量、我确保了 VERFHI 的3.3V 电压。

    我还在 CPU2上运行 CPU2代码时检查了它们寄存器中的 ADCA 和 ADCD 设置、没有区别。

    即使我随后在 CPU2上运行 CPU1代码、ADCA 和 ADCD 寄存器之间也没有区别。

    此外、在这两种情况下、ADCD 重定位器本身也没有差异。 (如果 ADCD 模块工作正常、则 ADCD 寄存器的条件相同;如果 ADCD 模块工作不正确、则情况相同)。

    ADCSOCxCTL 寄存器的行为与 ADCD 寄存器相同、模块 ADCA 和 ADCD 之间没有变化(在 CPU1代码运行后和 CPU2代码运行后)、在正确的工作情况和非正确的工作情况之间没有变化。

    还有其他想法吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的另一个观察结果是:当我通过关闭电源来重置(定制)开发板时、即使我一开始不在 CPU2上运行 CPU1代码、ADCD 模块也能正常工作。 通过 CCS 调试器进行的复位似乎与通过从开发板上拔下电源进行的复位不同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Alexander、

    绝对是一个奇怪的问题。   

    需要检查的其他事项:

    • 是否确定两个内核的时钟设置都正确?  您可以在引脚上获取调试时钟、然后通过以下方式对其进行测量:
      • 通过更改 CLKSRCCTL3寄存器的 XCLKOUTSEL 域来选择各种时钟。  可能需要注意 的是 CPU1.SYSCLK 和 CPU2.SYSCLK
      • 在 GPIO73的 GPIO 多路复用器中启用 XCLKOUT
      • 置位(或至少只了解默认值) XCLKOUTDIVSEL 寄存器中的 XCLKOUT 分频器
    • 如果您向 ADCIN14或 ADCIN15输入信号、则相同的引脚电压跨接至所有 ADC 上的内部 ADC 连接。  如果您的硬件可以使用这些引脚、这可能是检查是否将完全相同的信号强制发送给两个 ADC 的好方法。  

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

    我已经测试了 Devin 建议的所有内容:两个内核的 SYSCLK 都是200MHz、一切都正确。
    当我向 ADCIN14和15施加电压时、ADCD 读数正确。
    似乎与我施加到 ADCD 模块输入端的电压有关。

    我发表了以下意见:
    当我增加软件中相关输入的采样保持窗口大小时、ADCD 模块显示正确的值。

    我试图向我解释这一点:
    我通过分压器向输入施加电压。 我可以想象、电容式 S&H 电路的路径在电路闭合时具有如此低的阻抗、分压器的比率变化很大、以至于我的输入端的电压崩溃或至少低于预期值。 当 S&H 电路开路时、保持电容器的负载放电速度有多快? (我想知道为什么在 S&H 电路闭合时、即使 S&H 窗口尺寸太小、电压也不会逐步升高、直到达到其最终值2.5V。)

    现在、我无法向我解释的是:
    当我复位器件时、它会正常工作(在软件中不增加 S&H 窗口)。
    当我只加载程序并运行内核时、它可以正常工作(不增加软件中的 S&H 窗口)
    很明显、复位过程中的某个操作会增加 S&H 窗口的大小、而不会让我知道(寄存器不会显示 ACQPS 中的任何更改)。非常奇怪的是!!


    在不同的复位过程中会发生什么(调试器复位、POR 复位等) 我不明白。

    也许有人可以向我展示不同复位过程中会发生什么情况(哪些寄存器被删除、哪些配置被复位等...)

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

    您好、Alexander、

    在数据表的"单端输入模型"部分中有一个 ADC 输入模型。  您应该假设 S+H 电容器、Ch、在 S+H 阶段开始时可以是任何值。   

    如果您使用分压器、则可能需要一个运算放大器、以显著增加 S+H 持续时间、或在 ADC 输入端放置一个大电容器。  增加 S+H 持续时间(通过增加 ACQPS)将使采样花费更长时间、从而增加采样到输出的延迟。  在引脚上添加一个大电容器将导致采样率限制、否则电荷将以比重新充电更快的速度从外部电容器中释放出来(并且输入带宽将显著减少、这可能是好的或坏的)。  运算放大器将需要电路板面积/成本。   

    奇怪的是、您有时会在不增加 S+H 持续时间的情况下获得良好的结果。  真正影响 S+H 持续时间的唯一因素是 ACQPS 设置和 SYSCLK 速度、您已确认这两种情况在两种复位场景之间是相同的?   

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

    在过去的几天里、我实施了另一个使用 ECAP 模块的应用。
    在这里、我还可以观察到不同复位(程序加载)场景之间的不同行为。
    我发现在这两种情况下 SYSCLK 并不相同(在 Devins 建议之后、可能无法正确测量)、因为在一种情况下、ECAP.CAP1寄存器中的错误值被精确的系数20计算在内! (似乎是 PLL 的积分乘法器)。在另一种情况下、计数正确的值。 AFAIK 唯一的原因是在这两种情况下时钟速度不同。 这将解释不同复位情况下不同的 S&H 窗口持续时间(程序闪存是否完全是复位????、程序闪存到底会发生什么?? 在我看来、虽然与原始线程打开应用程序的 ACQPS 值相同、但我觉得正在发生一整套我无法理解的事情、并且当我刷写程序或重置器件或内核时、我在调试器中看不到这些事情。
    刷写两个内核上的程序后、当我使用两个内核的正确程序(CPU1上的 CPU1 CPU2代码位于 CPU2上)连续启动两个内核时、我发现 CPU1.SYSCLK 为10MHz (!!!) (通过 gpio73上的 XCLKOUT)、这是不正确的、因为我已经通过 BIOS 中的乘法器将它调整为200MHz。
    我的 ECAP 模块确实在 CPU2上运行、但由于 CPU2.SYSCLK 直接源自 CPU1.SYSCLK、因此它们之间没有差异。
    现在、当我在 CCS 中通过调试器复位 CPU1时、SYSCLK 完全处于调整后的200MHz 值。
    当我在 CCS 中单击"调试"时、SYSCLK 似乎没有得到适当的调整、程序会被刷写、但在调试器进行内核复位后、它会得到适当的调整。

    有人能向我解释这种行为吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Alexander、

    我将通知 PLL/Clocking 专家跟进您的情况。 同时、如果您可以描述如何以及何时配置系统中的时钟以及初始化代码的 POST 代码段、则调试过程可能会加快。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Devin、

    我附加了我的主要方法和 BIOS 配置的屏幕截图(其中进行了 PLL/时钟调整)。

    如果您需要、请随时与我联系、了解更多详细信息。

    我提前表示感谢

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

    为了响应 SYSCLK 频率不是预期的频率:

    看一下代码的片段、您会发现您在 GPIO73上推出 SYSCLK 时并未将其分频(XCLKOUTDIV=0)。 这将不起作用、因为 IO 缓冲器无法快速切换、因此即使 SYSCLK 以更高的速度运行、如果不对时钟进行分频、IO 也不支持此类快速切换(在本例中为200MHz)。 建议在 GPIO 上输出的最大时钟频率为50MHz。

    您能否将代码更改为使用 XCLKOUTDIV=0x3 (8分频)? 这将把 SYSCLK 除以8、即200MHz/8 = 25MHz。 因此、如果 PLL 被正确锁定、您应该观察到 GPIO73上的25MHz。

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

    Nirav、您好!

    当我将 XCLKOUTDIV 保持在其值0x0时、我可以在刷写程序并启动内核之后直接在示波器上看到10MHz。 (故障情况;SYSCLK 不正确、因数恰好为20)

    相同的0x0 XCLKOUTDIV 在内核的调试器复位后在示波器上显示200MHz。 (正确案例)

    当我将 XCLKOUTDIV 设定为一个值0x3 (被8分频)时、我可以在刷写程序和启动内核之后直接在我的振荡器上看到1.25MHz。 (故障情况;SYSCLK 不正确、因数恰好为20)

    相同的0x3 XCLKOUTDIV 在内核的调试器复位后在示波器上显示了25MHz。 (正确案例)

    现在的问题是、我的 SYSCLK 在一种情况下(只刷写程序并启动内核)出现故障、而在另一种情况下(在内核的调试器复位然后启动内核之后)出现问题

    我已经观察到、在正确的情况下、SYSPLLMULT 寄存器中的 IMULT 的十进制值为20、在故障情况下、它的值为0。 (为什么???)  这完全符合我所描述的失败。

    感谢您提供更多建议、说明为什么我的 IMULT 在不同情况下有所不同。

    我提前表示感谢

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

    根据您所描述的观察结果、当您测量故障 SYSCLK 时、似乎未配置 PLL、即10MHz/1.25Mhz (div/3)、10MHz 来自默认 SYSCLK 的 INTOSC2。

    您能澄清一下吗:
    PLL 配置何时发生? 根据您的代码片段、您在代码开始时立即推出 XCLKOUT、因此最初您将在 GPIO73上看到10MHz (因为默认的 SYSCLK=INTOSC2=10MHz)、直到您将 PLL 配置为 SYSCLK=200MHz。

    2. BIOS_start()函数的作用是什么? 它是否将代码编程到闪存中、其中包括用于 PLL 配置的代码?


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

    Nirav、您好!

    实际上、在 SYSCLK 出现故障的情况下、SYSPLLMULT 寄存器中不仅有一个 IMULT 为0、CLKSRCCTL1寄存器中也有一个 OSCCLKSRCSEL 值为0。 在故障情况下、似乎没有进行完整的时钟配置。

    [引述 USER="Nirav Gintala">您能否澄清:

    PLL 配置何时发生? 根据您的代码片段、您会在代码开始时立即推出 XCLKOUT、因此最初您会在 GPIO73上看到10MHz (因为默认的 SYSCLK=INTOSC2=10MHz)、直到您将 PLL 配置为 SYSCLK=200MHz。[/QUERP]

    我不知道 PLL 配置何时发生、我只是使用操作系统创建了一个 CCS 项目、并使用了给定的 CCS 模板。 然后、我配置了 app.cfg、正如您在上面的屏幕截图中看到的那样。 操作系统专家可能会说时钟配置何时实际发生。

    [引用用户="Nirav Ginwala ]2. BIOS_start()函数的作用是什么? 它是否会将代码编程到闪存中、其中包含 PLL 配置的代码?

    默认情况下,在创建带有操作系统的 CCS 工程时,会将 BIOS_start()函数插入主方法代码中。 我认为它开始了操作系统的调度、包括其所有任务、时钟、计时器等。 也许操作系统专家在这里也更有能力。

    此致、Alexander

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

    您正在使用哪个版本的 SYS/BIOS?

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

    您好!

    我使用的是6.52.00.12版。

    亚历山大

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

    您好!

    我提出的另一项意见是:
    当我只在 CPU1上刷写程序时、我可以看到 ClkCfgRegs 处于其正常状态、并且具有预期的值(OSCCLKSRC =外部振荡器、IMULT = 20)。
    现在、当我在 CPU2上刷写程序并再次查看 CPU1以观察其寄存器时、我会看到其 ClkCfgRegs 保存默认值(OSCCLKSRC =内部振荡器2、IMULT = 0)、这些值是错误的。
    现在,当我重新启动 CPU1并让它运行到其 main()时,值再次处于其正确状态。

    因此、在我看来、CPU2的闪存/启动过程中(直到它在 main()之前停止)会清除 CPU1的 ClkCfgRegs 并/或将它们设置为默认值、因此我必须再次运行 CPU1的复位/启动过程以获得正确的时钟/ PLL 设置。

    有人对此有什么想法吗?

    向 Alexander 致意

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

    进入 main 后、您是否曾尝试使用 controlSUITE API 来设置时钟?

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我可以将其标记为已解决吗?

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

    您好!

    很抱歉、没有解决。

    我还尝试在主方法中使用 API 函数"手动"设置时钟。 在这种情况下、一切都按预期正常工作。

    您好 Alex

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

    您能否附上您为使其正常工作而执行的"手动"代码?

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    int main()
    {
    system_printf ("enter main()\n");
    InitGpio();
    InitSysPll (1、20、0、 0);//手动代码
    InitDrehzahlsensoren ();
    InitSF_DC_Test ();
    InitADC_ext ();
    InitHMS ();
    #ifdef _standalone
    IPCBootCPU2 (C1C2_Brom_bootmode_boot_boot_boot_f_ffrom _flash);
    #endif
    BIOS_start();
    返回(0);
    } 

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

    我打开了一个 Jira 票证:SYSBIOS-694

    当我们有更多信息时、我们会向您回复。 听起来好像您现在有办法解决问题、因此我将把它标记为"TI 认为已解决"、我们将使用 Jira 工单在内部进行跟踪。

    注意:我预计这将需要一段时间才能解决、因为它不是一个高优先级(由于可用的解决方案)。 此线程可能会同时锁定。 我们将解锁并发布更新。

    Todd