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.
您好!
任何人都可以共享编程代码、其中包括与微控制器连接的 ADS1232。 另请分享 ADS1232与微控制器连接的原理图。
此致、
Shariq
您好、Sharique、
我们目前没有 ADS1232的示例代码。 但是、该器件为只读器件、因此您应该能够按照 ADS1232数据表中第8.4.6节中的时序图启动并运行 ADC。
同样、要连接到 MCU、只需一条 DOUT 和一条 SCLK 线路(以及一个可选的 PWDN 引脚)。
布莱恩
您好、Bryan、
感谢您的回复。 实际上、有一个有关 MSP430微处理器与 ADS1232 (或其他 ADSxxxx)以 TIDA 形式连接的示例代码、但我无法在 google 上找到该代码。
此致、
Sharique
您好、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
您好、Sharique、
基准 POST 使用位 bang GPIO 与 ADS1230 (20位)进行 SPI 通信。 使用24位 ADS1232时、使用内置的微型 SPI 外设会更容易。
此致、
Bob B
尊敬的本杰明先生:
这意味着使用微控制器的 SPI 外设比使用位 bang GPIO 更容易。 在这里、我想问微控制器的 MISO 应该连接到 ADC 的 DOUT/DRDY、微控制器的 SPI CLK 应该连接到 ADC 的 SCLK 引脚、微控制器的哪个引脚应该连接到 ADC 的 PDWN。
此致、
Shariq Hussain
您好、Shariq、
您的 SPI 连接正确。 微控制器的 MOSI 引脚可保持悬空。 PDWN 引脚可连接到微控制器上的任何可用 GPIO 引脚。
此致、
Bob B
尊敬的本杰明先生:
实际上、我们与 ESP BLE 网状网络进行了类似的合作、很抱歉耽误了时间。 我们将使用微控制器的三个引脚来连接 ADS1232。
MISO、SCK、外部接口为三个引脚。 我们在主模式下配置 SPI。 首先、为了启动串行时钟、我们必须通过 Tx 缓冲器发送虚拟字节。 但在主模式下、我们只通过 MISO 引脚接收数据。 那么、如何通过 MISO 引脚发送虚拟字节。
此致、
Shariq Hussain
您好、Shariq、
即使您没有在微控制器上使用 MOSI 引脚、您仍然可以启动 SCLK 以将虚拟字节写入所使用微控制器的 TX 缓冲器。
此致、
Bob B
尊敬的 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
您好、Shariq、
感谢您提供更多信息。 该器件以10sps 运行、从而获得100ms 的转换结果。 那么、此时您是否有任何问题、因为它似乎按预期工作?
增益设置为增益2、原理图不清楚输入是什么或施加的电压。 因此、我无法说出代码的预期结果。
此致、
Bob B
尊敬的 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