我正在尝试编写一个使用Arduino Mega 2560上的引脚11的简单PWM伺服控制。该伺服应该按CW(顺时针)或CCW(逆时针)转动,具体取决于按住两个按钮中的一个(L和R)。我似乎遇到的问题是,即使'if'语句不为真,我设置为更改OCR1A(i)的变量也在递增。按钮工作正如我使用Serial.println(PINA)
进行测试以确保。我真的不确定我哪里出错了。我将不胜感激任何帮助。
void setup() {
// put your setup code here, to run once:
TCCR1A |= (1<<COM1A1)|(1<<WGM11)|(1<<WGM10);
TCCR1B = 0B00001100; // set mode 7 and prescale to 256
DDRB |= (1<<PB5); // data direction register for PORTB(pwm output pin 11)
DDRA = (1<<2)|(1<<3); // Last 2 digits of PORTA are inputs
Serial.begin(9600); //initialize the serial
}
void loop() {
int i = 63;
// This value controls the duty cycle, duty(%) = OCR1A/255*100
// 63 is just a random start position
OCR1A = i;
int swL;
int swR;
swL = PINA & 0b00000001;
swR = PINA & 0b00000010;
while(i<160) {
if (swR != 0b00000001) {
i++; // increments OCR1A when button R is pressed
Serial.println(PINA); // For testing button is pressed
Serial.println(OCR1A); // debugging use
Serial.println(i); // debugging use
delay(100);
}
if(swL != 0b00000010) {
i--; // negative increments when button L is pressed
Serial.println(PINA);
Serial.println(OCR1A);
Serial.println(i);
delay(100);
}
}
}
答案 0 :(得分:0)
似乎PINA & 0b00000001
为swL
提供了一些价值。现在我无法找到PINA
的初始值,但我认为它是另一个具有二进制值的变量,所以当两个值执行 按位和 <时/ strong>他们为swL
提供了不同的值。
我想这就是if条件的原因
if (swL != 0b00000001)
计算到TRUE
,然后输入if语句。
另一个变量swR
也是如此,因此它也会进入if statement
。
我可能错了,但看看这些台词:
swL = PINA & 0b00000001;
swR = PINA & 0b00000010;
答案 1 :(得分:0)
谢谢,事实证明我只需要额外的一双眼睛。我的swR和swL被交换了。通过一些其他更改,它现在可以按预期工作。谢谢大家。