Алгоритм сглаживания шумов АЦП микроконтроллера.

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение Alex_641 »

20 . или нет ?

Добавлено after 8 minutes 16 seconds:
как бы в средней школе если 0 мандаринок или бананов - то считается что их нет. А в адресации массива в программировании , это считается адрес=1 .
Не спрашивай по ком звонит колокол, он звонит по тебе !
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25389
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение КРАМ »

[uquote="Alex_641",url="/forum/viewtopic.php?p=4367115#p4367115"]20?[/uquote]
Правильно. То есть в последнем цикле, где принимает участие индекс i+1 вы получите перестановку 21-го элемента. Классическая ошибка адреса.

Добавлено after 2 minutes 12 seconds:
[uquote="Alex_641",url="/forum/viewtopic.php?p=4367115#p4367115"]А в адресации массива в программировании , это считается адрес=1 .[/uquote]
С какого перепуга? Адрес в массиве - это индекс. Вы его задали начальным значением равным НУЛЮ. Правильно задали. Нулевой адрес массива - это указатель на массив.
Реклама
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение Alex_641 »

Нет же.
Не спрашивай по ком звонит колокол, он звонит по тебе !
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25389
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение КРАМ »

[uquote="Alex_641",url="/forum/viewtopic.php?p=4367127#p4367127"]Нет[/uquote]
Это не ваш день. Точно. Идите спать, а завтра откроете любой учебник по Си и прочитаете про нумерацию элементов в массиве.
Керниган вместе со своим неразлучным Ритчи вещают нам:
Изображение
Последний раз редактировалось КРАМ Вс фев 05, 2023 21:25:38, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение Alex_641 »

КРАМ писал(а):i+1 вы получите перестановку 21-го элемента
for (i=0;i<20;i++) // цикл
максимальное i может быть только 19, а если +1 то 20 .
Не спрашивай по ком звонит колокол, он звонит по тебе !
Реклама
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25389
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение КРАМ »

[uquote="Alex_641",url="/forum/viewtopic.php?p=4367134#p4367134"]если +1 то 20 .[/uquote]
Правильно, но счет в массиве С НУЛЯ. Скрин я вам выше привел.
Боюсь это принципиальная ваша уязвимость... :facepalm:
Последний раз редактировалось КРАМ Вс фев 05, 2023 21:28:14, всего редактировалось 1 раз.
Реклама
Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение Novice user »

Alex_641, for (i=0;i<20;i++) mass=read_adc(9); //счтываем 20 значений ацп помещаем в массив mass
какой индекс i у первого элемента массива и у последнего?
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение Alex_641 »

Ну так то да .... надо подумать ...
Не спрашивай по ком звонит колокол, он звонит по тебе !
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25389
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение КРАМ »

[uquote="Alex_641",url="/forum/viewtopic.php?p=4367141#p4367141"]надо подумать ...[/uquote]
Я вам скрин из отцов-основателей Си привел. Этого мало? :)))
Вы с легкостью дорабатываете традиционный алгоритм пузырька и не сомневаетесь в себе. А с нумерацией массива у вас очевидные проблемы... оксюморон кокойты...
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение Alex_641 »

Всмысле прога постоянно сканирует из несуществущего элемента массива 19+1 , меняет местами и ставит флаг что всё хорошо ?

Добавлено after 31 second:
поэтому и висит ?
Не спрашивай по ком звонит колокол, он звонит по тебе !
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25389
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение КРАМ »

[uquote="Alex_641",url="/forum/viewtopic.php?p=4367151#p4367151"]Всмысле прога постоянно сканирует[/uquote]
Осталось посмотреть порядок объявления переменных и понять что там по соседству с потерпевшим массивом находится... :)))
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение Alex_641 »

если хочешь ?
Не спрашивай по ком звонит колокол, он звонит по тебе !
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25389
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение КРАМ »

Это не я хочу, это вы хотите узнать причину зацикливания. Лишний элемент не может быть причиной, а вот чужое значение очень даже может...
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение Alex_641 »

хорошо.
Я попробую спрятать под спойлер. Если получится. Ещё не делал этого.

Добавлено after 1 minute 30 seconds:
Спойлер

Код: Выделить всё

/*******************************************************
Date    : 05.02.2023
Chip type               : ATtiny26
AVR Core Clock frequency: 4,000000 MHz
*******************************************************/

#include <alcd.h>
#include <delay.h>
#include <tiny26.h>
#define key PORTB.0     /// вход кнопка выкл. и переключение диаппазона 500/1000    
#define red PORTB.1     // питание красный светодиод индикация состояния акб
#define green PORTB.2   // питание зелёный светодиод индикация состояния акб
#define sw_off PORTB.3   // выход отключения питания 
#define l_h PORTB.4      //500/1000 
unsigned char i;   // вспомогательные переменные
unsigned int mass[20],z,tim,bat;
int a;


#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR)) // Voltage Reference: AREF pin


unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | ADC_VREF_TYPE;
delay_us(10);
ADCSR|=(1<<ADSC);
while ((ADCSR & (1<<ADIF))==0);
ADCSR|=(1<<ADIF);
return ADCW;
}

void main(void)
{
 
DDRA=(1<<DDA7) | (1<<DDA6) | (1<<DDA5) | (1<<DDA4) | (0<<DDA3) | (1<<DDA2) | (1<<DDA1) | (1<<DDA0);
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (1<<PORTB0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 3,906 kHz
TCCR0=(1<<CS02) | (0<<CS01) | (1<<CS00);
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 0,244 kHz
// Timer Period: 1,0486 s
PLLCSR=(0<<PCKE) | (0<<PLLE) | (0<<PLOCK);

TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<PWM1A) | (0<<PWM1B);
TCCR1B=(0<<CTC1) | (0<<PSR1) | (1<<CS13) | (1<<CS12) | (1<<CS11) | (1<<CS10);
TCNT1=0x00;
OCR1A=0x00;
OCR1B=0x00;
OCR1C=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);

// ADC initialization
// ADC Clock frequency: 62,500 kHz
// ADC Voltage Reference: AREF pin
//ADMUX=ADC_VREF_TYPE;
//ADCSR=(1<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);


// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTB Bit 7
// EN - PORTA Bit 1
// D4 - PORTA Bit 2
// D5 - PORTA Bit 4
// D6 - PORTA Bit 5
// D7 - PORTA Bit 6
// Characters/line: 16
sw_off=1; // удерживаем питание включенным ( защёлка механической кнопки на полевом ключе)
lcd_init(16);
lcd_gotoxy(0,0);  //инициализация лсд
lcd_putsf("U=500V "); //вывод на жки 
lcd_gotoxy(8,0);
lcd_putsf("R=");
lcd_gotoxy(0,1);
lcd_putsf("BAT=");
delay_ms(3000);
while (1)
      {
       
      for (i=0;i<20;i++) mass[i]=read_adc(9);  // +++++++++++++++++++++++++счтываем 20 значений ацп помещаем в массив mass
                         
      while (a>0)    // сортировка массива методом пузырька кол-во элементов 20    //+++++++++++++++расчёт измерений АЦП+++++++++++++++++++++
               {
                  for (i=0;i<20;i++)   // цикл 
                      {
                       a=0;             // флаг окончания сравнений сбросить
                        if (mass[i]>mass[i+1])  // если элемент меньше следующего то
                                       {
                                        z=mass[i];          // поменять
                                         mass[i]=mass[i+1]; // их
                                          mass[i+1]=z;      // местами
                                           a=1;             // установить флаг ( сортировка еще не закончена)
                                       }
                
                      }
               }
              lcd_putsf("BAT="); 
           TCNT1=0;// так надо ????????????????????????    
           z=0;    
           for (i=4;i<15;i++) z+=mass[i]; //суммируем 10 значений ( с 5-го по 14 )
            z=z/10; // находим среднее арифметическое
            lcd_gotoxy(10,0);// выводим значение на LCD
            lcd_putchar(z/100+48); //сотые 
            lcd_putchar((z%100)/10+48);// десятые
            lcd_putchar(z%10+48);  // единицы
            lcd_putsf("M  ");  // в конце выведенного числа буква "М" ( мегаом) с пробелами для затирания предыдущего показания
                                   // в дальнейшем буду исключать незначащие нули.
            
            if (key==0) {tim+=TCNT1; if (tim>10) sw_off=0; }//проверяем нажата ли кнопка если нажата более 2 сек отключаем питание
             
            else if (tim>1 && tim<5) {                                // если не нажата но счётчик времени нажатия не равен нулю значит было 
                                        tim=0;                        // отпускание кнопки и если время нажатия входит в пределы
                                        lcd_gotoxy(2,0);                   
                                         if (l_h==0) {l_h=1;lcd_putsf("1000V");} else {l_h=0;lcd_putsf("500V ");} // изменяем состояние выхода 500/1000 вольт
                                      };// 

           bat=read_adc(8); // замеряем напряжение на батарее питания
            lcd_gotoxy(1,4);  // выводим на табло
             lcd_putchar(bat/100+48); //вольт
              lcd_putsf(",");    
               lcd_putchar((bat%100)/10+48);// десятые   
                lcd_putchar(bat%10+48);  // единицы
                 lcd_putsf("V ");  
                
            if ( bat<334) {red=1;green=0;}   // если напруга акб < 6,6 В ( два лития ) зажеч красный потушить синий
            if (bat>333 && bat<360) {red=1;green=1;}// ну и так далее
            if ( bat>359) {red=0;green=1;}
               

      }
}

Не спрашивай по ком звонит колокол, он звонит по тебе !
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25389
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение КРАМ »

Зачем прятать? Всего то нужно показать объявление самого массива и то, что непосредственно за ним.
Ну либо тот же скрин с map-файла проекта.

Добавлено after 2 minutes 55 seconds:
[uquote="Alex_641",url="/forum/viewtopic.php?p=4367162#p4367162"]хорошо......unsigned int mass[20],z,tim,bat;[/uquote]
Итого имеем. Вы портите значение z.
Можете сами проанализировать... :tea:

Код: Выделить всё

                                      z=mass[i];          // поменять
                                         mass[i]=mass[i+1]; // их
                                          mass[i+1]=z;      // местами
То есть по факту во второй строке mass=z;, а в третьей z=z;
Последний раз редактировалось КРАМ Вс фев 05, 2023 21:58:08, всего редактировалось 1 раз.
u37
Сверлит текстолит когтями
Сообщения: 1242
Зарегистрирован: Пн май 01, 2017 20:01:45

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение u37 »

[uquote="КРАМ",url="/forum/viewtopic.php?p=4367111#p4367111"][uquote="Alex_641",url="/forum/viewtopic.php?p=4367089#p4367089"]но проходов 19 ![/uquote]
Даладна... :))) :))) :)))

Код: Выделить всё

for (i=0;i<20;i++)   // цикл
От 0 до 19 - это сколько будет?
1 класс средней школы...[/uquote]
"От 0 до 19" будет 19
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25389
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение КРАМ »

Еще один йуморист... :))) :))) :)))
Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение Novice user »

А так?
Спойлерwhile (a>0) // сортировка массива методом пузырька кол-во элементов 20 //+++++++++++++++расчёт измерений АЦП+++++++++++++++++++++
{a=0; // флаг окончания сравнений сбросить

for (i=0;i<19;i++) // цикл
{
if (mass>mass[i+1]) // если элемент меньше следующего то
{
z=mass; // поменять
mass=mass[i+1]; // их
mass[i+1]=z; // местами
a=1; // установить флаг ( сортировка еще не закончена)
}

}
}
Последний раз редактировалось Novice user Вс фев 05, 2023 22:08:47, всего редактировалось 1 раз.
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение Alex_641 »

А разница то какая ? Z - просто переменная промежуточная .
Не спрашивай по ком звонит колокол, он звонит по тебе !
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25389
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: Алгоритм сглаживания шумов АЦП микроконтроллера.

Сообщение КРАМ »

[uquote="Alex_641",url="/forum/viewtopic.php?p=4367174#p4367174"]А разница то какая ?[/uquote]
Я вам причел что по факту получилось. А получилось ОТСУТСТВИЕ СОРТИРОВКИ в 20-м проходе.
Последний раз редактировалось КРАМ Вс фев 05, 2023 22:13:07, всего редактировалось 1 раз.
Ответить

Вернуться в «AVR»