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/MSP432P401R:MSP432P401r计时器32

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/582465/ccs-msp432p401r-msp432p401r-timer32

部件号:MSP432P401R
主题中讨论的其他部件: EnergiaTLV5618A

工具/软件:Code Composer Studio

我正在使用计时器32创建延迟(所需的延迟为50us), 延迟时间随着我减少计时器寄存器中的计数而减少, 但是在特定的计数之后,延迟保持在某个值上,比如128us,如何使用 48MHz和timer32的DCO频率获得20us或更低的延迟?

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

    Gopalakrishnan,


    我想为您提供帮助,但您能否共享您的代码,以便我更好地为您提供帮助? 您使用的是TI驱动程序,Driverlib或Baremetal代码吗?

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

    您好Evan:

    我解决了之前遇到的问题,

    1)我用timer32编写了一个代码,在具有编程延迟的样本上进行ADC

    2)程序中的计数值决定延迟

    3)代码有效,直到出现一定的延迟

    4)我发现额外的延迟 是 由于ADC的转换时间和程序的剩余部分执行所需的时间(我删除了程序的其他部分,如ADC和UART, 程序正常 ,有所需的延迟值)

    我现在需要一些关于如何减少代码另一部分造成的这种延迟的建议

    我还附上了我使用的代码

    感谢youe2e.ti.com/.../10marchFN.txt

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

    关于您的代码,从性能角度看,您试图通过ADC实现什么目标? 我担心您在中断中尝试进行的数学和UART传输正在超越未来的中断。 由于您以48MHz运行,并且中断是每20us一次,因此您只有960个时钟周期来完成转换和数学运算。 您是否测量过这部分中断所需的时钟周期数?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首先感谢Evan的帮助...
    我的代码的主要目标是在1kHz的sin信号上进行ADC (这是我项目工作的一部分), 并在超终端中显示ADC结果,因为我是这个领域的新手,所以我学习得很慢,所以我不确定时钟周期计数...我确信,数学和UART运行未来的中断...
    我尝试每个周期至少做20次采样,但无法做到,因为数学和UART花费了时间,所以
    请帮助我在1kHz信号上进行ADC,每个周期至少有20个采样...
    谢谢你
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Gopalakrishnan,

    我首先看一下如何提高UART的波特率。您使用的是9600波特,比11.52万波特低得多。 这可能会有帮助,但关于时间安排,我不确定这是否仍能让您进入您正在寻找的窗口。

    /* UART配置参数。 这些配置参数
    *使eUSCI成为UART模块,以11.52万波特率运行。 这些
    *值是使用TI提供
    的在线计算器*计算得出的:
    * software-dl.ti.com/.../index.html
    */
    const eUSI_UART_Config uartConfig ={
    
    EUSCI_A_UART_CLOCKSOURCE_SMCLK, // SMCLK时钟源
    13, // BRDIV = 13
    0, // UCxBRF = 0
    37岁 // UCXBRS = 37
    EUSCI_A_UART_NO_PARity, //不奇偶校验
    EUSCI_A_UART_MSB_FIRST, // MSB优先
    EUSCI_A_UART_ON_STOP_BIT, //一个停止位
    EUSCI_A_UART_MODE, // UART模式
    EUSCI_A_UART_ORTS_Ooversampling_BAUDRATE_generation // Oversampling
    }; 

    如果这不起作用,我会调整代码以继续使用11.52万波特,但删除浮点到字符串转换数学运算,看看这在您的窗口中是否起作用。 最后,如果这不起作用,我会考虑在中断服务例程之外删除UART_TransmitData,而是在您的While中返回LPMx模式之前进行传输(1)。 请告诉我这是否有帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Evan:
    我已经尝试过波特率甚至超过11.52万,但延迟条件保持不变...但正如您前面提到的,我将尝试删除数学部分,并将再次运行代码
    我的问题是这一点
    1) ADC转换时间是否有问题?? 在此代码中,单次转换需要多长时间? 如果转换时间过长,是否有办法将转换时间减至最少。
    2)如果我将中断部分中完成的所有功能用于主要部件,是否会有任何变化??
    谢谢,此致,
    Gopalakrishnan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Evan您好!
    正如你所说的那样,我做了一些修改,现在的延迟已经减少了,现在更好了。
    我有一个500个浮点值的数组,我需要使用UART将存储的浮点值发送到超级终端,这可以有多快和简单?
    我正在进行数学转换,因为超级终端仅在完成此操作后才会显示所需的浮点值:是否有其他方法可以进行此操作??
    谢谢你
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Gopalakrishnan,

    使用UART,MSP432上的最大传输速率为3MBaud。 请记住,UART字节通常由10位组成;1个起始位,8个数据位,1个停止位。 这意味着,如果要发送14位ADC的数据,则必须为每次转换发送2个字节。 这意味着您需要获取样本数* 2字节* 10位= x Mbaud。 在这种情况下,您所需的样品数量/采样率是多少?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Evan,

    Iam Clear with the baud rate problem and I modified the codes... I must have 30 samples per cycle ... or least of 20 samples per cycle ...(Iam清除波特率问题,我修改了代码...我每个周期必须有30个样本...

    谢谢你

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

    当您说每个周期30个采样时,您说的是MCU每个时钟周期30个ADC采样吗? 这是不可能的。

    或者您是指您尝试测量的1kHz信号的每个周期20个样本?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Evan,
    IM参考每个1kHz信号周期20个采样,即我想要在正弦周期内20个点处的模拟值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Gopalakrishnan,

    您是否有兴趣在计算机/终端侧实际处理浮点数? 是否可能使用python?


    是否可以向我发送更新后的代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Gopalakrishnan,

    您是否考虑过使用DockLight终端工具之类的工具来解释PC端的原始十六进制值? 这可能会有帮助。 否则,您可能必须使用python或将信息记录到文件中并在十六进制编辑器中进行转换。 更多的想法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Evan:

     我尝试过坞站灯,它工作正常,我还有另一个疑问...在我尝试读取阵列数据时上传的代码中,如下所示,

    resultsBuffer[resPos]=(curADCResult * 3.3)/1.6384万;

    d=redultsBuffer[resPos];

    我经常发现d处的值为0,因为此时从ADC中获取的值,可能是什么问题?

    我来自印度,从9点到17点工作,在工作时间内,有没有其他办法无法获得帮助?  

    谢谢!

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

    您好,Gopalakrishnan,

    请查看此线程所附的代码。 我和我的一位同事坐下来,创建了一个简单的示例,说明您希望以44khz的速率跑步。 已进行了许多更改,请检查备注以了解更改。

    我们还希望您更新驱动程序库并确保您使用的是Red MSP432 LaunchPad。 对较新版本的driverlib进行了许多更改,Red LaunchPad包含Rev C芯片,其中包含许多错误修复。  


    此代码将以原始十六进制值发送您的ADC字节,从这里我将研究您是否仍然可以使用更高的波特率(当前为1Mbaud)进行数学运算。 您可以根据需要利用ARM浮点处理单元(FPU)更快地完成数学运算,而不是在CPU上使用手动数学运算。 这可以通过CMSIS DSP库完成。 有关详细信息,请参阅此应用手册:

    代码作为"Customer.c"附加

    e2e.ti.com/.../customer.c

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

    Evan,

     如果我使用黑色MSP432,主要区别是什么?

    波特率是1M,在12kHz的注释中采样表示什么?

    感谢你能抽出时间

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Evan,
    我试了一下黑色板,它运行良好,每个周期有44个样本,我也能够像你所说的那样将数据传输到文档灯。
    但我对此有疑问
    /*将ADC结果传输到变量*/
    curADCResult = MAP_ADC14_getResult(ADC_MEM0);

    MAP_UART_ESDLData(EUSI_A0_base,(uint8_t)curADCResult);
    curADCResult = curADCResult >> 8;
    MAP_UART_ESDLData(EUSI_A0_base,(uint8_t)curADCResult);

    在上述代码中,数据传输了两次,一次是在右移前后,为什么是这样?
    另外,向8位右移有何意义???
    谢谢,此致
    Gopalakrishnan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Gopalakrishnan,

    12kHz的注释实际上是一个打字错误,我们在那里放置了其他内容,但后来调整了实际设置。 它的采样率大约为44khz。

    关于黑色和红色启动板的主要区别,黑色启动板具有Rev B设备,红色启动板具有Rev C。您可以查看勘误表,以查看黑色和红色启动板之间的一些差异。 TI建议您继续使用红色LaunchPad。
    勘误表:
    www.ti.com/.../slaz610

    右移8是为了确保通过UART传输完整的ADC结果。 您的ADC结果是16位,UART一次传输8位,因此要发送全部16位,您需要发送前8位,左移8以准备接下来的8位,然后再次发送,从而发送全部16位信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Evan,

    我现在可以使用代码清除。现在我想知道以下内容是否有效?

    D=((curADCResult*ADC384)*1000; 3.3

    MAP_UART_HESDData(EUSI_A0_base,(uint8_t)d);

    我尝试在这里执行的操作是传输以毫伏为单位的实际电压值,  

    如果我发送此信息并通过docklight进行可视化,我将获得什么价值?

    要获得整数输出,应向docklight提供的实际值是多少?

    此致

    Gopalakrishnan

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

    我不知道您在问什么问题,但这个方程式会使您的ADC结果标准化。100 % 您仍需要顺便将位移留8位,然后发送接下来的8位。

    如果您将其发送到docklight并希望以十进制或十六进制查看,您可以通过要求DockLight以十六进制或十进制显示来实现。 请继续尝试,看看这是否能满足您的期望。

    如果不能,或者由于在下一次中断之前将ADC结果标准化,时间安排不起作用,请尝试通过我前面提到的CMSIS DSP库使用FPU。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Evan,
    非常感谢,我会尝试一下
    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Evan,

    我还有另一个疑问。您能不能用我在程序中使用的参考电压值来说明?? 根据代码,ADC的最高和最低范围是什么?  

    谢谢,此致

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

    关于参考电压,由于没有用于设置控制参考电压的REF_A模块的代码,因此它将根据slau356的19.3 第1节(MSP432的TRM: www.ti.com/.../litabsmultiplefilelist.tsp)自动默认为1.2V

    ADC的最高和最低范围取决于您的分辨率。 在14位时,它具有1.2V的参考,可使14位ADC分辨率达到每代码73uV。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Evan,

    我问前一个问题是因为在一个示例程序中,他们将参考电压设置为默认电压(1.2 v),但他们使用3.3 来标准化ADC值...为什么要这样做??

    MAP_ADC14_configureConversionMemory (ADC_MEM0,ADC_VREFPOS_AVCC_VREFNEG_VSS,
    ADC_INPUT_A0,FALSE);

    curADCResult = MAP_ADC14_getResult(ADC_MEM0);
    normalizedADCRes =(curADCResult * 3.3)/ 1.6384万;

    上述代码是名为ADC14_single转换重复的示例的一部分

    谢谢,此致

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

    没错,这是代码中的一个错误。 假设1.2V是您的参考电压,则您需要用1.2 进行除法以标准化ADC值。 如果您更改了参考电压,请确保相应地更改了此值。 我将提出文件要求修复此问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢Evan

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

    感谢您点击每篇帖子的验证答案,让我开怀大笑:)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Evan:

    我尝试修改代码,就像我在做一定数量的样本,然后传输它们,这样我就可以避免前一种情况下发生的延迟。这很有效...但我有两个问题

    1)以前,我使用UINT8_MAX 作为结果缓冲数组,在缓冲数组中,iam应该存储ADC结果,由于数组被定义 为256的大小,现在,我修改的代码一次发送200个值, 现在我想增加数组大小,并通过将数组大小设置为resultsBuffer[UINT16_MAX]来增加在实例中发送的样本数,当我使用此参数时,它显示“我内存不足”,如何解决此问题? 下图是错误

    2)在代码中,保存200个样本后,我将中断计时器,以发送存储的数据。我想再次启动计时器以再次执行相同的过程,但计时器在一个周期后停止, 如何纠正此问题?/我还附上了code..please帮助解决这些问题。

    thankse2e.ti.com/.../code-gopal.txt 及此致  

    Gopalakrishnan  

    (您的答案将被验证;-) )

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

    我还没有机会去研究这个问题,我很抱歉。 您自己是否偶然解决了这个问题?

    在较高的层面上,我想说您正在过度运行SRAM。 我再次担心,在可能触发下一个中断之前,您的readyToTransmit函数实际上没有完成。 您是否至少可以从该代码中获得一些预期的数据?

    此外,如果我没有犯错(无法测试代码,只是在我的脑海中运行它),那么您的结果Buffer似乎不会重置为0。 这可能是您正在过度运行SRAM的地方。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Evan:

    很抱歉,之前发送的代码只是用exels sheet将存储在图形中的数据可视化,我也设法做到了,波的质量也可以(复制很好)。 现在我尝试通过DAC单元将这些数字信号处理为模拟信号。MSP432P401R板是否有像ADC这样的内部DAC单元,如果有,您可以帮助我从DAC单元开始转换必须为帧的数字值 模拟信号??

    谢谢!

    Gopalakrishnan

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

    很抱歉,MSP432 MCU上没有DAC。 您可以使用外部DAC并通过SPI或其它串行通信外围设备与其通信。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Evan,
    谢谢,我已开始着手处理...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Evan:

    我曾尝试寻找一些论坛,讨论如何在msp432的外部设置DAC,我也提到了下面的电路图链接

    可用:  

    这些都是我想要做的事情,

    我必须能够重建模拟信号,我们以前在这个模拟信号上做过ADC。

    这会将ADC数据馈送至MSP,并使用DAC设置并重新获得信号。

    是否可以通过以上给定的ckt和 链接中提到的代码进行???

    请提供解决方案,

    谢谢!

    Gopalakrishnan

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

    关于链接,这是完全可能的。 如果我是您,为了更好地控制DAC的操作,我建议您使用驱动程序库或TI驱动程序编写自己的代码。 我们有一些示例展示了如何将MSP432用作主SPI。
    Driverlib: dev.ti.com/.../
    TI驱动程序: dev.ti.com/.../

    以及有关如何使用ADC的更多示例。 dev.ti.com/.../

    Energia是一种为业余爱好者和制造商创建的IDE,用于快速原型设计,并将许多基础功能抽象到API,这与市场其他领域使用的布线API类似。 为了实现最高效的编程和最有效的应用控制,建议使用DriverLib或TI驱动程序。

    您一定可以将该代码与Energia IDE一起使用,您可以从Energia.Nu下载并亲自试用。 我没有该硬件,所以我无法验证我的个人体验,但我肯定会将其用作程序的模板,以启动您的项目并从那里构建。

    我没有一个具体执行您要求的示例,但现在最好的建议是使用我在上面链接的代码示例,并将它们组合在一起,以实现您希望的操作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好Evan:

    我尝试使用示例代码,我尝试将UART接收部件与SPI部件连接起来,以便与外部生产的DAC硬件通信,在此之前,我将解释我实际需要什么,

    1)以前我们讨论过模拟信号的ADC采样,现在我在一个MSP中有一个ADC数据

    2)此数据必须发送到外部连接了DAC的另一MSP

    3)接收MSP应通过SPI将接收到的数据发送到DAC单元

    这是我的目标。

    现在,

    我附上了我尝试过的守则,以下是我的疑问

    1)是否可以在同一电路板中为UART和SPI使用相同的时钟源SMCLK

    2)我们已转移ADC值,并且一次发送8位,现在如果我接收数据并将其发送到DAC,它是否会影响系统?? (代码customer.c)

    3)如何以二进制形式将14位ADC值 从MSP 1发送到MSP 2?

    e2e.ti.com/.../dac.txt

    请帮助我更正上述代码。

    谢谢,此致,

    Gopalakrishnan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Evan:
    您还能提供一些链接,让我找到将msp432与蓝牙模块连接的链接吗
    谢谢你
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Gopalakrishnan,

    有关MSP432 + BLE,请访问 :dev.ti.com/.../

    1)如果需要,您可以将SMCLK用于UART和SPI。

    2)我认为您必须仔细阅读DAC预期接收数据的方式。 这取决于您可能使用的DAC。 我将查找以前与您选择的DAC一起使用的示例代码。

    一个简短的注释,您选择的DAC是12位,不会显示ADC测量中的所有14位。 您实际上是从测量中剪下2位。 如果您使用MSp432仅在12位采样,这应该没问题,但您应该注意。 下面的链接中有三个线SPI示例,它们可能是一个良好的起点。 TLV5618A的示例代码如下 :www.ti.com/.../slac087

    3)您可以通过SPI,I2C或UART发送ADC值。 任何一种方式都能奏效,由你决定。 有许多示例显示了I2C主/从或SPI主/从组合是如何完成的。 请单击此处:
    dev.ti.com/.../
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Gopalakrishnan,

    我现在将关闭此线程,因为原始问题已得到回答。 如果您对项目中与MSP432相关的其他部分有任何疑问,请继续在MSP MCU E2E论坛中发布新的论坛主题,我们将着手回答。 我们尽量避免在一条线中包含多个主题,以便社区在必要时也可以参与其中。 感谢您的理解!