я тоже думал так, может поставить задержку в районе 0,5 секунды?titoFF писал(а):Може данные слишком часто обновляются, цифры меняются часто, а глаз неуспевает...
Помогите чайнику с АЦП на avr
- Реклама
Так что мешает поставить и посмотреть, что изменится?dictor писал(а):я тоже думал так, может поставить задержку в районе 0,5 секунды?
На мой взгляд, у Вас не совсем верный алгоритм. Из-за шумов несколько младших разрядов результата измерения могут быть недостоверны. Плюс само измеряемое напряжение может в известных пределах колебаться. А значит, для получения более-менее стабильной картины следует производить оцифровку несколько раз, вычислять среднее арифметическое и уже его выводить на экран.
Оцифровывайте, после каждой итерации считайте среднее арифметическое как "скользящий интеграл" за, допустим, 10 последних итераций. Инициализируйте таймер на 0,5 секунды и в обработчике прерывания по переполнению делайте вывод имеющегося на данный момент результата среднего арифметического.
Спасибо, ббуду пробовать, просто я ещё не совсем оазобрался с прерываниями, просто это еще дополнительная трудность, я с теми что были еле разобралсяAlkul писал(а):Так что мешает поставить и посмотреть, что изменится?dictor писал(а):я тоже думал так, может поставить задержку в районе 0,5 секунды?
На мой взгляд, у Вас не совсем верный алгоритм. Из-за шумов несколько младших разрядов результата измерения могут быть недостоверны. Плюс само измеряемое напряжение может в известных пределах колебаться. А значит, для получения более-менее стабильной картины следует производить оцифровку несколько раз, вычислять среднее арифметическое и уже его выводить на экран.
Оцифровывайте, после каждой итерации считайте среднее арифметическое как "скользящий интеграл" за, допустим, 10 последних итераций. Инициализируйте таймер на 0,5 секунды и в обработчике прерывания по переполнению делайте вывод имеющегося на данный момент результата среднего арифметического.
- Сообщения: 1
- Зарегистрирован: Сб мар 08, 2014 23:36:05
всем привет, аналогичная проблема не запускается ацп
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
void ADC_init()
{
ADMUX = 0x00;
ADCSRA = 0x8E;
}
unsigned int ADC_result(unsigned char adc_input)
{
ADMUX=adc_input | (ADMUX & 0xF0);
_delay_us(10);
ADCSRA |= 0x40;
// while((ADCSRA & 0x10)==0);
while ((ADCSRA&(1 << ADIF))== 0);
ADCSRA|=0x10;
return ADCH;
}
void main(void) {
int i=0;
DDRC = 0x00;
DDRB = 0xFF;
PORTB = 0xFF;
ADC_init();
sei();
while(1)
{
i=ADC_result(0);
if(i != 0)
PORTB = 0x00;
else
PORTB = 0xFF;
}
}

