MWC飞控的油门等接收脚使用的是490Hz的PWM信号,用占空比来控制数值变化 - 个人感觉比较原始哈。arduio的analogWrite函数正好也是490Hz,所以MWC是用ardunio开发的么。
我设计的蓝牙接收器使用了内置8MRC作为振荡器,所以analogWrite就不能直接使用了。为了减轻掉晶振的重量,导致一个本来不应该超过20行代码的程序,折腾了近1个月,我也是很拼的哈。
从手册中找PWM,使用了Fast PWM,实现490Hz频率,代码如下:
void setupPWM9() // OC1A
{
pinMode(9, OUTPUT);
TCCR1A = 0;
TCCR1B = 0;
TCCR1B |= _BV(CS11) | _BV(CS10) | _BV(WGM12);
TCCR1A |= _BV(COM1A1) | _BV(WGM10);
OCR1A = 185;
}
void setupPWM56() // OC0B
{
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
TCCR0A = 0;
TCCR0B = 0;
TCCR0B |= _BV(CS01) | _BV(CS00);
TCCR0A |= _BV(COM0A1) | _BV(COM0B1) |_BV(WGM01) | _BV(WGM00);
OCR0B = 185;
OCR0A = 185;
}
void setupPWM3() // OC2B
{
pinMode(3, OUTPUT);
TCCR2A = 0;
TCCR2B = 0;
TCCR2B |= _BV(CS22);
TCCR2A |= _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
OCR2B = 185;
}
一共4个脚,对应YAW,THRO,PITCH,ROLL。至于3,5,6,9这几个脚完全是画图的时候随便选的。
64分频,185的占空比差不多是MWC的初始值1500。
公式如下 16M / 64 / 256≈ 976。