写在开头,本文为我本人在2023 ROBOCON期间为队伍设计直流无刷电机控制期间的初步所学。希望本文能帮到所有第一次入坑直流无刷电机的小白朋友们,文章纰漏星数,还望各位大佬多多包涵。
一、你可能已有或者可以用到的硬件:
- PWM输出器(某些平台五六块钱的舵机测试仪):
- 好盈(或者新西达)直流无刷电机电调
注意事项:
①电调不可少。一般来说买的时候要注意电池规格和最大电流,容我赘述:1s电池大致为3.6V-4.2V,所以3s电池大致就是适配12V航模电池。我之前买的新西达电调,只能2-3s,但电机可以承受24V-36V的电压,所以完全转不到满速。不过,换了好盈电调以后,就可以承受3-6s电池了,也就是能用到robocon常用的24V电池,转速简直起飞了。
电流的话,一般来说对于3s电池(12v)的话30A够用了。
24V的话,最好还是60A或者80A吧(没有确切验证)。
②买电调的时候,如果你没有电路基础,还是让店家焊好香蕉头(很关键!可以直接与电机三根控制线相连,方便很多)和XT30头或者T字头吧。
二、我买好东西了,也供上电了,该怎么接线才能让它动起来呢?:
首先强调,我们不去细致了解无刷电机的转速、正反的原理,只需要知道他们都是通过改变PWM控制信号(可以理解成一个高、低电平时长可控的方波)的占空比、频率来实现的。
如上述所述,我们用舵机测试仪或者配置了PWM引脚输出的单片机,再加上一个电调,是很容易实现通过PWM信号对电机的控制的。
如果你使用的是舵机测试仪,那直接插上就行,唯一要注意的是S是信号线,即图中白线。
一般来说,黑色都是GND,也就是图中的‘-’,直接插上就ok了。
插反了的话,一般也不会烧,不用担心。
如果你使用的是板子,那也简单
如上例,白线是信号线,接到输出信号的引脚,红线是供电线(经个人测试不接也没事),黑线是地线!重要,这根线必须接上!
好了,接下来接上电池,我们可以尝试让它转起来了!
三、初始化电调,输出PWM信号,驱动电机:
首先上图:
顺便解释一下,电调在第一次使用时,需要适配电机,调整油门。
大概就是告诉电调,告诉他PWM的占空比区间。
因此,对于舵机测试仪来说,只要将电调连上电机,然后上电,应该就会有反应了。
记得提前将舵机测试仪转到你想要的最大油门处。听到‘哔——哔’后,就可以将油门推到你想要的最低处了。
根据我的经验,一般来说,最低油门可以设置为最左端的5处,而最大油门设置在轮盘右端的3处就差不多了。
对于用板子控制来说,则要复杂一点。
首先,让我们来配置一下PWM的输出。
首先查看你板子的硬件配置,我用的是STM32F429,有八个时钟,我选择的是时钟3的通道4来输出PWM波。所以在timer.c中,我先配置了两个句柄。
TIM_HandleTypeDef TIM3_Handler; //定时器3PWM句柄
TIM_OC_InitTypeDef TIM3_CH4Handler; //定时器3通道4句柄
然后就是TIM3的PWM输出初始化:
//TIM3 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{
TIM3_Handler.Instance=TIM3; //定时器3
TIM3_Handler.Init.Prescaler=psc; //定时器分频
TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
TIM3_Handler.Init.Period=arr; //自动重装载值
TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&TIM3_Handler); //初始化PWM
TIM3_CH4Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
TIM3_CH4Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
TIM3_CH4Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //输出比较极性为低 ============变为‘高’
HAL_TIM_PWM_ConfigChannel(&TIM3_Handler,&TIM3_CH4Handler,TIM_CHANNEL_4);//配置TIM3通道4
HAL_TIM_PWM_Start(&TIM3_Handler,TIM_CHANNEL_4);//开启PWM通道4
}
好了,输出通道也配置好了,接下来只要初始化引脚,使能相应时钟,配置中断优先级就OK了。
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_TIM3_CLK_ENABLE(); //使能定时器3
__HAL_RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
GPIO_Initure.Pin=GPIO_PIN_1; //PB1
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
GPIO_Initure.Alternate= GPIO_AF2_TIM3; //PB1复用为TIM3_CH4
HAL_GPIO_Init(GPIOB,&GPIO_Initure);
HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3
HAL_NVIC_EnableIRQ(TIM3_IRQn); //开启ITM3中断
}
}
好了,接下来还有一些常用的函数,也别忘了在.h文件里配置:
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&TIM3_Handler);
}
void TIM_SetTIM3Compare4(u32 compare)
{
TIM3->CCR4=compare;
}
以上,我们就把板子配置完了。
接下来,我们进入与舵机控制仪一样的设置油门环节。
首先我们由说明书知道,要先给最大油门。
但是板子该怎么给呢? 这又不是控制仪,拿手拧来拧去就完事了。
别慌,我们先了解一个常识:
一般来说,对于50hz,20ms的PWM波,5%的占空比是最低油门,10%的占空比是最大油门。
那么,我们就让它输出50hz,20ms的PWM波吧!
话不多说,我们就在main函数里配置初始化吧:
u8 keyval=0;
Stm32_Clock_Init(360,25,2,8);//设置时钟,180Mhz
delay_init(180); //初始化延时函数
uart_init(115200); //初始化串口波特率为115200
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //按键初始化
TIM3_PWM_Init(200-1,9000-1);//20ms,10KHz
//TIM4_PWM_Init(800-1,2250-1); //90M/4500=20000的计数频率,自动重装载为200,那么PWM频率为20000/400=50hz,20ms
MotorPwm_Init();
对于以上,我需要解释的是,定时器是这样运行的。
我们已知STM32F429的时钟是180Mhz,具体原理我没有很搞懂,但是从同学那里问到,TIM要以90M作为主频。朋友们在移植的时候可以查看自己板子的频率进行设置。
那么时钟的计数频率每秒就是:90M / [ (9000-1) + 1 ] = 10000次
而前头的( 200 - 1 ) ,则是计数值。
每次计数时长为: [ ( 200 - 1 )+ 1 ] / 10000 = 1/50 再乘以1000ms也就是一秒,就是1000ms * 1/50 = 20ms,也就是50hz。
好了,我们配置好了定时器,接下来可以让它输出最大油门了,以下对于油门的操作,需要大家先行学习PWM波的基础知识,如果不想了解的话,也可以直接按照我的简单方法来:
我们知道PWM是通过比较CCR(计数值)和ARR(自动重装载值)来实现的,ARR也就是在TIM3_PWM_Init(200-1,9000-1)中提到的200这个敏感的数字。
鉴于此,我们已知设置好了ARR,那么只要已知操作CCR就可以操作油门了。
void MotorPwm_Init(void)
{
TIM3->CCR4 = 20;//油门拉满
TIM4->CCR1 = 20;//油门拉满
delay_ms(3000);
TIM3->CCR4 = 10;//油门拉低
TIM4->CCR1 = 10;//油门拉低
delay_ms(3000);
}
以上就是我们初始化油门的函数,按道理,在给电机通电后,再运行板子,你应该就能听到“哔——哔”,然后响起三声(12v电池)或者六声(24v电池)短鸣,最后一声“哔”就初始化完了。
按理说,这就可以动啦,不过,我们还需要一点语句,让它动起来。文章来源:https://www.toymoban.com/news/detail-501771.html
while(1)
{
keyval=KEY_Scan(0);
if(keyval == KEY0_PRES)
{
TIM3->CCR4 += 1; //调大油门,转速逐渐增大。
TIM4->CCR1 += 1;
}
if(keyval == KEY1_PRES)
{
TIM3->CCR4 -= 1;
TIM4->CCR1 -= 1;
}
if(keyval == KEY2_PRES)
{
TIM3->CCR4 = 10; //回到最小油门,急停
TIM4->CCR1 = 10;
}
if(keyval == WKUP_PRES)
{
MotorPwm_Init();
}
}
OK了,只要按KEY1,转速就会逐渐增加。记得要先开电调的电,再开板子的电,否则最开始的初始化代码可能不会得到完整运行。如果没有初始化成功,可以按一下wkup试试。文章来源地址https://www.toymoban.com/news/detail-501771.html
到了这里,关于【小白入门】新西达、好盈电调PWM控制直流无刷电机,以N5065为例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!