Настройка таймера ATMega328p (Arduino)
Я пытаюсь измерить мощность переменного тока с помощью Arduino с Atmega328p. Вкратце, я хочу использовать timer1 для создания прерывания каждые 400us, где я измеряю два канала АЦП (A0 и A1) и помещаю их в массив. Проблема в том, что вместо измерения пяти периодов сети (частота сети = 50 Гц, то есть 20 мс * 5), я получаю вместо этого 13 таких периодов (260 мс). Что я делаю не так?
volatile int sample_incremental = 0;
void setup() {
Serial.begin(115200);
pinMode(voltagePin, INPUT);
pinMode(currentPin, INPUT);
set_sample_interrupt();
sei();
}
void set_sample_interrupt() {
//Считаем до 400us
OCR1A = 99;
//Режим 4, CTC
TCCR1B |= (1 << WGM12);
//Включить прерывание
TIMSK1 |= (1 << OCIE1A);
//Предделитель 64
TCCR1B |= (1 << CS11) | (1 << CS10);
}
ISR (TIMER1_COMPA_vect) {
// действие, которое будет выполняться каждые 400 мкс
current_sample[sample_incremental] = analogRead(currentPin) - 504;
voltage_sample[sample_incremental] = analogRead(voltagePin) - 512;
if (sample_incremental < (SAMPLES * PERIODREADS))
sample_incremental++;
else {
//Отключить прерывание
TIMSK1 &= ~(1 << OCIE1A);
sample_incremental = 0;
finishedReading = true;
}
}
Где после того, как я сделаю одно чтение, я останавливаю прерывание, и SAMPLES * PERIODREADS = 250.
@Cezar Chirila, 👍1
0
Смотрите также:
- Генерация стабильной частоты
- Самая низкая мощность, возможная в Arduino
- Как перевести ATtiny/ATmega в режим глубокого сна (чтобы годами работать от батарей), но при этом обнаруживать нажатие кнопки?
- Включайте Arduino по таймеру каждые 24 часа.
- Как отслеживать миллисекунды в спящем режиме
- Таймер 2 «Очистить OC2B при сравнении совпадений» не работает в режиме CTC
- Как сохранить данные в arduino при отключении питания
- Датчик DHT11: режим ожидания или выключение?