本帖最后由 希岩 于 2020-5-28 13:06 编辑
Arduino提供了PWM驱动库,但很难调整PWM频率。手头有有个无刷电机和一个电调,如何驱动电调呢?
可以看下面的连接http://www.rationmcu.com/lpc1114/1126.html
重要的是下面这些话: 电源线接电源,3个插孔接入三相电机的线,油门信号线共2条,黑色的是信号的GND,白色的就是信号线。商用的油门信号线,是采用PWM的的驱动方式,也就是说,我们随便找个单片机就可以给电调信号从而控制无刷电机运转了。我们现在拿到的这个好盈电调最大支持621Hz的PWM信号,下面的实验中,我们用500Hz的信号。速度是由PWM中高电平的时间决定的,一般从0.5~2.5ms。下面的实验中,我们用0.7ms作为最低速,1.9ms作为最高速,用单片机产生0.7ms到1.9ms之间的PWM信号,就可以把电机从0调到最大转速。
我们需要一个650HZ以下的PWM,占空比在0.5ms-2.5ms.采用ATmega328P的16位定时器1,定时器0用于delay函数了,不要轻易动。设置0.6ms为油门低,2.2ms为油门高对电调进行标定后就可以使用了,非常方便。这里我们的PWM频率只有大约250Hz,在允许范围内。
然后就可以上电测试了,连接在9或者10端口,再用一个放电倍率大的锂电池供电,就能驱动我们的无刷电机了。在试验中,我用示波器对脉宽进行了观测。控制器是Arduino Uno SMD edition。实验结果如图所示。
大家可以试一下,有问题可以问我哈。
[mw_shl_code=arduino,true]//功能:无刷电调驱动
//作者:凌晨七點半 @Copyright
//日期:2017.12.19
//PWM频率:243HZ
//注意:delay()用的定时器0,定时器1是十六位定时器
#define UPTIME 550 //2.2ms
#define DOTIME 150 //0.6ms
//------------------------------------------------------------
//初始化PWM,定时器1
//RFPWM=log(TOP + 1)/log(2)
void Init_PWM1(void)
{ //比较匹配时清零OC1A/OC1B, OC1A/OC1B 在TOP 时置位
TCCR1A |= (1<<COM1A1)|(1<<COM1B1)|(1<<WGM11)|(1<<WGM10); //page117
//快速PWM,预分频器64分频,page118 为4.1ms,243HZ
TCCR1B = (1<<WGM12)|(1<<CS11)|(1<<CS10);
OCR1A = UPTIME; //1.9ms
OCR1B = UPTIME; //1.9ms
}
//---------------------
void setup()
{int i;
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
Init_PWM1();
//标定过程,可以不要
//***********标定过程************
delay(2000); //3s内标定0.6ms和2.2ms
OCR1A=DOTIME ;
OCR1B=DOTIME;
delay(1000);
OCR1A=DOTIME;
OCR1B=DOTIME;
//************标定结束**********
for(i=0;i<400;i++)
{
OCR1A=DOTIME+i;
OCR1B=DOTIME+i;
delay(10);
}
OCR1A=300;
OCR1B=300; //0.6ms代表油门最低,2.2ms代表最高
}
//----------------------------
void loop()
{
}[/mw_shl_code] |