ATMEGA328P使用内部8MRC振荡器(PWM控制) (2015-08-09 23:05:49)

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。

你可能感兴趣的:(ATMEGA328P使用内部8MRC振荡器(PWM控制) (2015-08-09 23:05:49))