问题遇到的现象和发生背景
在用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时均可驱动电机