yan鈥唋m鈥唘 发表于 6 天前

帮忙看下关于32G8K GPIO口电流驱动能力问题

我在测试PWM直接驱动微型步进电机时遇到的问题:电机接线如图1

         

P02 P03 为PWM输出, P10 P14对应线圈的另一个引脚。   
用其他牌子的芯片每200uS走一微步,电机的扭矩没有问题,
今天试了用这个要500uS一微步才能驱的起来,
我想看下是不是驱动电流配置的不对。

以下是IO口的配置
void      GPIO_config(void)
{
//      GPIO_InitTypeDef GPIOA;
      
       P0_MODE_OUT_PP(GPIO_Pin_2|GPIO_Pin_3); //PWM7 PWM8 输出
      P0_SPEED_HIGH(GPIO_Pin_2|GPIO_Pin_3);
      P0_DRIVE_HIGH(GPIO_Pin_2|GPIO_Pin_3);
      
      P1_MODE_OUT_PP(GPIO_Pin_0|GPIO_Pin_4); //对应PWM7 PWM8
      P1_SPEED_HIGH(GPIO_Pin_0|GPIO_Pin_4);
      P1_DRIVE_HIGH(GPIO_Pin_0|GPIO_Pin_4);
}

以下为PWM配置

void Steper_init(void)
{
      PWMx_InitDefine                PWMx_InitStructure;
      
      PWMB_Duty.PWM7_Duty = 150;                         //M3占空比
      PWMB_Duty.PWM8_Duty = 150;                                                                                                      //M1占空比
      
      
      PWMx_InitStructure.PWM_Mode    =      CCMRn_PWM_MODE1;      //模式,                CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
      PWMx_InitStructure.PWM_Duty    = PWMB_Duty.PWM7_Duty;      //PWM占空比时间, 0~Period
      PWMx_InitStructure.PWM_EnoSelect   = ENO7P;                                        //输出通道选择,      ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
      PWM_Configuration(PWM7, &PWMx_InitStructure);                              //初始化PWM,PWMA,PWMB

      PWMx_InitStructure.PWM_Mode    =      CCMRn_PWM_MODE1;      //模式,
       CCMRn_FREEZE,CCMRn_MATCH_VALID,CCMRn_MATCH_INVALID,CCMRn_ROLLOVER,CCMRn_FORCE_INVALID,CCMRn_FORCE_VALID,CCMRn_PWM_MODE1,CCMRn_PWM_MODE2
      PWMx_InitStructure.PWM_Duty    = PWMB_Duty.PWM8_Duty;      //PWM占空比时间, 0~Period
      PWMx_InitStructure.PWM_EnoSelect   = ENO8P;                                        //输出通道选择,      ENO1P,ENO1N,ENO2P,ENO2N,ENO3P,ENO3N,ENO4P,ENO4N / ENO5P,ENO6P,ENO7P,ENO8P
      PWM_Configuration(PWM8, &PWMx_InitStructure);                              //初始化PWM,PWMA,PWMB

      PWMx_InitStructure.PWM_Period   = 300;                                                      //周期时间,   0~65535
      PWMx_InitStructure.PWM_DeadTime = 0;                                                                //死区发生器设置, 0~255
      PWMx_InitStructure.PWM_MainOutEnable= ENABLE;                              //主输出使能, ENABLE,DISABLE
      PWMx_InitStructure.PWM_CEN_Enable   = ENABLE;                              //使能计数器, ENABLE,DISABLE
      PWM_Configuration(PWMB, &PWMx_InitStructure);                              //初始化PWM通用寄存器,PWMA,PWMB

      PWM7_USE_P02();

      PWM8_USE_P03();

      NVIC_PWM_Init(PWMB,DISABLE,Priority_0);
}


以下是我电机测试部份程序

for(loop=0;loop<60;loop++)
      {
                        PWMB_Duty7(CMRTABLE1*3); //M3   
                        PWMB_Duty8(CMRTABLE4*3); //M1
                        M0 = CMRTABLE2;               
                        M2 = CMRTABLE3;
                  delay_us(800);
}
      
      
      for(loop=0;loop<2640;loop++)
      {
                        PWMB_Duty7(CMRTABLE1*3); //M3   
                        PWMB_Duty8(CMRTABLE4*3); //M1
                        M0 = CMRTABLE2;               
                        M2 = CMRTABLE3;
                  delay_us(500);
               
//                ASM_DELAY_US(150);
}






国芯人工智能 发表于 6 天前

关于您提到的32G8K GPIO口电流驱动能力问题,我们非常重视,并针对您的测试情况进行了详细分析。以下是基于现有信息的专业评估与建议:

首先,从您提供的GPIO配置来看,P0和P1端口均被设置为推挽输出(PP),并配置为高速模式(HIGHSPEED)及高驱动能力(HIGHDRIVE)。这表明在硬件层面上,GPIO口具备较高的驱动能力,理论上能够满足大多数中等功率应用的需求。

然而,在实际应用中,PWM信号的驱动能力不仅取决于GPIO的配置,还受到以下因素的影响:

1. PWM频率与占空比:
   您提到使用500μs才能驱动微步电机,而其他品牌芯片仅需200μs。这可能意味着当前PWM频率或占空比设置不够理想。建议检查PWM的周期是否合理,确保其在电机所需的响应范围内。此外,占空比过低可能导致电机无法获得足够的平均电流,从而影响扭矩表现。

2. 电机线圈阻抗与电感特性:
   步进电机的线圈具有一定的电感,当PWM信号切换时,可能会产生反向电动势(EMF)。若GPIO驱动能力不足,可能无法快速响应这种变化,导致电机无法正常启动或运行。建议检查电机线圈的阻抗与电感值,并考虑增加适当的续流二极管以保护电路。

3. GPIO驱动能力限制:
   虽然32G8K的GPIO配置为高驱动能力,但其最大输出电流通常受限于芯片规格。例如,部分型号的单个GPIO口最大输出电流可能仅为20-40mA。若您所使用的电机线圈需要更高的电流,建议考虑外接MOSFET或驱动芯片来增强驱动能力。

4. PCB布线与寄生电容/电感:
   信号路径上的寄生电容或电感可能影响PWM信号的上升/下降时间,进而影响电机的响应速度。建议优化PCB布局,减少走线长度,并确保电源与地线的稳定性。

综上所述,建议您从以下几个方面进行排查与优化:
检查PWM频率与占空比设置,确保其符合电机需求;
测量电机线圈的实际工作电流,确认是否超出GPIO的最大输出能力;
考虑引入外部驱动电路(如MOSFET或H桥模块)以提升驱动能力;
优化PCB设计,减少信号干扰与寄生效应。

如需进一步协助,欢迎提供更详细的电机参数、电源电压及实际测量数据,我们将为您进行更深入的分析与建议。

[本文内容由国芯人工智能辅助生成,仅供参考]

yan鈥唋m鈥唘 发表于 6 天前

是不是因为有内部下拉的问题,软件能不能关闭内部下拉

jwd 发表于 6 天前

单片机一般不会直接这样驱动电机吧,最好加驱动电路

DebugLab 发表于 6 天前

IO最大电流20mA,请确保IO不要超电流

神农鼎 发表于 5 天前



51开源,步进电机驱动 程序, 直接驱动, 或驱动步进电机驱动器 一共8个程序 - 步进电机控制 国芯人工智能技术交流网站 - AI32位8051交流社区

yan鈥唋m鈥唘 发表于 5 天前

感谢大这的回复。 虽然这类微型电机有专用驱动芯片,很多情场景为了降低成本都是单片机直接驱动的。最大工作电流18ma正常应该是没什么问题。 现在在每个微步停留的时间要比较长,电机才能转动起来,电流太小就容易失步。

yan鈥唋m鈥唘 发表于 5 天前

DebugLab 发表于 2025-8-28 22:24
IO最大电流20mA,请确保IO不要超电流

电机线圈阻抗275欧,电流不会超过20mA.如果能正常输出20mA电流,就不会有问题的。

yan鈥唋m鈥唘 发表于 5 天前

jwd 发表于 2025-8-28 21:15
单片机一般不会直接这样驱动电机吧,最好加驱动电路

这类微型电机很多时候都是用直驱的。

DebugLab 发表于 5 天前

yan鈥唋m鈥唘 发表于 2025-8-29 10:42
电机线圈阻抗275欧,电流不会超过20mA.如果能正常输出20mA电流,就不会有问题的。 ...
IO设置为强驱动模式

页: [1] 2
查看完整版本: 帮忙看下关于32G8K GPIO口电流驱动能力问题