【小白入门】新西达、好盈电调PWM控制直流无刷电机,以N5065为例

写在开头,本文为我本人在2023 ROBOCON期间为队伍设计直流无刷电机控制期间的初步所学。希望本文能帮到所有第一次入坑直流无刷电机的小白朋友们,文章纰漏星数,还望各位大佬多多包涵。

一、你可能已有或者可以用到的硬件:


  1. PWM输出器(某些平台五六块钱的舵机测试仪):
    如图,一般可以输出3路控制信号,还不错
  2. 一个普通的直流无刷电机
    还有它的三根控制线
  3. 好盈(或者新西达)直流无刷电机电调
    一端为香蕉头,一端为XT60头

注意事项:

①电调不可少。一般来说买的时候要注意电池规格和最大电流,容我赘述: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信号从PB1输出,然后电调与板子共GND

 好了,接下来接上电池,我们可以尝试让它转起来了!


三、初始化电调,输出PWM信号,驱动电机:

首先上图:

顺便解释一下,电调在第一次使用时,需要适配电机,调整油门。

大概就是告诉电调,告诉他PWM的占空比区间。

以上是好盈电调,由图我们知道要先调最大油门,确认后给出一个最低油门
只要电调​​响了与你电池节数相同的声音,就代表设定完毕!
Ps:对于新西达电调,一般是响一声表示确认低电平,响两声表示确认完毕,可以启动。

因此,对于舵机测试仪来说,只要将电调连上电机,然后上电,应该就会有反应了。

记得提前将舵机测试仪转到你想要的最大油门处。听到‘哔——哔’后,就可以将油门推到你想要的最低处了。

根据我的经验,一般来说,最低油门可以设置为最左端的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电池)短鸣,最后一声“哔”就初始化完了。

按理说,这就可以动啦,不过,我们还需要一点语句,让它动起来。

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试试。

  • 33
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值