为啥 Nucleo 144 上的引脚没有输出足够高的电压,尽管输出设置为 HIGH?
Posted
技术标签:
【中文标题】为啥 Nucleo 144 上的引脚没有输出足够高的电压,尽管输出设置为 HIGH?【英文标题】:Why is the pin on a Nucleo 144 not outputting a high enough voltage, despite the output being set to HIGH?为什么 Nucleo 144 上的引脚没有输出足够高的电压,尽管输出设置为 HIGH? 【发布时间】:2021-07-03 12:55:47 【问题描述】:我正在尝试使用 A4988 驱动器和带有 STM32F767ZI 的 Nucleo 144 板来控制步进电机。
A4988 驱动器期望电压单次上升到 HIGH 以使电机步进。
使用万用表读取了一些电压读数后,我发现在程序暂停期间,甚至在程序暂停期间,引脚都会输出大约 1.2V 的稳定电压。
每当 A4988 驱动器的输出在 HIGH 和 LOW 之间切换时,我还添加了一些线来切换 LED(内置于板上),效果很好。
代码如下:
main.c
#include "./headers/stm32f767xx.h"
#include <stdint.h>
int main(void)
initMotor(0);
initLed(0);
uint32_t a = 0;
while (1)
if (a >= 300000)
toggleLed(0);
stepMotor(0);
a = 0;
a++;
./drivers/motor.c
#include "../headers/stm32f767xx.h"
void initMotor(int step_pin)
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOGEN; // enable GPIOG clock
GPIOG->MODER &= ~(0b11 << (step_pin * 2)); // clear bits
GPIOG->MODER |= (0b01 << (step_pin * 2)); // set mode to OUTPUT
GPIOG->OTYPER &= ~(0b1 << step_pin); // set output type to PUSH-PULL
GPIOG->PUPDR |= (0b10 << (step_pin * 2)); // pull the pin down
GPIOG->ODR &= ~(0b1 << step_pin); // set output to LOW
void stepMotor(int step_pin)
GPIOG->ODR ^= (0b1 << step_pin); // toggle between LOW and HIGH
./drivers/led.c
#include "../headers/stm32f767xx.h"
void initLed(int pin)
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOBEN; // enable GPIOG clock
GPIOB->MODER |= (0b01 << (pin * 2)); // set mode to OUTPUT
GPIOB->OTYPER &= ~(0b1 << pin); // set output type to PUSH-PULL
GPIOB->ODR &= ~(0b1 << pin); // set output to LOW
void toggleLed(int pin)
GPIOB->ODR ^= (0b1 << pin); // toggle between LOW and HIGH
我已经使用万用表验证了通过 STLINK USB 提供给电路板的电压为 5V(我认为这已经足够了),并且驱动器也收到了正确的 5V 电压。
我认为这与 A4988 驱动程序无关。我已经尝试了多个来自不同制造商的相同驱动程序,但仍然得到相同的结果。电机也提供了足够高的电压 (12V),但并没有完全投入。
我得出的结论是,这很可能是来自 Nucleo 144 板的问题,但对于实际问题是什么有点卡住了。
我正在使用 GPIO G 引脚 0,它在板上标记为“IO”。
非常感谢任何关于我接下来应该尝试什么的建议,或者关于它可能是什么的想法。
根据要求,这是我的设置图:
【问题讨论】:
这是一个电气工程堆栈交换问题,还要添加您的原理图和其他相关信息。 @old_timer 我在这里问,以便我可以尝试消除它是软件问题的可能性。我认为我写的软件是正确的,但是由于缺乏知识,我当然可能忽略了一些东西。尽管如此,我认为接线也不太可能成为问题。也许我应该将问题改写为“为什么输出没有被改变” 这个芯片有bsrr吗?您可以使用它来设置/清除引脚,而(您)不必与其他人打交道。仅供参考,这里不一定有问题。 @old_timer 确实如此,谢谢,我会记住这一点 【参考方案1】:如果您将输出配置为 PUSH/PULL,则添加一个 PULLDOWN 电阻器会将输出电压分压到该电阻器上。不要将 PU/PD 电阻与 PP 一起使用,因为它始终是驱动的,不需要 PU/PD。
【讨论】:
驱动器上输出的引脚悬空。我在互联网上的各个地方都看到不要让引脚悬空,应该使用上拉/下拉电阻来阻止这种情况。如果我不能在推挽上使用上拉/下拉电阻,我还应该如何处理? @user15278978 使用推挽输出将始终驱动为高电平或低电平,因此不需要 pu/pd 电阻并且输入不会浮动。就像 PeterT 说的那样,添加一个将创建一个分压器并产生您所看到的结果。 当您断开驱动芯片并测量引脚时,您看到了什么?你不需要/不想结合推拉和上拉/下拉。 @theCreator 感谢您为我解决这个问题,我现在对这一切有了更好的理解 @old_timer 该引脚输出的电压现在在与驱动器断开连接时似乎卡在 0V,连接到驱动器时似乎卡在 4V 左右以上是关于为啥 Nucleo 144 上的引脚没有输出足够高的电压,尽管输出设置为 HIGH?的主要内容,如果未能解决你的问题,请参考以下文章