Перейти к содержанию

Вопросы от начинающих по МК


Рекомендуемые сообщения

Операции над числами с плавающей точкой - достаточно ресурсоемкие и медлительные. Для AVR добавление в программу переменной float с небольшими вычислениями прибавляет порядка 1,5К весу к прошивке. Ну и какое-нибудь сложение с float может длится порядка нескольких сотен микросекунд.

Если же вы соберетесь выводить float при помощи стандартных функций типа sprintf-printf, то это добавит еще порядка 2К к прошивке, при том что сама поддержка sprintf-printf (даже без float!) - это тоже около 1,2К.

Так что если пара сотен микросекунд на операцию и от 1,5 до 3,5К прошивки для вас не проблема - не ломайте себе мозг, пользуйтесь float и спите спокойно :) В частности, любые простенькие термометры-вольтметры на atmega8 прекрасно уживаются как с printf-ом, так с float-ом.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

3 минуты назад, ARV сказал:

Так что если пара сотен микросекунд на операцию и от 1,5 до 3,5К прошивки для вас не проблема

Вот по этому я и перешел на стм)) за деньги какой нить атмеги8 получаем 48-72мгц и 64кб памяти)) 

Теперь в инкубаторе я написал sprintf("%d.%d", t->i, t->d) и даже не заметил расхода памяти :D 

Ну не только по этому)) но в целом пока мне все больше нравиться, даже к настройке тактирования привык уже и прочей периферии) с CMSIS

Изменено пользователем DrobyshevAlex
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Вот сколько не читай, а обьяснение человеческим языком и многое становится на свои места. Теперь я понял о чем говорил IMXO. Теперь буду вникать в остальную часть его сообщения

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Только что, DrobyshevAlex сказал:

Теперь в инкубаторе я написал sprintf("%d.%d", t->i, t->d) и даже не заметил расхода памяти

Вы не поверите: я и на AVR так делаю :)

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Только что, ARV сказал:

Вы не поверите: я и на AVR так делаю

та я тоже делал ) просто вот ща инкубатор написал, вышло под 20кб прошивки :D ну это в дебаге, но думаю как бы я умещал это все в свою любимую атмегу8.

Хотя подозреваю что все таки расход памяти у стм побольше) То есть видимо это связано с тем что в CMSIS или HAL так не любят define а любят переменные и функции))

Не понимаю зачем... Прям не хочу юзать из за этого) Хочу писать без CMSIS :D но не готов пока))

Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, Дмитрий Мамедиев сказал:

IMXO что то вы слишком сложно написали.

что тут сложного?

unsigned char Buffer[5]={'0',',','0','0',0};

void Converter_ADC (void)
{static unsigned int Symm_ADC;
 static unsigned char count;
   Symm_ADC+=read_ADC();
   if(count==64)
   {unsigned int volt;
     Symm_ADC>>=6;
     volt=(Symm_ADC*500L)>>10;
     Buffer[0]= (volt/100) + '0';
     Buffer[2]= ((volt%100)/10) + '0';
     Buffer[3]= (volt%10) + '0';
     Symm_ADC=0; 
     count=0;
   }
   else
     {
       count++;
     }
}//end Converter_ADC

 

Ссылка на комментарий
Поделиться на другие сайты

Почему сдвигаем на 6, а потом вольты на 10 и почему умножаем на 500L. Короче вопросов меньше не стало, а так смысл ясен.

Ссылка на комментарий
Поделиться на другие сайты

потому, что 2 в степени 6 равно 64 , а мы сделали 64 замера, и очень быстро делим на 64

потому что 2 в степени 10 равно 1024 , очень быстро делим на 1024 (кол-во дискрет АЦП)

потому что для максимального значения АЦП хотим получить 5.00в , если не обращать внимание на запятую то получается 500. а тк 1023*500 больше 16 бит , добавляем L (указываем компилятору, что результат умножения нам нужен 32бит) , сдвигаем на 10 снова получаем 16бит

потому что 1023*0,0048 = 4,9104 = 4,91в ошибка 9МЗР и долгая математика с числами с плавающей запятой

потому что 1023*500/1024=499,511=499в ошибка 1МЗР и быстрая целочисленная математика.

 

 

Ссылка на комментарий
Поделиться на другие сайты



(указываем компилятору, что результат умножения нам нужен 32бит) , сдвигаем на 10 снова получаем 16бит

Вот здесь никак не могу понять почему сдвигаем на 10 получим из 32 -16. Или мы сдвигаем до 10бит? Т.е. 10 бит остаются?

Я понял!!!!! Понял до каждого байта! До каждой единицы и нолика!!!! Нихерасе.... так хитро замутить, это какой изощренный мозг у вас!!!! Короче посидел с калькулятором и охерел.

Ссылка на комментарий
Поделиться на другие сайты

 

формула: Uвх=N*Umax/2^D, где Uвх - напряжение на показометре , N - результат АЦП, Umax - максимальное напряжение входа соответствующие максимальному значению АЦП, D - разрядность АЦП (или максимальное значение АЦП).

АЦП = 10 разрядов. 2^D = 2^10=1024  , деление на 2^10 это сдвиг на 10 вправо . деление заменили сдвигом.

500 = 9разрядов - хватает переменной 16бит и максимальное значение АЦП 10разрядов - хватает переменной 16бит ;  500*1023 = 9разр+10разр = 19разр , в переменную 16бит не влазит , поэтому увеличиваем разрядность до 32... ,

Ссылка на комментарий
Поделиться на другие сайты

Вот именно деление заменили сдвигом! Я когда это понял вообще попутал. И это я гланды через опу? Да это бдсм в области математики!!!

Ссылка на комментарий
Поделиться на другие сайты

34 минуты назад, Дмитрий Мамедиев сказал:

так хитро замутить, это какой изощренный мозг у вас!!!!

к моему мозгу это не имеет никакого отношения, системы исчисления еще в царской России в 4 классе преподавали ;). могу пдфку по арифметике за 1912г скинуть, правда она на старо-словянском, но читать вполне можно.

 

2 минуты назад, Дмитрий Мамедиев сказал:

Вот именно деление заменили сдвигом!

ну ты же когда число делишь кажем на 1000 , просто сдвигаешь запятую влево на три цифры , а если деление без остатка просто три последние цифры зачеркиваются ....

Ссылка на комментарий
Поделиться на другие сайты

Не разбираюсь в АЦП) Ни когда не использовал, хочу сделать осциллограф, нашел вариант на AD9280, мк будет STM32f103 думаю, есть ли смысл эту микросхему брать? Или лучше в самом МК использовать АЦП?

Ссылка на комментарий
Поделиться на другие сайты

А сам STM32 не сможет такой поток переварить, поэтому смысла нет. Только разве что вариант с внешней буфферной памятью + ПЛИС управляющая памятью и работой АЦП, а контроллер после захвата с целовеческой скоростью может переработать захваченные данные и отобразить на дисплее.

Хотя конечно извернутся можно, на максимальной скорости, с применением DMA... но памяти встроенной по прежнему мало, с алиасингом потом бороться....

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

в общем задумка такая. с помощью этой функции получать значение value

unsigned int ADC_convert(void)
{
	static unsigned int ADC_value;//переменная суммы измерений
	static unsigned char count;//переменная суммы количества измерений
	ADC_value+=ADCW;//складываем ADCW 64раза
	if (count==64)//если прошло 64 измерения
	{
		unsigned int value;
		ADC_value>>=6;//расчитываем среднее значение побитовым сдвигом
		value=(ADC_value*500L)>>10;//получаем значение напряжения при он 5,00 вольт L-означает 
		//что хотим получить в 32 битах, >>10 сдвинув на 10 получим 16бит
	} 
	else
	{
		count++;//делаем следующий замер
	}
}

затем выводить его на экран с помощью этой функции (в ней могут быть ошибки)

void lcd_num_to_str(unsigned int value)
{
	ADC_convert(value);
	lcd_data((value/1000)+'0');
	lcd_data(((value/100)%10)+'0');
	lcd_data(((value/10)%10)+'0');
	lcd_data((value%10)+'0');
}

ну и в конце хочу выводить в строку. при этом задавать состояние регистров ADMUX. т.е. с какого порта ADC  считывать

while (1) 
    {
		lcd_num_to_str("volt");
		lcd_num_to_str("amper");
    }
#define volt ADMUX|=(1<<MUX2)|(1<<MUX0);ADMUX&=~((1<<MUX1)|(1<<MUX3));
#define amper ADMUX|=(1<<MUX2);ADMUX&=~((1<<MUX0)|(1<<MUX1)|(1<<MUX3));

фуф сформулировал вопрос

Ссылка на комментарий
Поделиться на другие сайты

Я когда-то написал небольшую статью о нисходящем программировании https://simple-devices.ru/articles/7-soft/208-2014-05-20-16-40-05 почитайте. Там, правда, после смены движка сайта врезки кода стали уродскими, но понть при желании, что к чему, можно. Думаю, вам поможет...

В вашем же примере функция ADC_convert не принимает параметра, хотя далее вы ей пытаетесь его передавать. Кроме того, вы забыли, что после того, как отработали ситуацию count==64, этот самый count надо обнулять, как и сумму, иначе нескоро вы получите следующий раз корректные значения.

19 минут назад, Дмитрий Мамедиев сказал:

фуф сформулировал вопрос

Вопрос завершается вопросительным знаком, а у вас его нет :) Так что сложно понять, что именно вы хотите от сообщества...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Прочитал статью, но... сложность в орфографии. Т.е. как писать правильно, как оформлять функции, как обьявить дефайны. Вот сложность сейчас с выводом числа. То как происходит деление и получаем тысячи- сотни- десятки -единицы, мне ясно но как оформить в функции и как потом применить....

Ссылка на комментарий
Поделиться на другие сайты

Смотри как оформалено у других, так и делай. Примеры всякие.

Среднее число это конечно хорошо но этого недостаточно, это избавит от кратковременных пиков, не более, а результат всеравно будет прыгать. Для вольтметров/амперметров применяют алгоритм скользящего окна, о котором я и говорил. Для этого нужно в памяти сохранять N последних измерений, и каждое измерение просчитывать среднее по всем N.
У вас оно сейчас как работает? Набрали 64 результата, упаковали и на выход, набрали следующие упаковали и на выход... 128 измерений и всего 2 результата. Подвижное окно работает совсем по другому - измерили, поместили в массив, посчитали среднее от 64 элементов и на выход, измерили, поместили в массив, посчитали среднее и на выход... на 64 измерения 64 результата. Но цифра 64 в принципе достаточно избыточна, окно в 64 ячейки способно сгладить в ноль шум с равномерным распределением в сигнале до 64 единиц, такое наверно редко бывает. Но и инерционность выхода при этом будет в 64 семпла. т.е. если измерять с частотой 100Гц, то на выходе значение устанавливаться будет 0.6 секунд примерно. Как большая стрелка аналогового прибора.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

8 часов назад, Дмитрий Мамедиев сказал:

затем выводить его на экран с помощью этой функции

Дмитрий, буквально две-три станицы назад ты приводил/использовал библиотечные функции вывода строки на лсд , теперь изобретаешь новые к тому же кривые, вопрос зачем? я тебе привел код который показания АЦП переводит в строку. все что нужно было сделать: вызвать конвертацию, указать положение курсора и вывести строку.

ADC_convert(); // перевод АЦП в строку
lcd_goto(pos); // pos -  положение первого символа строки
lcd_string(buffer); // вывод строки 

вместо этого увеличил время обновления показаний введя математику в функцию вывода символа и  испоганил функцию конвертирования, зачем?

 

 

Ссылка на комментарий
Поделиться на другие сайты

unsigned char buffer[5]={'0','0',',','0','0'};

буфер unsigned а строка const

void lcd_string (const char str1[])
{
	wchar_t n;
	for(n=0;str1[n]!='\0';n++)
	lcd_data(str1[n]);
}

компилятор матерится. как это исправить. 

Ссылка на комментарий
Поделиться на другие сайты

30 минут назад, Дмитрий Мамедиев сказал:

как это исправить. 

Прочитать наконец книгу например Бьерна Страуструпа, которую я Вам советовал пару месяцев назад. Это занимает пару дней)

Ссылка на комментарий
Поделиться на другие сайты

57 минут назад, Дмитрий Мамедиев сказал:

как это исправить. 

итить что это? где вы взяли эту функцию???? эта функция не может нормально работать по определению. на момент вызова функция не может знать размер передаваемого строки/массива следовательно не может создать массив нужного размера. эта функция должна работать через передачу указателя на массив. типа:


/* write a string of chars to the LCD */
void lcd_puts(const char * s)
{
	LCD_RS = 1;	// write characters
	while(*s)
		lcd_write(*s++);
}

 

и еще , вы  копировать копировать текст не умеете? каким образом массив

unsigned char Buffer[5]={'0',',','0','0',0};

превратился в

unsigned char buffer[5]={'0','0',',','0','0'};

?????

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...