Other Parts Discussed in Thread: ADS1232, ADS1230, ADS1232REF
主题中讨论的其他器件: ADS1230、
您好!
任何人都可以共享编程代码、其中包括与微控制
器连接的 ADS1232。 另请分享 ADS1232与微控制器连接的原理图。
此致、
Shariq
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.
Other Parts Discussed in Thread: ADS1232, ADS1230, ADS1232REF
您好!
任何人都可以共享编程代码、其中包括与微控制
器连接的 ADS1232。 另请分享 ADS1232与微控制器连接的原理图。
此致、
Shariq
您好、Sharique、
正如 Bryan 提到的、ADS1232是一款引脚控制型器件、无需软件配置。 ADS1232的原始评估模块称为 ADS1232REF 、我们曾为该板提供完整的源代码。 但是、TI 已决定原始代码不符合当前的审批流程和开源要求。 我们一直在开发可用作示例的新代码、但由于一些延迟、这将在明年年初之前提供。
根据您使用的处理器、硬件抽象层会因微处理器而异。 如果将 DRDY/DOUT 连接到微控制器的 MISO 和具有中断功能的 GPIO、则最容易连接到硬件。 DRDY/DOUT 的下降沿应触发中断、并触发 SPI 接口以读取中断例程中的3个字节的数据。
由于 ADS1232上没有 MOSI 引脚、可能会引起一些混淆。 最后、您只需通过写入微控制器的内部 TX 缓冲区来启动 SCLK、即使该引脚未连接任何内容、该缓冲区也会启动 SCLK 的输出。 数据传输完成后、从 RX 缓冲区中读取字节。
伪代码如下所示:
此致、
Bob B
尊敬的本杰明先生:
感谢您的回复。 我还获得了该链接"">e2e.ti.com/.../2608785
让我试一下、然后我会向您返回结果。
此致、
Shariq Hussain
尊敬的本杰明先生:
实际上、我们与 ESP BLE 网状网络进行了类似的合作、很抱歉耽误了时间。 我们将使用微控制器的三个引脚来连接 ADS1232。
MISO、SCK、外部接口为三个引脚。 我们在主模式下配置 SPI。 首先、为了启动串行时钟、我们必须通过 Tx 缓冲器发送虚拟字节。 但在主模式下、我们只通过 MISO 引脚接收数据。 那么、如何通过 MISO 引脚发送虚拟字节。
此致、
Shariq Hussain


尊敬的 Bob 先生:
为什么每次收到0xFF? 另请参见附加的信号。 在固件中、我按照您的步骤操作。 将 SPI 初始化为频率为1MHz 的主器件。
while (1)//理想循环任务
{
IWDG_KR = 0xAA;//将 IWDG 向下计数器重置为 FF
IF (FallingEdgeDetect = 1)
{
PD_CR2 &= 0xFB;//禁用 PD2作为外部中断
while ((SPI_SR & SPI_FLAG_TXE)= 0x00){}//等待发送结束
SPI_DR = 0x52;//发送虚拟字节
while ((SPI_SR & SPI_FLAG_RXNE)= 0x00){}//等待 SPI 完全接收字节
Data1 = SPI_DR;//将接收到的字节存储在 RxBuffer 中
while ((SPI_SR & SPI_FLAG_TXE)= 0x00){}//等待发送结束
SPI_DR = 0x52;//发送虚拟字节
while ((SPI_SR & SPI_FLAG_RXNE)= 0x00){}//等待 SPI 完全接收字节
Data2 = SPI_DR;//将接收到的字节存储在 RxBuffer 中
while ((SPI_SR & SPI_FLAG_TXE)= 0x00){}//等待发送结束
SPI_DR = 0x52;//发送虚拟字节
while ((SPI_SR & SPI_FLAG_RXNE)= 0x00){}//等待 SPI 完全接收字节
Data3 = SPI_DR;//将接收到的字节存储在 RxBuffer 中
PD_CR2 |= 0x04;//启用 PD2作为外部中断
FallingEdgeDetect = 0;
}
@far @中断 void EXTI_PORTD_IRQHandler (void)
{
FallingEdgeDetect = 1;
返回;
}
此致、
Shariq Hussain
您好、Shariq、
如果我正确理解示波器截图、则左侧图片显示 MISO、右侧图片显示来自微型的 MOSI。 我看到的第一个问题是仅传输8个时钟、而不是整个24个数据时钟。 第二个问题是微控制器使用了错误的相位。 ADS1232在 SCLK 的上升沿转换、并在下降沿保持稳定。 这有时称为模式1 SPI。 您使用的是模式0、它在下降沿转换并在上升沿保持稳定。 您需要将 SPI 的相位更改为正确的模式。
我没有看到任何显示0xFF 的数据、实际上、数据的第一个字节是0x00。 查看所有数据而不仅仅是一个字节会有所帮助。 查看原理图也会有所帮助。 您必须确保 AVDD 和 DVDD 处于标称工作电压并连接了适当的基准。 所有数字输入都应连接到某个特定的逻辑电平、而不应悬空。 PDWN 引脚也必须设置为高电平。
在不尝试读取数据的情况下、您可以通过监控 DRDY/DOUT 来验证 ADS1232是否正在运行、并且您应该会看到转换准备就绪信号以由 SPEED 引脚设置选择的所选数据输出速率切换。
您的代码显示了对发送和接收使用相同的寄存器。 这对于您的微控制器来说可能是正确的、但我建议您验证您使用的寄存器是正确的微控制器。 此外、在将虚拟字节放入寄存器之前、您将清除发送缓冲区。 通常、在检查缓冲区是否为空之前、我希望字节被放置在寄存器中。 我会验证这是正确的过程。
此外、在中断例程中、您不会清除中断。 通常、这是防止中断连续重新进入中断所必需的。 我建议在每次输入中断后验证中断是否被清除。
我希望这能让您对要检查的内容以及如何验证数据有所了解。
此致、
Bob B
尊敬的 Bob 先生:
请查找随附的包含图像和视频的原理图和 zip 文件。
=>这里我附加了一个运行电路的原理图、其中 PIC 微控制器与 ADS1232相连。 微控制 器用于连接的3个引脚、所有3个引脚均为正常 GPIO、这意味着这些引脚上没有 SPI 功能。实际上、我使用示波器观察到 PDWN 连续保持高电平、所附图像中包含 SCLK 和 DOUT/ Ddy 的信号。 SCLK 频率为117.7KHz、+width 为5.7uec、-width 为2.7uec。 完成 24个时钟脉冲的持续时间为200 μ s。 该周期每隔100毫秒重复一次。 与24 clk 相比、还有小宽度25脉冲 脉冲。请耐心地查看所有图片以获得更好的间隙。绿色信号为 SCLK、黄色为 DOUT、蓝色为 PDWN。
这是市场上购买的电路。
=>现在我所做的是、切断 PCB 上 DOUT 和 SCLK 的轨道、以断开 PIC MCU 和 ADS1232之间的通信。 并连接我的开发 使用3根导线与 ADS1232配合使用。 来自同一 ADS 引脚 DOUT 的两根导线、一根连接到 MCU 的外部中断 GPIO、另一根连接到 MCU 的 MISO。 第三根线 SCLK 连接到 MCU 的 SCLK。 在固件中,我将 SPI 初始化为频率为1MHz.Frame 格式的主器件:MSB 首先传输,时钟 极性为0:空闲时 SCK 为0。开发套件的 VDD (+5V)和 VSS 连接到该电路。 未使用我的 MCU 中的 PDWN、因为它的维生素很高 PIC MCU。 请查看所有图片和一个视频、耐心等待更好的间隙。绿色信号为 SCLK、黄色为 MISO、蓝色为 MOSI。
=>我通过 MOSI 发送0x52 (虚拟字节)。 由于传输是8位、因此可能是8个 clk 脉冲的原因。
=>是的、您回答正确、SPI 的相位错误、所以我纠正了这个问题。在固件 SPI 初始化中、现在时钟相位为1:第二个时钟转换是 第一 个数据采集边沿
=> SPI_DR–数据寄存器
数据寄存器用于两种情况、即接收到数据和传输数据。 读取该寄存器将从接收中检索数据 缓冲器。 设置该寄存器将把指定的值加载到发送缓冲区中。
=>根据您的建议、现在我首先发送虚拟字节、然后等待清除 Tx 缓冲区。 接收到数据后、等待清除 Rx 缓冲器。
=>没有用于清除外部中断的记录寄存器。 EXT INT 适用于我们的远程协议、这意味着没有问题。
while (1)//理想循环任务
{
IF (FallingEdgeDetect = 1)
{
PD_CR2 &= 0xFB;//禁用 PD2作为外部中断
SPI_DR = 0x52;//发送虚拟字节
while ((SPI_SR & SPI_FLAG_TXE)= 0x00){}//等待发送结束
Data1 = SPI_DR;//将接收到的字节存储在 RxBuffer 中
while ((SPI_SR & SPI_FLAG_RXNE)= 0x00){}//等待 SPI 完全接收字节
SPI_DR = 0x52;//发送虚拟字节
while ((SPI_SR & SPI_FLAG_TXE)= 0x00){}//等待发送结束
Data2 = SPI_DR;//将接收到的字节存储在 RxBuffer 中
while ((SPI_SR & SPI_FLAG_RXNE)= 0x00){}//等待 SPI 完全接收字节
SPI_DR = 0x52;//发送虚拟字节
while ((SPI_SR & SPI_FLAG_TXE)= 0x00){}//等待发送结束
Data3 = SPI_DR;//将接收到的字节存储在 RxBuffer 中
while ((SPI_SR & SPI_FLAG_RXNE)= 0x00){}//等待 SPI 完全接收字节
PD_CR2 |= 0x04;//启用 PD2作为外部中断
FallingEdgeDetect = 0;
}
}
@far @中断 void EXTI_PORTD_IRQHandler (void)
{
FallingEdgeDetect = 1;
返回;
}
e2e.ti.com/.../PIC_2800_mcu_29002D00_ADS1232.rare2e.ti.com/.../My_2800_mcu_29002D00_ADS1232.rare2e.ti.com/.../3364.Schematic.PDF
此致、
Shariq Hussain
尊敬的 Bob 先生:
施加的电压为+5V。 下面是市场上购买的运行电路(PIC MCU)与 MCU 接口之间的比较、我提出的几个问题:
=>在 PIC MCU 文件夹中、可以清楚地看到使用了25个时钟脉冲、而我使用的是24个脉冲。 为什么?
=>在 PIC MCU 文件夹中、使用简单的 GPIO 引脚、25个无间隙的时钟脉冲。 我正在使用 SPI 时钟引脚、因此在24个时钟脉冲的数据包中、每个8时钟脉冲之间存在间隙。 为什么?
=>在 PIC MCU 文件夹中、每隔100毫秒重复一次数据和 clk 组合。 但在我的情况下、有意外行为意味着没有完美的间隔。 为什么?
=>在 PIC MCU 文件夹中、每隔100毫秒 DOUT 引脚从高电平变为低电平、25时钟脉冲之后 DOUT 引脚变为高电平状态。 但在我们的案例中、在发送给您的视频中可以看到不同的行为。
此致、
Shariq Hussain
您好、Shariq、
我建议查看 ADS1232数据表。 我将尝试回答您的问题。
[引用 userid="248879" URL"~/support/data-converters-group/data-converters/f/data-converters-forum 1061517/ads1232-mcand-ads1232/3948129#3948129"]]>在 PIC MCU 文件夹中、可以清楚地看到使用了25个时钟脉冲、我使用的是24个脉冲。 为什么?[/报价]显然、最初的实现是使用轮询方法来结束转换、而不是使用中断方法。 这意味着 DRDY/DOUT 输出必须强制为高电平才能识别转换已完成、这在 DRDY/DOUT 上表现为从高电平到低电平的转换。 原因是上一次转换读取的 LSB 可以是高电平或低电平。 如果它为低电平、则轮询环路很容易将低电平输出误解为新的转换。 使用中断是首选方法、因为无论引脚之前的状态如何、高电平到低电平转换始终在 DRDY/DOUT 上发生。 请参阅第24页的 ADS1232数据表和图8-9 (显示转换结束后的新数据就绪转换)和8-10 (显示第25个时钟后 DRDY/DOUT 变为高电平)。
[引用 userid="248879" URL"~/support/data-converters-group/data-converters/f/data-converters-forum 1061517/ads1232-mcand-ads1232/3948129#3948129"]]>在 PIC MCU 文件夹中、使用了简单的 GPIO 引脚、25个无间隙的时钟脉冲。 我正在使用 SPI 时钟引脚、因此在24个时钟脉冲的数据包中、每个8时钟脉冲之间存在间隙。 为什么? [/报价]最初的执行显示了一个使用 GPIO 引脚的"位 bang "方法。 这需要一组独特的函数、这些函数实际上需要特定的处理器时间才能完成、一旦启动、就不应中断。 外设通常独立于主处理循环运行。 这提供了一个接近50/50的占空比、这是首选。 Bit-bang 方法与函数的时序有关、可通过其他处理步骤中断。 使用 SPI 外设时、传输字节之间可能会有延迟、具体取决于使用情况。 在您的情况下、在等待 TX 缓冲区清空和 RX 缓冲区准备就绪时会创建空间(由" while "条件导致)。 从器件读取的字节之间的时间间隔很短、这一点不会受到影响。
[引用 userid="248879" URL"~/support/data-converters-group/data-converters/f/data-converters-forum 1061517/ads1232-mcentering-of microcontroller-with-ads1232/3948129#3948129"]]>在 PIC MCU 文件夹中,数据和 clk 组合每隔100ms 重复一次。 但在我的情况下、有意外行为意味着没有完美的间隔。 为什么?[/报价]ADS1232每100ms 完成一次转换、但在转换完成后、您可能不会读取转换。 确保您的中断在 DRDY/DOUT 的下降沿(高电平到低电平)转换时触发。 还要确保您的总处理循环时间不超过100ms、否则您将丢失数据。 如果您要将数据传输到 COM 终端或其他显示器、可能会出现环路延迟。 我在视频中注意到、示波器在大约1秒的间隔而不是100ms 触发。 在 DOUT/DRDY 通道的下降沿触发示波器。 我想您会发现您没有捕获所有数据、但转换以100ms 的间隔完成。
[引用 userid="248879" URL"~/support/data-converters-group/data-converters/f/data-converters-forum 1061517/ads1232-mcuiting-of microcontroller-with ads1232/3948129#3948129"]]>在 PIC MCU 文件夹中、DOUT 引脚每隔100毫秒从高电平变为低电平、25时钟脉冲 DOUT 引脚变为高电平状态。 但在我们的案例中、发送给您的视频中会出现不同的行为。是的、这就是我在第一个回答中所说的内容。 24个 SCLK 是数据。 第25个时钟将强制 DRDY/DOUT 为高电平。 如果发送26个或更多时钟、ADS1232将进入自偏移校准周期、在10sps 数据速率下、需要大约8个转换周期(800ms)才能完成并为所选输入提供适当的转换结果。 如前所述、转换 LSB 可以是高电平或低电平、并且在通过 GPIO 轮询引脚时、需要强制此引脚为高电平。 使用中断驱动系统时、您会监控 DRDY/DOUT 上的下降沿、并且与 DRDY/DOUT 的先前状态无关。
此致、
Bob B
尊敬的 Bob 先生:
根据我的理解、 需要生成第25个时钟脉冲的错误是什么。 DOUT 引脚变为高电平。 然后等待 DOUT 引脚从高电平到低电平的转换、这将在100ms 后发生。
查询1:=>那么,对于第25个脉冲,我必须做什么? 因为如果我再次在24个 clk 脉冲之后发送一个虚拟字节、那么它将再生成8个 clk 脉冲。 意味着总共30个时钟脉冲。
查询2:=>我还在论坛上看到了您以前的答案,您在论坛中建议 GPIO 位 bang 方法比 SPI 外设更容易。 但您告诉我、SPI 外设优于 GPIO 位 bang 方法。 您还建议了一个固件指导链接、但在单击链接网页时没有响应。 为此、请检查随附的图像
此致、 
Shariq Hussain
您好、Shariq、
我的解释中仍然存在断开连接的情况、很抱歉我不清楚或不完全理解您的使用案例。 如果您没有从 ADS1232收集任何数据、您将看到当速度引脚设置为低电平时(如您提供的原理图中所示)、DRDY/DOUT 将每100ms 进行一次低-高-低脉冲。
每次转换完成后、DRDY/DOUT 将始终从高-低或低-高-低转换。 根据数据中的最后一位、输出可能已经是高电平、以便只能看到高电平-低电平转换。 如果发送的最后一位为低电平、则操作将为低电平-高电平-低电平。 这显示在第24页的数据表中。

更新周期显示为将转换结果放入 DRDY/DOUT 上要传输的输出缓冲器的最短时间为39us。 我在演示中从您的视频中捕获了以下屏幕截图。
请注意、中断在 DRDY/DOUT 上的高-低转换过程中工作、您的代码识别出新数据可从 ADS1232读取。 因此、我希望这一点更清楚、为什么不需要25个 SCLK 来确定是否有新数据可用。
还应考虑 ADS1232器件的使用寿命约为15年、许多旧的微控制器速度非常慢、并且可能无法实现 GPIO 中断。 如果是这种情况、则使用轮询循环来监控 DRDY/DOUT 的状态。 在这种情况下、微处理回路可能太慢、无法识别低-高-低转换的39us 转换时间、这将需要更长的时间来确定 DRDY/DOUT 是否实际进行了低-高-低转换。 对于这个特定的用例、需要位 bang 方法并且使用第25个 SCLK 会强制 DRDY/DOUT 为高电平。 使用的最佳方法是中断方法(也在 ADS1232REF 上使用)、而不是 Bit-bang 方法和25个 SCLK。
[引用 userid="248879" URL"~/support/data-converters-group/data-converters/f/data-converters-forum 1061517/ads1232-mcentering-of microcontroller-with-ads1232/3949065#3949065]Query 1:=>那么,对于第25个脉冲,我必须做什么? 因为如果我再次在24个 clk 脉冲之后发送一个虚拟字节、那么它将再生成8个 clk 脉冲。 表示总共30个时钟脉冲。[/QUERP]请勿使用25 SCLK、因为您的代码已经在运行、如上图所示。 如果您发送额外的字节(实际上是32个时钟、而不是30个时钟)、则会将 ADS1232置于自偏移校准中、这需要800ms 才能完成。
[引用 userid="248879" URL"~/support/data-converters-group/data-converters/f/data-converters-forum 1061517/ads1232-mcand-ads1232/3949065#3949065">Query 2:=>我还在论坛上看到了您以前的答案,您在论坛中建议 GPIO 位 bang 方法比 SPI 外设更容易。 但您告诉我、SPI 外设优于 GPIO 位 bang 方法。 您还建议了一个固件指导链接、但在单击链接网页时未响应。正如我之前所说的、ADS1232现在已使用了大约15年以上、您所指的响应也很旧。 由于 IT 安全原因、FTP 服务器在您的帖子中显示的响应发生后很快关闭。 FTP 服务器上的软件"受限制"不需要特定的软件发布标准、因为这些标准与 TI 的某些法律要求有关。 因此、以前的形式不再提供链接和软件。 我目前正在努力更新示例代码、该代码最终将放置在 ADS1232的产品页面上、但这至少需要6周的时间。
正如我之前所说的、您提到的 TI 代码是由中断驱动的、而不是位 bang。 因此、我建议您继续使用您正在使用的代码并对其进行优化。 是指特定竞争对手处理器上的 POST 请求信息、我不知道如何设置 SPI 外设、或者是否有可中断的 GPIO 引脚可用。 因此、在这种特定的客户用例中、使用 Bit-Bang 方法可能更容易。 如果中断方法可用、我不建议使用 Bit-bang 方法。
由于 ADS1232没有寄存器且由引脚控制、因此与其他 ADC 相比、它不是一个复杂的器件(尽管您可能认为是)。 请遵循数据表以及有关设置和时序的信息、您可以获得收集数据所需的所有信息。 即将发布的示例代码与您在该主题中发布的代码没有太大不同。 代码中最困难的部分是硬件抽象、由于它与 SPI 外设和通信相关、因此与处理器相关。
此致、
Bob B
尊敬的 Bob 先生:
请检查随附的 zip 文件夹,即“结果”:
1 =>感谢您对固件的指导、因为我得到了结果。 请验证"结果"文件夹的图像、以确认其正确。
2 =>在固件端、我做了一些更改、即分别在发送/接收之前等待 Tx/Rx 缓冲器的间隙。 根据执行此操作、我根据信号读取确切的字节。
3 => 文件夹还包含 ADS1232以及附近硬件集成的原理图。 目前、我没有压力传感器、需要长达10天的时间才能交付给我。 到目前为止、连接器已打开、我们正在读取的是一个垃圾或浮点值。 那么、对于自检、我可以在这里为 PL11连接器的第1个引脚提供100毫伏信号、为 PL11连接器的第2个引脚提供 GND 信号吗?
4 =>在常规 MCU 内置的 ADC 中、如10位或12位、我们只是知道在这个特定的模拟电压上、我们得到了这个特定的计数值。 因此、如果我们在 PL11连接器上提供100毫伏的信号、我们在 ADS1232的输出端得到的是什么。
此致、
您好、Shariq、
现在、代码似乎从 ADS1232正确读取。 至于您的原理图、我不确定此电路的用途是什么。 输入端有一个隔直电容 C5A、ADS1232设计用于测量直流信号或靠近直流信号。
至于代码到电压的转换、这显示在第23页的数据表中。 一个 LSB (或一个代码)等于 (0.5 VREF/增益)/(223–1)。 原理图显示 GAIN0引脚被拉至高电平、增益为2。 基准电压显示为5V。 因此、1个代码的值等于((0.5 * 5V / 2)/(8388607)= 149nV。 输入电压由 ADC 代码数(24位值)乘以1代码值决定。 对于100mV 输入、您应该会看到大约为671141十进制或0x0A3DA4的代码。 但是、在安装了 C5A 电容器的情况下、很难说出预期的值。
此致、
Bob B