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.

[参考译文] RM48L952:需要关于 TI 芯片 Hercules 的帮助 RM48L952ZWT 在 N2HET1上生成48kHz 时钟[8]根据 TI 示例数据表

Guru**** 2529560 points
Other Parts Discussed in Thread: HALCOGEN, RM48L952

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1345970/rm48l952-need-help-for-ti-chip-hercules-rm48l952zwt-generating-48-khz-clock-on-n2het1-8-per-ti-example-datasheet

器件型号:RM48L952
主题中讨论的其他器件:HALCOGEN

我正在尝试按照 TI 数据表(spna227.pdf)来触发具有 N2HET 计时器的 ADC1。

我需要 NHET 来生成48kHz 触发信号。

使用 Hercules MCU 上的内部计时器事件触发 ADC

我理解该数据表。  我以此为例、使用 HET 汇编程序创建了 N2HET 微机程序。

问题是、我不知道如何设置以下参数来使环路正确计数、因此 N2HET 生成一个48kHz 周期性触发信号。

这里是我的程序、摘自 TI 文档(spna227.pdf)

L00 CNT {REG=A、最大值=8、数据=0}
l01 ecmp{next=L00、hr_lr=高电平、en_pin_action=on、pin=8、action=PULSELO、 REG=A、DATA=4、hr_data=0}

看起来我可能需要在一个(或两个) HALCoGen 和 N2HET IDE 中调整以下部分或全部参数、但我不确定所有数学运算是如何工作的:

  • 在 HALCoGen 中
    • 在选项卡 RM48L952 --> GCM 中
      • VCLK2分频器 (用于使 VCLK2)
    • 在 HET1 --> HET1全局计时配置中
      • HR 预分频
      • LR 预分频
      • (我曾尝试设置这些、但似乎需要在 HET IDE 汇编器工具中进行设置)
  • 位于 HET IDE 汇编器工具中
    • " 最大值=8 "  (来自程序、L00、上面的)
    • " 数据= 4 "(来自上述程序 L01)

此外、当我将 HALCoGen 中的 VCLK2从100MHz 的默认速率更改为其他值时、我们使用的 Hercules 开发套件默认"C"代码不能引导、并在 PCB 的 RAM 初始化阶段挂起。  这对我来说似乎很奇怪、但是改变时钟速率也许会在 HET 外设的缺省自检中引起一个时序问题?  我不确定这一点。

到目前为止、我花了大约3天时间尝试找出这一点、但我似乎并不了解 HET 程序和 HET 时钟分频器电路中涉及的数学运算。

好消息是我的测试设置在工作,我确实看到一个86.xxx kHz 周期方波在 N2HET1 [8]的输出,所以我知道环路正在运行,我只是有错误的频率。

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

    新信息。  我在 HET IDE 中找到了 PWM 发生器、并使用它来生成以下代码:

    ;给定 HCLK 频率= 100MHz ,PWM 频率= 0.048MHz ,占空比= 0.5%,HETPFR 值=0如下:

    L00 CNT{reg=A、max=2082、data=0}
    l01 ecmp{next=l00、hr_lr=高电平、en_pin_action=on、pin=8、action=PULSELO、reg=a、data=1041、hr_data=0}

    我将示波器放在输出引脚 N2HET1[8]上,但波形的测量值是375Hz ,而不是48kHz。  

    但是、如果您计算48,000/ 375 = 128、则频率会下降128倍。  

    那么、我查看 HET1缩放寄存器、发现 HALCoGen 默认使用二进制的"111"填充 HETPFR[10:8]、这对应128个比例因子。  因此、在加载代码并启动后、我用"0"覆盖此寄存器中的"111"、但得到:

    --> 根本没有输出时钟波形 。  

    --->所以,我做一些测试。  

    在 HALCoGen 为程序集成了 HET IDE *。h 和*。c 文件中的代码后,我在 Hercules 开发套件中编译并加载代码,通过将程序复制到 HET RAM 中的 hetInit ()运行代码,然后

    ->修改 het.c 中的输出 HALCoGen 启动代码,发现当我更改 HETPFR[10:8]中的值时,按照以下所述,运行代码时会发生以下情况(见表):

    二进制 HETPFR[10:8] 频率(Hz)
    111 375
    110 750
    101 1500
    100 3000
    011 6000
    010 12000
    001 (引脚8上无时钟输出)
    000 (引脚8上无时钟输出)

    所以、就在我想通过把'000'(二进制)值放入 HETPFR[10:8]而取得成功的时候、定时器在引脚8上完全不输出时钟。

    我认为有一些基本的,简单的事情,我做的是不正确的,但我不知道是什么。  由于输出频率是时钟分频器工作方式的两倍、因此我认为当我从"010"二进制转换为"000"二进制时、输出频率将是12,000 Hz * 2 * 2 = 48,000 Hz (我想要的)、 但是、相反、我完全没有信号、只有0V、逻辑"低电平"。

    如果您知道此问题的答案、请提供帮助。  谢谢。  

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

    尊敬的 Kip:

    我已开始处理您的问题、并将尽快为您提供更新。

    --
    谢谢。此致、
    Jagadish。

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

    这方面是否有进展?

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

    这方面是否有进展?

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

    尊敬的 Kip:

    我对我的答复出现拖延表示诚挚的歉意。 实际上,我上周休假了几天,我也经历了这么多的问题,这意味着时间。

    关于这个问题、我为您创建了一个示例项目、使用 HET1_27引脚上的 N2HET 生成48kHz 信号。

    输出如下:

    这就是我生成该信号的方式。

    1.首先配置的环路分辨率值应尽可能小,  

    我将该环路分辨率配置为145nS。 如果此环路分辨率为高电平、则波形中的误差会更大。 有关更多详细信息、请参阅以下主题:

    (+) TMS570LS3137:PWM 捕获代码工作不正常-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    2.根据该循环分辨率值和所需的频率,我现在在 CNT 指令中计算出最大值。

    所需频率= 48kHz

    所需周期= 20.83uS

    环路分辨率= 145.45nS 或0.14545uS

    因此、最大值=所需的周期/环路分辨率= 20.83 / 0.14545 = 143 (aprox)

    因此、我将最终最大值配置为142。

    因为我需要50%的占空比、所以我将142的一半配置为 ECMP 指令数据值中的71。

    执行上述操作后、我从 HET IDE 中生成了.h 和.c 文件、并在 HALCoGen 中配置了相同的文件。 此外、我确保方向作为我将生成脉冲的引脚的输出。

    4.现在、在电路板中生成 HALCoGen 代码和程序后、我得到了48kHz 信号、如我的第一个图像中所示。

    下面附上我的主要项目和 HET 项目供您参考:

    e2e.ti.com/.../48KHZ_5F00_Signal_5F00_using_5F00_HET_5F00_IDE_5F00_RM46.zip

    e2e.ti.com/.../RM46_5F00_48KHZ_5F00_TEST_5F00_HET.zip

    注:
    由于我没有 RM48板、我在 RM46板上进行了这些测试、但大多数相同的修改也适用于 RM48。

    --
    谢谢。此致、
    Jagadish。

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

    48kHz 时钟有一个新问题。 (这个 HET 的运行方式非常奇怪。  我正在尝试理解)

    我的目标是将 HET1的输出连接到 HET1[8],并将其作为输入触发器,以对 ADC1通道进行采样{ 0,1,2,3,4,5,6,7 }== ADC1 { 0..7 }

    我正在向所有 ADC1通道{ 0上的输入发送正弦信号。 。 。 7}

    • 好的、现在我要 使用 HALCOGEN 完成 HET 程序、计数器程序、编译和内置到映像中
    • 在 Halcogen 中、我设置为使用16通道 BUF 边界对前8个通道进行连续采样、因此 ADC1将强制每8个 ADC1样本中断一次。
    • 我在 ADC1中使用16字缓冲器。
    • 处理器启动时、有一些代码会覆盖一些 HET 配置寄存器、因为无法在 HAL 中编辑 CONFIG 寄存器中的值。  (为了帮助您提供以上内容,您可以选择编辑此框,但我无法在 RM48L952ZWT GUI 中编辑此框,此框无法更改。)  因此我.  我做了一些实验,使用 PINMUX 可以读取 HET1 [8]输出信号与示波器,它几乎是完美的频率: 47.97 kHz。 所以、我成功地在芯片外部生成48kHz 信号、但 ADC1采样率不是48KHz。   让我来解释一下。  (注:我的处理器是 RM48L952ZWT (BGA)并且您使用的是 RM46类,有可能是不同的吗?)
    • 我有 ADC1提供的中断服务程序的代码,我测量的是48 kHz 的速率,所以我尝试以6 kHz 的速率对每个信号进行采样,所以我使用48 kHz 的基本时钟,并为每个通道除以8 = 6 kHz 的速率-- 因为每个都是60Hz 波形、我需要100个样本。  我有要取消交错的代码。  
    • 当我使用 TI Code Composer Studio (CCS)和 JTAG 调试器时、我从 ADC 中查看100字传输缓冲区、其中我从缓冲区移动8个样本 x 100个中断、以便在每个缓冲区中获取100个样本。
    • 然后我使用 CCS"graph"按钮。  我得到非常好的正弦波形、但频率采样率错误。  我估计采样率太快了2.63倍、或者大约48 * 2.83、大约为126.3kHz。  我通过查看原始数据来获得这个估计值、而不是 TI"图表"函数的输出。

    那么,这里的一个大问题——我看到 HET1 [8]输出引脚上的采样率为48 kHz ,但 ADC 转换器似乎转换速度太快了2.83倍。  您能帮助解释一下吗?  

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

    尊敬的 Kip:  

    我对我的答复出现拖延表示诚挚的歉意。

    实际上、我们在 TI 印度有一些假期。 同时,我在这段时间内还遇到了很多其他问题。

    在 Halcogen 中,我设置为使用16通道 BUF 边界连续采样前8个通道,因此 ADC1将强制每8个 ADC1样本中断一次。

    我认为在这种情况下、我们不应启用"连续转换"。 如果我们启用它、那么它将仅获取 HET 信号的第一个触发信号、然后它持续开始转换。

    实际上、我们的要求是我们应该需要采用48kHz 频率转换 ADC、这意味着我们需要在两次转换之间以20.83us 的周期进行转换。

    --
    谢谢。此致、
    Jagadish。

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

    我解决了问题。  使用外部触发器时、我发现有必要手动写入 ADC 寄存器。

    下面是代码:

    <<启动代码>>

    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    #define include_adc_code
    #ifdef include_adc_code
       adcInit();
       adcInit_xDER ();/(这里没有系统填充)

       adcEnableNotification  (adcREG1、adcGROUP0);

       //不需要启动转换,因为它是从外部触发的
       //   adcStartConversion     (adcREG1、adcGROUP0);

       /**-开始转换*/
       adcREG1->GxSEL[0]= 0xFF; //通道0-7,包括

       //注释: fn。 adcInit (),将一个值分配给 hetREG1->GCR 会导致标志'0b1001'(二进制)在 adcREG1->GxINTFLG[0U]中被设置。
       //       清除此处的标志,以免在配置 HET 之前触发中断
       adcREG1->GxINTFLG[0U]= 9U; /**< 0x0034、0x0038、0x003C:0-2组中断标志寄存器  */

       //选择 HET[8]作为触发器
       adcREG1->EVSRC =(UINT32) 0x00000001U;/**< 0x001C:组0触发源控制寄存器          */
    #endif

    #define include_HET_code
    #ifdef include_HET_code
       //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       hetInit ();
       hetInit_xDER ();//用于调整开发48kHz 时钟时的时序问题
    #endif


    << ISR 中的代码>>

    Bool ADC1_ISR_ISR = First_Time_Completed = false;

    void adc1Group0ADCD_C_Wrapper() Interrupt_Handler_
    {
       if (ADC1_ISR_XDER == false)//跳过第一个错误的样本 以执行 First_Time_Completed 稍后修复此问题
       {
           ADC1_ISR_ADC = First_Time_Completed;
           转到 Exit_ADC_Handler;
       }

       for (uint16 i = 0;I <(SAMPES_PER_INTERRUPT / 8);I++)//整数数学必须是 MOD 8
       {
           对于(int j = 0;j < 8;j++)
           {
               //将12位样本从 ADC FIFO 移动到 RAM 缓冲器,去除上4位的通道 ID
               uint32 addr = ADC_1_Un Base_Address +(8 * 4)* I)+(j * 4);

               //屏蔽保存采样编号 ID 的前4位
               i_uint32* Line_Load_) Index_Sample_Number addr & 0xFFf;
           }
           ADC_1_ADC++;Index_Sample_Number
       }

       如果(ADC_1_ADC Index_Sample_Number = 1)
       {
           断点_1++;
       }
       如果(ADC_1_ADC Index_Sample_Number = 2)、则执行其他操作
       {
           断点_1++;
       }
       否则、如果(ADC_1_ADC Index_Sample_Number = 100)
       {
           断点_1++;
           ADC_1_ADC Index_Sample_Number = 0;//缓冲区绕回
       }

    EXIT_ADC_Handler:

       //重置中断标志。  !! 如果不这样做、ISR 将在返回时
       adcREG1->GxINTFLG[0]= 9U;

       /**-开始转换*/
       adcREG1->GxSEL[0]= 0xFF; //通道0-7,包括