CW32L012小机器人的电机控制 电子说
电机作为现代电子系统的核心执行部件,是实现 “电能 - 机械能” 转换的关键载体,广泛渗透于工业自动化、智能机器人、消费电子、交通工具等众多领域。从精密设备的微小型驱动到工业生产线的大功率调速,电机的控制性能直接决定了系统的响应速度、运行精度、能耗效率与稳定性。这里分享CW32L012小机器人的正反转、调速的电机控制
电机的正反转

从配套的开发板资料介绍中可以知道,这是电机的驱动芯片RZ7899
从立创商城下载该芯片的数据手册https://item.szlcsc.com/93566.html

打开手册看到引脚定义和真值表


在根据资料中主板的电路原理图:

得到正反转的控制逻辑,需要两个IO口,通过拉高拉低两个IO口形成不同的逻辑,其输出也会有对应变化,就实现了电机的正反转控制
电机的调速
采用PWM调速,该方式是通过开关管不断的开关电源,形成周期固定,占空比可调的矩形波,具有成本低,稳定性高,简单高效等优点
下面是资料源码中的PWM和正反转IO口初始化代码:
void Motor_Init(void)
{
__SYSCTRL_GPIOB_CLK_ENABLE();
__SYSCTRL_GTIM3_CLK_ENABLE();
PB04_AFx_GTIM3CH3();
PB05_AFx_GTIM3CH4();
GPIO_InitTypeDef GPIO_Initstructure;
GPIO_Initstructure.IT=GPIO_IT_NONE;
GPIO_Initstructure.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_Initstructure.Pins=GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_3 | GPIO_PIN_12;
GPIO_Init(CW_GPIOB,&GPIO_Initstructure);
GTIM_InitTypeDef GTIM_InitStruct = {0};
GTIM_InitStruct.AlignMode = GTIM_ALIGN_MODE_EDGE;
GTIM_InitStruct.ARRBuffState = GTIM_ARR_BUFF_EN;
GTIM_InitStruct.Direction = GTIM_DIRECTION_UP;
GTIM_InitStruct.EventOption = GTIM_EVENT_NORMAL;
GTIM_InitStruct.Prescaler = 0;
GTIM_InitStruct.PulseMode = GTIM_PULSE_MODE_DIS;
GTIM_InitStruct.ReloadValue = 1000 - 1;
GTIM_InitStruct.UpdateOption = GTIM_UPDATE_DIS;
GTIM_TimeBaseInit(CW_GTIM3, >IM_InitStruct);
GTIM_OCModeCfgTypeDef GTIM_OCModeCfgStruct = {DISABLE, DISABLE, 0};
GTIM_OCModeCfgStruct.FastMode = DISABLE;
GTIM_OCModeCfgStruct.OCMode = GTIM_OC_MODE_PWM1;
GTIM_OCModeCfgStruct.OCPolarity = GTIM_OC_POLAR_NONINVERT;
GTIM_OCModeCfgStruct.PreloadState = DISABLE;
GTIM_OC3ModeCfg(CW_GTIM3, >IM_OCModeCfgStruct);
GTIM_OC4ModeCfg(CW_GTIM3, >IM_OCModeCfgStruct);
GTIM_OC3Cmd(CW_GTIM3, ENABLE);
GTIM_OC4Cmd(CW_GTIM3, ENABLE);
GTIM_Cmd(CW_GTIM3, ENABLE);
GTIM_SetCompare3(CW_GTIM3, 0);
GTIM_SetCompare4(CW_GTIM3, 0);
Car_Stop();
}
配置GTIM3定时器为输出比较模式,后续通过调整CCR的值来更改占空比来实现调速,配合上面提到的驱动芯片,就实现了电机的正反转和调速功能
电机的正反转、调速源码
void GTIM1_SetCompare1(uint16_t value)
{
value=(value>=1000)? 1000:value;
GTIM_SetCompare3(CW_GTIM3,value);
}
void Motor_Left_Run(int16_t value)//左电机
{
int16_t compare;
if(value>0)//正转
{
PB03_SETLOW();
compare=750value/900+250;//将外部遥控更改的速度值100-900线性缩放到占空比250-1000
}
else if(value<0)//反转
{
compare=750value/900-250;//将外部遥控更改的速度值100-900线性缩放到占空比250-1000
compare=1000+compare;
PB03_SETHIGH();
}
else //停止
{
PB03_SETLOW();
compare=0;
}
GTIM1_SetCompare1(compare);
}
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !