Как измерить скважность ШИМ.
Приветствую, уважаемые!
Есть ШИМ сигнал 50 Гц. (12В) Нужно читать скважность.
Покопавшись в гугляндексе, обнаружил, что нужно устанавливать прерывания по фронту импульса, потом по спаду, потом снова по фронту, засекая время при этом. Расчеты довольны элементарны, а вот "махинации" с прерываниями для меня темный лес.
Что-то чувствую без вашей помощи не осилю задачу.
Спасибо.
Re: Как измерить скважность ШИМ.
Посмотри тему про парктроник.
Re: Как измерить скважность ШИМ.
Спасибо, стало чуть понятнее.
Re: Как измерить скважность ШИМ.
Так будет работать?
PHP код:
#include <TimerOne.h>
#define LEDPIN 13 // Вывод светодиода
#define BTNPIN 2
volatile uint16_t duty=0;
volatile uint16_t timeRising = 0;
volatile uint16_t timeFalling = 0;
void setup()
{ /*
LOW — вызов прерывания всякий раз, когда на порту низкий уровень напряжения;
CHANGE – прерывание вызывается при изменении значения на входе;
RISING – вызов прерывания при изменении уровня напряжения с низкого (LOW) на высокое(HIGH)
FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкое (LOW)
*/
pinMode(BTNPIN, INPUT);
Serial.begin(115200);
Timer1.initialize(20);
Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
attachInterrupt(0, fireUp, RISING);
}
void callback() { duty=20/(timeFalling-timeRising); } //делим период на ширину импульса
void loop()
{
}
// Функция обработки прерывания на подъем
void fireUp()
{
detachInterrupt(0);
timeRising = millis();
attachInterrupt(0, fireDown, FALLING);
}
// Функция обработки прерывания на спад
void fireDown()
{
detachInterrupt(0);
timeFalling = millis();
attachInterrupt(0, fireUp, RISING);
}
Re: Как измерить скважность ШИМ.
Так не работает. Помогайте со скетчем, плиз.
Мозг закипает :(
Re: Как измерить скважность ШИМ.
Вот код, который заработал. Со второй ардуины сгенерил ШИМ (analogWrite(9, x)).
PHP код:
#include <TimerOne.h>
#define LEDPIN 13 // Вывод светодиода
#define BTNPIN 2
volatile uint16_t startImpuls;
volatile uint16_t lengthImpuls;
volatile uint16_t timerCount=0;
void setup()
{ /*
LOW — вызов прерывания всякий раз, когда на порту низкий уровень напряжения;
CHANGE – прерывание вызывается при изменении значения на входе;
RISING – вызов прерывания при изменении уровня напряжения с низкого (LOW) на высокое(HIGH)
FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкое (LOW)
*/
startImpuls=0;
lengthImpuls=0;
pinMode(BTNPIN, INPUT);
Serial.begin(115200);
Timer1.initialize(8);
Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
attachInterrupt(0, fireUp, RISING);
}
void callback() { timerCount++; }
void loop()
{
//delay(1000);
Serial.println(lengthImpuls, DEC);
}
// Функция обработки прерывания на подъем
void fireUp()
{
detachInterrupt(0);
startImpuls = timerCount;
attachInterrupt(0, fireDown, FALLING);
}
// Функция обработки прерывания на подъем
void fireDown()
{
detachInterrupt(0);
lengthImpuls = timerCount - startImpuls;
startImpuls=0;
timerCount=0;
attachInterrupt(0, fireUp, RISING);
}
Если кто подскажет, почему именно 8 мс (нашел значение методом тыка :o) надо для инициализации таймера, буду очень признателен.
Точность измерения меня полностью устраивает.
зы: требую памятник! :D
oops1, респект! Без твоего кода из парктроника копался бы до покоса. :)
zhserg, спасибо за наводку на тему!
Re: Как измерить скважность ШИМ.
Приветствую, уважаемые!
Расскажите/покажите, как использовать ICP1 для данной задачи. Ведь явно специальный вход.
The Timer/Counter incorporates an Input Capture unit that can capture external events
and give them a time-stamp indicating time of occurrence. The external signal indicating
an event, or multiple events, can be applied via the ICP1 pin or alternatively, via the
Analog Comparator unit. The time-stamps can then be used to calculate frequency,
duty-cycle, and other features of the signal applied.
Видимо решение тут: http://www.embedds.com/programming-1...-on-atmega328/
Re: Как измерить скважность ШИМ.
Цитата:
Сообщение от
BlkDem
Приветствую, уважаемые!
Расскажите/покажите, как использовать ICP1 для данной задачи. Ведь явно специальный вход.
The Timer/Counter incorporates an Input Capture unit that can capture external events
and give them a time-stamp indicating time of occurrence. The external signal indicating
an event, or multiple events, can be applied via the ICP1 pin or alternatively, via the
Analog Comparator unit. The time-stamps can then be used to calculate frequency,
duty-cycle, and other features of the signal applied.
Видимо решение тут:
http://www.embedds.com/programming-1...-on-atmega328/
Почитай тут в самом начале.
Re: Как измерить скважность ШИМ.
XsanderS, спасиб, канеш, но я же дал ссылку, где все расписано ;)
http://www.embedds.com/programming-1...-on-atmega328/
полностью рабочий код.
По твоей ссылке ничего нового и/или интересного :)