这标题下的可能不是很好还请见谅
我近日遇到一个神奇的问题,在Arduino Mega2560
我目前使用MPU6050获取姿态资料(2-wire,I2C)
用于控制马达,由于Arduino默认的PWM resolution只有8bits
所以我采用自己写的PWM设定如下:
void pwm_init()
{
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
TCCR4A = _BV(COM4A1) | _BV(COM4B1) // non-inverting PWM
| _BV(WGM41); // mode 10: PWM, Phase Correct,
//TOP=ICR4
TCCR4B = _BV(WGM43) | _BV(CS40); // no prescaling
ICR4 = 26666; //300Hz TOP counter value
OCR4A = 100;
OCR4B = 100;
TCCR1A = _BV(COM1B1) | _BV(COM1C1) // non-inverting PWM
| _BV(WGM11); // mode 10: PWM, Phase Correct,
// TOP=ICR1
TCCR1B = _BV(WGM13) | _BV(CS10); // no prescaling
ICR1 = 26666;
OCR1C = 100;
OCR1B = 100;
TIMSK1 = 0;
TIMSK4 = 0;
}
这段程式码单独测试都没有问题,而MPU6050的程式码单独测试也没有问题
MPU6050采用I2Cdevlib的library,程式码类似:
https://reurl.cc/g7l9L (官方sample code)
读取资料部份全部搬入ISR中
只要两者一合并(单单pwm_init()搬入setup()中),MPU6050大约跑个30秒就crash,但是
只要移除pwm_init(),就可以跑十几分钟都不是问题。
我有读过ATmega640/V-1280/V-1281/V-2560/V-2561/V 这份datasheet,里头I2C (2-wire)
是跟PWM无关的(clock source等都无关)。
想请问各位大大有什么可能的原因会造成类情形呢?
任何可能性都可以提出来,我会尽量去试试debug。