датчик такой (WSU) http://gidrolock.ru/production/datchiki ... gidrolock/
у контроллера один общий минус и несколько входов
у датчика +, -, и выход
Фууух, спасибо, полегчало. 1,9 мА. Странно, обычно я с потреблением не заморачивался и оставлял ноги висеть в воздухе в 3-м состоянии. И ДШ про то же подтверждает что так лучше не делать:ARV писал(а):неконтролируемых утечках, если все пины находятся в режиме входов
Unconnected pins
If some pins are unused, it is recommended to ensure that these pins have a defined level. Even though most of the digital inputs are disabled in the deep sleep modes as described above, floating inputs should be avoided to reduce current consumption in all other modes where the digital inputs are enabled (Reset, Active mode and Idle mode).
The simplest method to ensure a defined level of an unused pin, is to enable the internal pull-up. In this case, the pull-up will be disabled during reset. If low power consumption during reset is important, it is recommended to use an external pull-up or pull-down. Connecting unused pins directly to VCC or GND is not recommended, since this may cause excessive currents if the pin is accidentally configured as an output.
http://mymcu.ru/hybroid писал(а):Надо выбрать какой-то МК на ядре 51.
Не вполне понятно КАК Вы реализовали буфер этих 64 значений.pokk писал(а): Понадобилось мне вывести на индикатор данные из АЦП, что бы на индикаторе они сильно не прыгали сделал суммирование 64 значений, а после делением сдвигом. Так вот теперь значение на индикаторе более менее установилось, но если значение АЦП будет на границе перехода 0.9-1.0, то небольшое колебания АЦП опять приводит к прыганию данных на индикаторе.
Почему нельзя сначала заполнить буфер, а потом вычислить среднее?КРАМ писал(а):Буфер нужно заполнять ПО КРУГУ и вычислять среднее после КАЖДОЙ НОВОЙ ЗАПИСИ в буфер.
Код: Выделить всё
#define FILTR_DEPTH 64
static uint16_t adc_one_shot(void){
ADCSRA |= 1<<ADSC;
while(ADCSRA & (1<<ADSC));
return ADC;
}
uint16_t get_filtered_sample(void){
static uint16_t filtr[FILTR_DEPTH];
static current_sample = 0;
uint32_t sum = 0;
fltr[current_sample] = adc_one_shot();
if(++current_sample >= FILTR_DEPTH) current_sample = 0;
for(uint8_t i=0; i<FILTR_DEPTH;i++) sum += filtr[i];
return sum / FILTR_DEPTH;
}Не рассмотривая оптимизацию под конкретную архитектуру...ARV писал(а):не самый оптимальный по быстродействию
Код: Выделить всё
uint16_t get_filtered_sample(void){
static uint16_t filtr[FILTR_DEPTH];
static current_sample = 0;
static uint32_t sum = 0;
sum =- fltr[current_sample];
fltr[current_sample] = adc_one_shot();
sum =+ fltr[current_sample];
if(++current_sample >= FILTR_DEPTH) current_sample = 0;
return sum / FILTR_DEPTH;
}