2016-08-31 4 views
0

Я начинаю с ардуино, и я пытаюсь создать генератор синусовой волны. Поскольку я недавно обнаружил, что не могу поместить все в основной цикл void, я пытаюсь использовать прерывания. У меня проблема с изменением переменной внутри прерывания (Delay), я не знаю, где ошибка. Вот мой код:переменная прерывания arduino не работает

int sine256[] = { //256 sin values from 0 to 2pi 
}; 

int i = 0; 
int sensorPin = 7; 
int outputPin = 6; 
volatile float Delay = 10000; 


void setup() 
{ 
    Serial.begin(9600); 
    pinMode(outputPin, OUTPUT); 
    pinMode(sensorPin, INPUT); 
    attachInterrupt(digitalPinToInterrupt(sensorPin), freq, RISING); 

} 
void loop() 
{ 
    analogWrite(6,sine256[i]); 
    i = i + 1; 
    if(i == 256){ 
    i = 0; 
    } 

    Serial.println(Delay); 

    delayMicroseconds(Delay); 
} 

void freq() { 
    Delay = Delay/2;  
} 
+0

На вашей 'void setup', измените' pinMode (sensorPin, INPUT); 'to' pinMode (sensorPin, INPUT_PULLUP); '. Среднее значение 'INPUT' не включает ребро« RISING/FALLING ». @nyuhanC – dsgdfg

ответ

0

EDIT

Попробуйте это:

int sine256[] = { //256 sin values from 0 to 2pi 
}; 

int i = 0; 
int sensorPin = 7; 
int outputPin = 6; 
volatile float Delay = 10000; 


void setup() 
{ 
    Serial.begin(9600); 
    pinMode(outputPin, OUTPUT); 
    pinMode(sensorPin, INPUT); 
    //attachInterrupt(digitalPinToInterrupt(sensorPin), freq, RISING); 

} 
void loop() 
{ 
    analogWrite(6,sine256[i]); 
    i = i + 1; 
    if(i == 256){ 
    i = 0; 
    } 

    Serial.println(Delay); 

    freq(); 
    delay(Delay); 
} 

void freq() { 
    Delay = Delay/2;  
} 

https://www.arduino.cc/en/Reference/AttachInterrupt

Попробуйте взглянуть на это.

Какую модель вы используете?

+0

Я понял, что использовал неправильный штырь, на uno я должен делать на контакте 2 или 3. Но все же он не работает должным образом, я вижу на последовательном мониторе, что задержка меняется, когда я нажимаю кнопку, но выходная частота не меняется:/ – nyuhanC

+0

o похоже, что он работает с регулярной задержкой(), что не так с задержкой Microseconds ?? – nyuhanC

+0

@nyuhanC Хороший вопрос, это может быть просто сбой в оборудовании, может зависеть от платы. Я знаю, что delay() работает на всех досках. возможно, стоит поставить задержку в цикле и выполнить код через цикл. Я отредактировал свой ответ, чтобы показать, как я бы это сделал – Astrify

0

Единственная вещь, которая вызывает у меня проблемы сейчас - это кнопка; когда я нажимаю на него, он часто реагирует так, как будто я нажал кнопку несколько раз (2,3 или 4 раза).

Это мой последний код на данный момент. Поскольку время выполнения для контура void составляет 12 микросекунд, я рассчитал задержку, необходимую для запуска генератора на 20,40 & 60 Гц.

int sine256[] = { //256 sin values from 0 to 2pi (from 0 to 255) 
int i = 0; 
int sensorPin = 2; 
volatile int outputPin = 7; 
volatile float Delay = 1000; 
int time1; 
int time2; 

void setup() 
{ 
    Serial.begin(9600); 
    pinMode(outputPin, OUTPUT); 
    pinMode(sensorPin, INPUT_PULLUP); 
    attachInterrupt(digitalPinToInterrupt(sensorPin), freq, FALLING); 

} 
void loop() 
{ 
    //time1 = micros(); 

    analogWrite(outputPin,sine256[i]); 
    i = i + 1; 
    if(i == 256){ 
    i = 0; 
    } 

    //time2 = micros(); 

    //Serial.println(time2 - time1); 

    delay(Delay); 
} 

void freq() { 
    outputPin = 6; 
    if(Delay == 0.02){ 
    analogWrite(6,LOW); 
    outputPin = 7; 
    Delay = 1000; 
    } 
    if(Delay == 0.04){ 
    Delay = 0.02; 
    } 
    if(Delay == 0.09){ 
    Delay = 0.04; 
    } 
    if((Delay == 1000)&&(outputPin == 6)){ 
    Delay = 0.09; 
    } 
    Serial.println(Delay); 
} 
Смежные вопросы