Значит предупреждения у тебя включены по дефолту. Типы данных включаются в stdint.h. Я специально привёл пример с разными типами. Обрати внимание на компилятор.
OKF, по твоей картинке я все равно ничего не понимаю про твой компилятор. у меня для разных типов чисел не нужно подключать никакой заголовочный файл, ни для целых, ни для "плавающих". а если есть в программе математические функции (возведение в степень, синус и т.п.), то для них подключается свой заголовок. ты мне в личке давал тестовый текст, так там подключен был только stdlib.h, и никаких подключений для типов чисел там нет, и "флотский" тип там работал.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
В многообразии литиевых батареек и аккумуляторов нет какого-то универсального или идеального варианта. Выбирая тот или иной вариант для питания устройства, разработчику приходится оперировать множеством параметров, используя наиболее оптимальное их сочетание для каждого приложения. Разберем параметры для различных приложений.
Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. EVE является поставщиком аккумуляторных элементов круглого формата для электрических моделей автомобилей.
Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного.
Starichok51, Исправил везде "t=(uint8_t)(sin(1.57/descr1*i)*Amp)", t объявил uint8_t , ничего не изменилось. descr1 = (uint16_t)(120 * exp(freq / 341.0)). Поэкспериментировал: 120 заменил на 190 чтобы срезать высокие частоты (столько не нужно), 341 заменил на 600, регулировка стала более плавной. Так можно делать?
Добавлено after 6 minutes 5 seconds: И почти в самом конце регулятора, чуток не доходя до максимума, какой-то "всплеск" - частота подскакивает почти до максимума, амплитуда тоже. Как будто в резонанс входит, дальше кручу резистор- всё нормализуется и до конца всё нормально.
да, так можно и даже нужно делать, чтобы управлять максимальной и минимальной частотой. вернулся я домой из гостей и провел анализ в атмел студио 7.0. никакого криминала в расчетах, приводящего к подобным сбоям в частоте и амплитуде я не нашел. то есть, я совершенно не вижу причины скачка частоты и нарушения амплитуды. поэтому я могу даже допустить появления резонанса механической системы. но проверить каждое значение freq от 0 до 1023 - это практически не реально. к тому же, из-за недостатка ОЗУ невозможно создать большие массивы, чтобы по массиву просмотреть все получаемые значения синуса. посмотрел я экспоненту в массиве из 256 значений (4 варианта freq от 0 до 1023) - всё замечательно. посмотрел для нескольких конкретных значений переменной descr1 в расчете кусочков синуса - тоже сбоев не нашел. могу еще проверить через большие массивы в программе для компа, где ограничения размеров массивов практически нет. если все таки есть такая причина, я думаю, что она должна проявиться и в программе на компе.
НО! нашел одно существенное упрощение в расчетах. поскольку (1 - k) + k = 1, обе формулы расчета нарастания и спада синуса можно объединить смело. цикл получится такой: //1 полуволна for (uint16_t i = (descr1 * (1 - k)); i < (descr1 * (1 - k)) + descr1; i++) { t=sin(1.5708 * i / descr1) * Amp; // считаем синус... PWM1(t); } фактически это "сумма" обеих формул (нарастание + спад). по прежнему descr1 * (1 - k) определяет начало синуса, а "длину" кусочка синуса определят величина descr1. для второй полуволны точно эта же формула, только PWM2(t) вместо PWM1(t).
Добавлено after 3 minutes 53 seconds: да, ещё я убедился, что в атмел студио можно не делать приведение типов данных, то есть, для t писать (uint8_t) не нужно, и для descr1 писать (uint16_t) тоже не нужно.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
выкинуть деление на descr1 вполне можно, так как переменная цикла может быть с плавающей точкой. тогда получится так: for (float i = 1 - k; i < 2 - k; i += 1.0 / descr1) { t=sin(1.5708 * i) * Amp; // считаем синус... PWM1(t); } но частота без операции деления при этом немного возрастет, и придется немного увеличить коэффициент в расчете экспоненты. и еще можно добавить смело знак равенства: for (float i = 1 - k; i <= 2 - k; i += 1.0 / descr1) {
Добавлено after 2 hours 25 minutes 22 seconds: и еще у меня есть одно предложение. при малых значениях freq там получается для descr1 по несколько одинаковых значений. да и вообще не нужно иметь 1024 значения частоты. я предлагаю число ступенек частоты сократить до 64. это получается так: int freq = ADCread(7) / 16; а формула для descr1 получится такая: descr1 = 190 * exp(freq / 35.0); при этом частота будет изменяться в 6 раз.
Добавлено after 23 minutes 20 seconds: Varlakotam, после сокращения числа ступеней частоты я ожидаю, что уйдет тот участок значений descr1, где наблюдается срыв в работе, а после этого участка восстанавливается нормальная работа. я бы даже сократил число ступеней частоты до 16. я думаю, что этого вполне хватило бы. тогда будут такие формулы: int freq = ADCread(7) / 64; descr1 = 190 * exp(freq / 8.0); при этом частота будет изменяться в 6,5 раз.
Добавлено after 2 hours 52 minutes 50 seconds: прозевал я тогда, когда сказал про (1 - k) + k = 1. там относительно 1 должно быть симметрично. for (uint16_t i =descr * (1 - k); i <= descr * (1 + k); i++) { t = sin(1.5708 * i / descr1) * Amp; PWM1(t); } или с плавающей точкой: for (float i = 1 - k; i <= 1 + k; i += 1.0 / descr1) { t = sin(1.5708 * i) * Amp; PWM1(t); }
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Varlakotam, замени переменный резистор, который по частоте. к вычислениям претензий нет и быть не может. там просто могут быть обрывы контакта с ползунком.
Добавлено after 1 hour 2 minutes 44 seconds: еще поменяй местами провода на краях переменного резистора, тогда у тебя влево до упора будет минимальная частота и с поворотом частота будет расти. и если там есть обрывы контакта, то сбой частоты должен быть в том же положении резистора.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Starichok51, спасибо! Резистор менял, они у меня даже не паянные, лет 40 лежали без дела. Со стороны железа всё проверено. На выходных попробую формулы поменять.
тогда такой срыв мне не понятен. как я уже сказал, к вычислениям (формулам) у меня претензий нет. а как ты собираешься менять формулы? сократить число ступенек частоты, как я предложил, ты не пробовал?
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Starichok51, именно это и собираюсь сделать- сократить число ступенек
Добавлено after 3 minutes 10 seconds: поменял на for (float i = 1 - k; i <= 1 + k; i += 1.0 / descr1) { t = sin(1.5708 * i) * Amp; PWM1(t);колебания стали "сдвоенными"
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения