一条大海豹 2022-04-18 23:37 采纳率: 0%
浏览 828
已结题

stm32当PWM占空比小于50的时候驱动编码器电机不转

问题遇到的现象和发生背景

在用STM32F103C8T6驱动编码器电机MG513P20_12V时,PWM占空比小于50的时候通过电机驱动模块驱动电机不转,当PWM占空比大于50的时候,电机开始缓慢转动,就像正常PWM占空比为1的情况,当PWM占空比为100时电机仍可以达到最高转速,用LED二极管和示波器检测PWM输出正常。PWM频率20kHZ

问题相关代码,请勿粘贴截图

#include "Device/Include/stm32f10x.h" // Device header
配置PWM部分相关代码
void PWM_Init()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
GPIO_Init(GPIOB,&GPIO_InitStructure);


TIM_InternalClockConfig(TIM3);

TIM_TimeBaseInitTypeDef TIM_Time3BaseInitStruct;
TIM_Time3BaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1;
TIM_Time3BaseInitStruct.TIM_CounterMode= TIM_CounterMode_Up;
TIM_Time3BaseInitStruct.TIM_Period= 100-1;//ARR
TIM_Time3BaseInitStruct.TIM_Prescaler= 36-1;//PSC
TIM_Time3BaseInitStruct.TIM_RepetitionCounter= 0;
TIM_TimeBaseInit(TIM3,&TIM_Time3BaseInitStruct);

TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse= 0; //ccr

TIM_OC1Init(TIM3,&TIM_OCInitStructure);
TIM_OC2Init(TIM3,&TIM_OCInitStructure);
TIM_OC3Init(TIM3,&TIM_OCInitStructure);
TIM_OC4Init(TIM3,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);        //使能预装载寄存器
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);        
TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);

TIM_Cmd(TIM3,ENABLE);

}

void PWM_SetCompare1(uint16_t Compare)
{
TIM_SetCompare1(TIM3,Compare);
}

void PWM_SetCompare2(uint16_t Compare)
{
TIM_SetCompare2(TIM3,Compare);
}

void PWM_SetCompare3(uint16_t Compare)
{
TIM_SetCompare3(TIM3,Compare);
}

void PWM_SetCompare4(uint16_t Compare)
{
TIM_SetCompare4(TIM3,Compare);
}

电机正反转逻辑部分代码
void MotorL_setspeed(int speed)
{
if(speed <= 0)
{
// GPIO_SetBits(GPIOA,GPIO_Pin_4);
// GPIO_ResetBits(GPIOA,GPIO_Pin_5);
PWM_SetCompare1(0);
PWM_SetCompare2(-speed);
}
else
{
// GPIO_SetBits(GPIOA,GPIO_Pin_5);
// GPIO_ResetBits(GPIOA,GPIO_Pin_4);
PWM_SetCompare1(speed);
PWM_SetCompare2(0);
}
}

void MotorR_setspeed(int speed)
{
if(speed <= 0)
{
// GPIO_SetBits(GPIOB,GPIO_Pin_7);
// GPIO_ResetBits(GPIOB,GPIO_Pin_6);
PWM_SetCompare3(0);
PWM_SetCompare4(-speed);
}
else
{
// GPIO_SetBits(GPIOB,GPIO_Pin_6);
// GPIO_ResetBits(GPIOB,GPIO_Pin_7);
PWM_SetCompare3(speed);
PWM_SetCompare4(0);
}
}

运行结果及报错内容

当MotorL_setspeed(0)到MotorL_setspeed(50)时候均不转,大于MotorL_setspeed(50)时开始转动,负值同理

我的解答思路和尝试过的方法

起先使用L298N出现这个问题,后来换了A4950模块后正常使用了一天,后来在调试PID的时候又出现了这个问题。

我想要达到的结果

在PWM占空比0~100时均可驱动电机

  • 写回答

2条回答 默认 最新

  • 柒壹漆 2022-04-19 09:04
    关注

    PWM频率有点高,降低一点试试。不同的电机电感量会有区别,施加高频率的电压后,由于感抗作用,电流可能会很小,从而导致电机“无力”。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月2日
  • 修改了问题 4月18日
  • 创建了问题 4月18日

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料